From eb28a274322f92fb244e90b57ec83a47a36745dc Mon Sep 17 00:00:00 2001 From: trixoniisama <93526043+trixoniisama@users.noreply.github.com> Date: Thu, 14 Nov 2024 03:19:56 +0100 Subject: [PATCH] Deploy website - based on dcf747358591c5b34537152f44b2db9c588c85a5 --- .DS_Store | Bin 8196 -> 0 bytes 404.html | 8 +- ...tyles.6ca912c1.css => styles.93aec407.css} | 2 +- ...case-3902fce14e72fc094b637b526525a24e.webp | Bin 0 -> 981890 bytes assets/js/0092d9fd.442daa5c.js | 1 + assets/js/0092d9fd.e1425c83.js | 1 - assets/js/015d9d66.c465fc5f.js | 1 + assets/js/015d9d66.caaa4d35.js | 1 - assets/js/01a85c17.1d323d33.js | 1 + assets/js/01a85c17.ee34b9e6.js | 1 - assets/js/03af419f.15f9e88f.js | 1 + assets/js/03af419f.85fed8d0.js | 1 - assets/js/03e95fdf.2b32f9af.js | 1 + assets/js/03e95fdf.a11034af.js | 1 - assets/js/04dda763.032833c7.js | 1 - assets/js/04dda763.11381acb.js | 1 + assets/js/059e36ab.6366493b.js | 1 + assets/js/059e36ab.6cb6d2de.js | 1 - assets/js/06ed4e86.3d735a2d.js | 1 - assets/js/06ed4e86.ef80a140.js | 1 + assets/js/09a8bfdb.0ac1b2f1.js | 1 + assets/js/09a8bfdb.8aa625b6.js | 1 - assets/js/09bc817a.5dc095ed.js | 1 - assets/js/09bc817a.aa76edbd.js | 1 + assets/js/0b185270.32f1c719.js | 1 - assets/js/0b185270.a6fb6998.js | 1 + assets/js/0c06159a.64876cab.js | 1 + assets/js/0c06159a.b22e0c76.js | 1 - assets/js/0e7f53a8.b1806df5.js | 1 + assets/js/0e7f53a8.cffc0ef3.js | 1 - assets/js/112763a5.7878550e.js | 1 + assets/js/112763a5.ca0b41a6.js | 1 - assets/js/12b076f3.9eb621f4.js | 1 - assets/js/12b076f3.dfbfac79.js | 1 + assets/js/12df3b9e.1600344c.js | 1 - assets/js/12df3b9e.e4979bf4.js | 1 + ...96441.bdec4053.js => 17896441.bf78c8e6.js} | 2 +- assets/js/1817a557.1b2310b8.js | 1 + assets/js/1817a557.3a6bc166.js | 1 - assets/js/1a4e3797.cda3983d.js | 1 - assets/js/1a4e3797.d404ecd5.js | 1 + assets/js/1b67d0f3.0ca1c00b.js | 1 - assets/js/1b67d0f3.e7a07eba.js | 1 + assets/js/1ca2b1db.4791e151.js | 1 + assets/js/1ca2b1db.db972dc4.js | 1 - assets/js/1e5c3f00.2a7a8f17.js | 1 + assets/js/1e5c3f00.e810230c.js | 1 - assets/js/1ec3ce74.4bbbc046.js | 1 + assets/js/1ec3ce74.4c398aa5.js | 1 - assets/js/1f391b9e.62f4d628.js | 1 + assets/js/1f391b9e.6ff12782.js | 1 - assets/js/1fabe0bd.354553d0.js | 1 + assets/js/1fabe0bd.70077be9.js | 1 - assets/js/20d769d8.6b62af69.js | 1 + assets/js/20d769d8.fc1bbd1d.js | 1 - .../js/{2237.71567272.js => 2237.b2c1d41b.js} | 2 +- assets/js/229f7513.1144a374.js | 1 + assets/js/229f7513.a0a2f53f.js | 1 - assets/js/28bd9d7a.26846548.js | 1 - assets/js/28bd9d7a.e2593808.js | 1 + assets/js/299beccc.bd5fb890.js | 1 + assets/js/299beccc.de7d8920.js | 1 - assets/js/2d25ac87.12cde25d.js | 1 - assets/js/2d25ac87.ad88e0da.js | 1 + assets/js/2e23a845.60b30d51.js | 1 + assets/js/2e23a845.996efb55.js | 1 - assets/js/2f08935f.fb7954df.js | 1 + assets/js/2fcb10cd.4dab5d96.js | 1 + assets/js/2fcb10cd.5be239c1.js | 1 - assets/js/318608aa.25b04195.js | 1 - assets/js/318608aa.d1f8abdb.js | 1 + assets/js/32987299.8275d921.js | 1 + assets/js/32987299.bfa90a0c.js | 1 - assets/js/345ef4f9.8c99b56f.js | 1 - assets/js/345ef4f9.9192bd69.js | 1 + assets/js/37c719d6.704969fd.js | 1 - assets/js/37c719d6.da20abad.js | 1 + assets/js/3a2db09e.17e906d8.js | 1 + assets/js/3a2db09e.1d6d5d92.js | 1 - assets/js/3d6cf458.13b149a4.js | 1 + assets/js/3d6cf458.ade3502e.js | 1 - assets/js/43624f55.62b1a6b4.js | 1 + assets/js/43624f55.f9414b4d.js | 1 - assets/js/44e37655.804c7bd9.js | 1 - assets/js/44e37655.8123b1c7.js | 1 + assets/js/45f4020c.350d0fe8.js | 1 + assets/js/45f4020c.7ec68f38.js | 1 - ...a109f.87b8ee9a.js => 467a109f.53fb113a.js} | 2 +- assets/js/489.ac3cadbd.js | 2 - assets/js/489.d07863ea.js | 2 + ...ICENSE.txt => 489.d07863ea.js.LICENSE.txt} | 0 assets/js/48b7ca01.46746df6.js | 1 - assets/js/48b7ca01.58594b7d.js | 1 + assets/js/49b64d14.085e8d06.js | 1 + assets/js/49b64d14.988cf361.js | 1 - assets/js/4c678320.27764c57.js | 1 - assets/js/4c678320.9f702fca.js | 1 + assets/js/4d877b09.678d5b0a.js | 1 - assets/js/4d877b09.a91cf442.js | 1 + assets/js/522a92e3.e4040f88.js | 1 + assets/js/522a92e3.f4ebdf35.js | 1 - assets/js/54a9c2bb.b8726434.js | 1 - assets/js/54a9c2bb.c7a9d911.js | 1 + assets/js/56786013.cc044280.js | 1 + assets/js/56786013.f7d5bf56.js | 1 - assets/js/59e6fde5.7808e7d7.js | 1 - assets/js/59e6fde5.f0729976.js | 1 + assets/js/5b209502.05910955.js | 1 - assets/js/5b209502.143acbf3.js | 1 + assets/js/5d1a7e8b.69e46796.js | 1 - assets/js/5d1a7e8b.761e5644.js | 1 + assets/js/5db6705b.a12c34f2.js | 1 + assets/js/5db6705b.ec6b9e18.js | 1 - assets/js/5e069031.36e9153e.js | 1 + assets/js/5e069031.5d8abc53.js | 1 - assets/js/5e1194df.03677b01.js | 1 - assets/js/5e1194df.0c61c810.js | 1 + assets/js/5e95c892.15681440.js | 1 + assets/js/5e95c892.7ef37dfe.js | 1 - assets/js/5ec46d54.267e3e91.js | 1 + assets/js/5ec46d54.e5f80521.js | 1 - assets/js/5f74c797.5a891c89.js | 1 - assets/js/5f74c797.aea89002.js | 1 + .../js/{6256.71aff5ef.js => 6256.73278753.js} | 4 +- ...CENSE.txt => 6256.73278753.js.LICENSE.txt} | 0 assets/js/632d0ef1.0eedb755.js | 1 + assets/js/632d0ef1.ef33279f.js | 1 - assets/js/6549b2b5.a78520af.js | 1 - assets/js/6549b2b5.f1203cf0.js | 1 + assets/js/65524f4d.62b7f26f.js | 1 + assets/js/65524f4d.892c1f47.js | 1 - assets/js/68dcf780.91c3ce2d.js | 1 - assets/js/68dcf780.a29fdadd.js | 1 + assets/js/6bf0f114.ae960720.js | 1 - assets/js/6bf0f114.b3af70b8.js | 1 + assets/js/6c179ac5.d6e485fd.js | 1 + assets/js/6c179ac5.ef042d18.js | 1 - assets/js/6d85920a.576f4705.js | 1 - assets/js/6d85920a.6e752d07.js | 1 + assets/js/70006292.b08b43f4.js | 1 - assets/js/70006292.c60b7b8c.js | 1 + assets/js/70de1c07.0b62591d.js | 1 - assets/js/70de1c07.4df884f7.js | 1 + assets/js/7385c97b.052a7324.js | 1 - assets/js/7385c97b.9ee263a4.js | 1 + assets/js/75936cdf.b36d710c.js | 1 - assets/js/75936cdf.f2d00a0a.js | 1 + assets/js/76096a15.2d7f04b6.js | 1 - assets/js/76096a15.f48bc36b.js | 1 + assets/js/7d09a242.ce991e50.js | 1 - assets/js/7d09a242.fce803dc.js | 1 + assets/js/7eff0f1a.47606ae6.js | 1 - assets/js/7eff0f1a.9a5d601b.js | 1 + assets/js/7f76a12e.4b9d38ae.js | 1 - assets/js/7f76a12e.e417c56d.js | 1 + assets/js/7fa695a7.4039b6b8.js | 1 - assets/js/7fa695a7.ac5844c6.js | 1 + assets/js/80447496.2ec80bc4.js | 1 - assets/js/80447496.ea6304c4.js | 1 + assets/js/80bfa96b.cd5df282.js | 1 + assets/js/80bfa96b.e5d4b132.js | 1 - assets/js/814f3328.39af2631.js | 1 + assets/js/814f3328.ba8e6fdd.js | 1 - assets/js/81739261.b57112ee.js | 1 + assets/js/81739261.ec5a3f1a.js | 1 - assets/js/83732ada.0732b040.js | 1 - assets/js/83732ada.1017b5ad.js | 1 + assets/js/841b1305.347f21bf.js | 1 + assets/js/841b1305.92aedeb8.js | 1 - assets/js/842a7beb.3c1f9079.js | 1 - assets/js/842a7beb.f5e11ae0.js | 1 + assets/js/84e198a2.18879c5b.js | 1 + assets/js/84e198a2.91ffddfe.js | 1 - assets/js/86ba2311.85a01566.js | 1 + assets/js/86ba2311.bdcf75f1.js | 1 - assets/js/8793.6c976fe1.js | 1 - assets/js/8793.ddc5836a.js | 1 + assets/js/8a894f7b.61cfc55c.js | 1 + assets/js/8a894f7b.ed44ed07.js | 1 - assets/js/8aacd032.7172a8bf.js | 1 + assets/js/8aacd032.b71489f2.js | 1 - assets/js/8bdabb45.7ff3db00.js | 1 - assets/js/8bdabb45.ddb8e58e.js | 1 + assets/js/8eb2df80.1b3bf215.js | 1 + assets/js/8eb2df80.251d8abd.js | 1 - assets/js/8ee2fdd1.82e49d7c.js | 1 + assets/js/8ee2fdd1.a6b4589f.js | 1 - assets/js/8f6f5e4c.428525cb.js | 1 - assets/js/8f6f5e4c.7fa5ae9c.js | 1 + assets/js/9060e84a.4d74a2c8.js | 1 - assets/js/9060e84a.d53e734a.js | 1 + assets/js/90aedb84.6dac006e.js | 1 - assets/js/90aedb84.99d3ef73.js | 1 + assets/js/915a111c.13149dda.js | 1 + assets/js/915a111c.2e85eec2.js | 1 - assets/js/939f23de.2a2acb57.js | 1 + assets/js/939f23de.7f243198.js | 1 - assets/js/94782d2d.2e40e9e1.js | 1 + assets/js/94782d2d.d31eacaa.js | 1 - assets/js/95e9a4c5.9c25a70f.js | 1 - assets/js/95e9a4c5.df3995e7.js | 1 + assets/js/998d107e.6cbdd3c4.js | 1 - assets/js/998d107e.e90e9e41.js | 1 + assets/js/99c26446.557aea50.js | 1 + assets/js/99c26446.f67ebc66.js | 1 - assets/js/9ba56b79.c96a2fc2.js | 1 + assets/js/9ba56b79.fa7dee29.js | 1 - assets/js/9c171e5c.2ae1657d.js | 1 + assets/js/9c171e5c.30eddb11.js | 1 - assets/js/9cae5962.1ac861f4.js | 1 - assets/js/9cae5962.7f6f0663.js | 1 + assets/js/9e4087bc.ba0deb5f.js | 1 - assets/js/9e4087bc.c688eee8.js | 1 + assets/js/9efd8a4a.4d2af715.js | 1 + assets/js/9efd8a4a.99078227.js | 1 - assets/js/9f640ee8.37d95ba0.js | 1 + assets/js/9f640ee8.7839ab16.js | 1 - assets/js/9f709603.998a2a99.js | 1 + assets/js/9f709603.a689513c.js | 1 - assets/js/a8f610c9.46a9e8d4.js | 1 - assets/js/a8f610c9.d16485c4.js | 1 + ...3ff15.cf26fcc3.js => aaf3ff15.38a05c5b.js} | 2 +- assets/js/acf4709b.71ce111a.js | 1 + assets/js/acf4709b.e19f1737.js | 1 - assets/js/afe5e22f.4194e0a2.js | 1 - assets/js/afe5e22f.cb896c65.js | 1 + assets/js/b0535000.242a35de.js | 1 + assets/js/b0535000.5c531d67.js | 1 - assets/js/b0839e7f.4fcf9a59.js | 1 + assets/js/b261517a.eec96f03.js | 1 - assets/js/b261517a.f7731431.js | 1 + assets/js/b4030b4d.7c070528.js | 1 + assets/js/b4030b4d.d3034021.js | 1 - assets/js/b4bbde8e.8982fcc9.js | 1 + assets/js/b4bbde8e.a30040d0.js | 1 - assets/js/b59b8cf7.43a6a0c1.js | 1 - assets/js/b59b8cf7.ac260982.js | 1 + assets/js/b8af02bf.68d91565.js | 1 - assets/js/b8af02bf.6bd5e392.js | 1 + assets/js/bb17976f.a0392243.js | 1 + assets/js/bb17976f.d85080c7.js | 1 - assets/js/bc32b9c5.a0a9d727.js | 1 + assets/js/bc32b9c5.ea617b31.js | 1 - assets/js/bd173b27.2ce9d3ca.js | 1 + assets/js/bd173b27.fb7135b6.js | 1 - assets/js/be236901.1119a8ec.js | 1 - assets/js/be236901.b34449f2.js | 1 + assets/js/bf9d09b6.3ec2a4e8.js | 1 - assets/js/bf9d09b6.c0b10498.js | 1 + ...d9823.62f9ce37.js => c15d9823.5567b29d.js} | 2 +- assets/js/c19fbcae.26a90190.js | 1 - assets/js/c19fbcae.9b91b544.js | 1 + assets/js/c224274c.8ac21b1d.js | 1 + assets/js/c224274c.ebb6a550.js | 1 - assets/js/c4f5d8e4.570c464d.js | 1 + assets/js/c4f5d8e4.771b41be.js | 1 - assets/js/c7deb2e0.0c155dde.js | 1 + assets/js/c7deb2e0.2f90776e.js | 1 - assets/js/c92fe796.26342a37.js | 1 - assets/js/c92fe796.dd492aca.js | 1 + assets/js/c943a24a.3e2e52c2.js | 1 + assets/js/c943a24a.7eb67860.js | 1 - assets/js/ccc49370.53a4f211.js | 1 + assets/js/ccc49370.847a3819.js | 1 - assets/js/cce09ffa.29842373.js | 1 - assets/js/cce09ffa.c2a08b45.js | 1 + assets/js/cd6cf5b7.b06d844d.js | 1 - assets/js/cd6cf5b7.f8a17d72.js | 1 + assets/js/ce98a713.462c84fe.js | 1 - assets/js/ce98a713.d6f37062.js | 1 + assets/js/cf7588c6.8e6af6c6.js | 1 + assets/js/cf7588c6.f946bb2a.js | 1 - assets/js/d1becb09.34b1a05b.js | 1 - assets/js/d1becb09.9b3996b0.js | 1 + assets/js/d337df6f.4e231f7b.js | 1 + assets/js/d337df6f.b45bda30.js | 1 - assets/js/d5ab79da.1faa483d.js | 1 + assets/js/d5ab79da.7a6ccdeb.js | 1 - assets/js/d5f89569.2c8d20a5.js | 1 + assets/js/d5f89569.f9fcd397.js | 1 - assets/js/d6535278.94e0b22c.js | 1 - assets/js/d6535278.e9ffe8cd.js | 1 + assets/js/d96727fd.0433b868.js | 1 + assets/js/d96727fd.3aace257.js | 1 - assets/js/ddce1156.112d455b.js | 1 - assets/js/ddce1156.a807cbdd.js | 1 + assets/js/e157395a.207bb473.js | 1 + assets/js/e157395a.b8778f91.js | 1 - assets/js/e1a437f7.415b8f79.js | 1 - assets/js/e1a437f7.50b0acba.js | 1 + assets/js/e1c48702.31de42f4.js | 1 - assets/js/e1c48702.b987ce2c.js | 1 + ...da66d.7bf505ce.js => e33da66d.97d80f76.js} | 2 +- assets/js/e3b00369.068a46ff.js | 1 - assets/js/e3b00369.6a6f7366.js | 1 + assets/js/e641ee58.05299a4b.js | 1 - assets/js/e641ee58.c64968a6.js | 1 + assets/js/edaea366.3a139970.js | 1 + assets/js/edaea366.d4254e2a.js | 1 - assets/js/ee513c31.027b1fe5.js | 1 - assets/js/ee513c31.57d08833.js | 1 + assets/js/ee8c27e3.1c988f9b.js | 1 - assets/js/ee8c27e3.bedb0161.js | 1 + assets/js/f4fea690.cf767130.js | 1 + assets/js/f4fea690.d2c6d21a.js | 1 - assets/js/f81c1134.0751ef83.js | 1 + assets/js/f81c1134.c4783553.js | 1 - assets/js/f9208490.ac89ffd0.js | 1 + assets/js/f9208490.f2bf03d7.js | 1 - assets/js/fb02bab9.573df022.js | 1 + assets/js/fb02bab9.88092581.js | 1 - assets/js/fda0af90.0cdab8f6.js | 1 + assets/js/fda0af90.cf56670d.js | 1 - assets/js/main.0d7a5f66.js | 2 - assets/js/main.1137f990.js | 2 + ...CENSE.txt => main.1137f990.js.LICENSE.txt} | 0 assets/js/runtime~main.9de56483.js | 1 + assets/js/runtime~main.f3ff2a54.js | 1 - blog.html | 12 +- blog/archive.html | 10 +- blog/atom.xml | 499 ++++++++++++++++- blog/av1-encoding-for-dummies.html | 10 +- blog/av1-for-dummies.html | 12 +- blog/codec-wiki-one-year-later.html | 12 +- blog/embedding-the-un-embeddable.html | 10 +- blog/rss.xml | 495 ++++++++++++++++- blog/site-optimization.html | 10 +- blog/svt-av1-deep-dive.html | 10 +- blog/svt-av1-second-deep-dive.html | 10 +- blog/svt-av1-third-deep-dive.html | 505 ++++++++++++++++++ blog/tags.html | 10 +- blog/tags/anniversary.html | 10 +- blog/tags/benchmarks.html | 12 +- blog/tags/compression.html | 12 +- blog/tags/discord.html | 10 +- blog/tags/history.html | 10 +- blog/tags/image.html | 10 +- blog/tags/video.html | 12 +- blog/tags/web.html | 10 +- docs/FAQ.html | 8 +- docs/audio/AAC.html | 8 +- docs/audio/ALAC.html | 8 +- docs/audio/Dolby.html | 8 +- docs/audio/FLAC.html | 8 +- docs/audio/MP3.html | 8 +- docs/audio/Opus.html | 8 +- docs/audio/Speex.html | 8 +- docs/audio/Vorbis.html | 19 +- docs/audio/WavPack.html | 8 +- docs/audio/intro.html | 8 +- docs/colorimetry/format.html | 8 +- docs/colorimetry/intro.html | 8 +- docs/colorimetry/matrix.html | 8 +- docs/colorimetry/primaries.html | 8 +- docs/colorimetry/range.html | 8 +- docs/colorimetry/transfer.html | 8 +- docs/contribution-guide.html | 8 +- docs/data/7z.html | 10 +- docs/data/brotli.html | 8 +- docs/data/bzip2.html | 8 +- docs/data/gzip.html | 16 +- docs/data/tar.html | 10 +- docs/data/xz.html | 8 +- docs/data/zip.html | 8 +- docs/data/zpaq.html | 8 +- docs/data/zstd.html | 8 +- docs/encoders/AVM.html | 8 +- docs/encoders/Aurora1.html | 8 +- docs/encoders/HM.html | 8 +- docs/encoders/JM.html | 8 +- docs/encoders/Kvazaar.html | 8 +- docs/encoders/SVT-AV1-PSY.html | 8 +- docs/encoders/SVT-AV1.html | 8 +- docs/encoders/SVT-HEVC.html | 8 +- docs/encoders/SVT-VP9.html | 8 +- docs/encoders/VTM.html | 8 +- docs/encoders/VVenC.html | 8 +- docs/encoders/aom-av1-lavish.html | 8 +- docs/encoders/aom-psy101.html | 8 +- docs/encoders/aomenc.html | 8 +- docs/encoders/rav1e.html | 8 +- docs/encoders/uavs3e.html | 8 +- docs/encoders/uvg266.html | 8 +- docs/encoders/vpxenc.html | 12 +- docs/encoders/x264.html | 8 +- docs/encoders/x265.html | 8 +- docs/encoders/x266.html | 10 +- docs/encoders_hw/amf.html | 8 +- docs/encoders_hw/mediacodec.html | 8 +- docs/encoders_hw/nvenc.html | 8 +- docs/encoders_hw/qsv.html | 8 +- docs/encoders_hw/videotoolbox.html | 8 +- docs/filtering/antialiasing.html | 8 +- docs/filtering/basics.html | 8 +- docs/filtering/deband.html | 8 +- docs/filtering/decombing.html | 8 +- docs/filtering/dehalo.html | 8 +- docs/filtering/deinterlace.html | 8 +- docs/filtering/denoise.html | 8 +- docs/filtering/graining.html | 8 +- docs/filtering/ivtc.html | 8 +- docs/filtering/stabilizing.html | 8 +- docs/filtering/vapoursynth.html | 8 +- docs/images/AVIF.html | 8 +- docs/images/GIF.html | 8 +- docs/images/HEIC.html | 8 +- docs/images/JPEG.html | 8 +- docs/images/JPEG2000.html | 8 +- docs/images/JXL.html | 8 +- docs/images/PNG.html | 8 +- docs/images/QOI.html | 8 +- docs/images/WebP.html | 8 +- docs/introduction/high-dynamic-range.html | 8 +- docs/introduction/lossless.html | 8 +- docs/introduction/lossy.html | 8 +- docs/introduction/prologue.html | 8 +- docs/introduction/psychovisual.html | 8 +- docs/introduction/terminology.html | 8 +- docs/introduction/video-artifacts.html | 8 +- docs/metrics/PSNR.html | 8 +- docs/metrics/SSIM.html | 8 +- docs/metrics/SSIMULACRA2.html | 8 +- docs/metrics/VMAF.html | 8 +- docs/metrics/XPSNR.html | 8 +- docs/metrics/butteraugli.html | 8 +- docs/privacy-policy.html | 8 +- docs/resources.html | 8 +- docs/subtitles/SRT.html | 8 +- docs/subtitles/SSA.html | 8 +- docs/subtitles/webvtt.html | 8 +- docs/terms-of-use.html | 8 +- docs/utilities/Aviator.html | 8 +- docs/utilities/Discord.html | 8 +- docs/utilities/FFMetrics.html | 8 +- docs/utilities/MKVToolNix.html | 8 +- docs/utilities/YUView.html | 8 +- docs/utilities/autocompressor.html | 8 +- docs/utilities/av1an-command-gen.html | 8 +- docs/utilities/av1an.html | 8 +- docs/utilities/dovi_tool.html | 8 +- docs/utilities/eac3to.html | 8 +- docs/utilities/ffmpeg.html | 8 +- docs/utilities/hdr10plus_tool.html | 8 +- docs/utilities/mp4box.html | 8 +- docs/utilities/nmkoder.html | 8 +- docs/utilities/rAV1ator.html | 8 +- docs/utilities/rav1ator-cli.html | 8 +- docs/video-players.html | 8 +- docs/video/AV1.html | 8 +- docs/video/AVC.html | 8 +- docs/video/AVS3.html | 8 +- docs/video/ECM.html | 8 +- docs/video/FFV1.html | 8 +- docs/video/HEVC.html | 8 +- docs/video/Theora.html | 8 +- docs/video/VC-1.html | 8 +- docs/video/VP8.html | 8 +- docs/video/VP9.html | 8 +- docs/video/VVC.html | 8 +- docs/video/prores.html | 8 +- docs/video/utvideo.html | 8 +- fonts/.DS_Store | Bin 6148 -> 0 bytes img/.DS_Store | Bin 10244 -> 0 bytes img/comp_showcase.webp | Bin 0 -> 981890 bytes img/svt-2.2.x-testing-blog-image.webp | Bin 0 -> 81120 bytes index.html | 8 +- markdown-page.html | 8 +- search-index.json | 2 +- search.html | 8 +- sitemap.xml | 2 +- 470 files changed, 2281 insertions(+), 777 deletions(-) delete mode 100644 .DS_Store rename assets/css/{styles.6ca912c1.css => styles.93aec407.css} (56%) create mode 100644 assets/images/comp_showcase-3902fce14e72fc094b637b526525a24e.webp create mode 100644 assets/js/0092d9fd.442daa5c.js delete mode 100644 assets/js/0092d9fd.e1425c83.js create mode 100644 assets/js/015d9d66.c465fc5f.js delete mode 100644 assets/js/015d9d66.caaa4d35.js create mode 100644 assets/js/01a85c17.1d323d33.js delete mode 100644 assets/js/01a85c17.ee34b9e6.js create mode 100644 assets/js/03af419f.15f9e88f.js delete mode 100644 assets/js/03af419f.85fed8d0.js create mode 100644 assets/js/03e95fdf.2b32f9af.js delete mode 100644 assets/js/03e95fdf.a11034af.js delete mode 100644 assets/js/04dda763.032833c7.js create mode 100644 assets/js/04dda763.11381acb.js create mode 100644 assets/js/059e36ab.6366493b.js delete mode 100644 assets/js/059e36ab.6cb6d2de.js delete mode 100644 assets/js/06ed4e86.3d735a2d.js create mode 100644 assets/js/06ed4e86.ef80a140.js create mode 100644 assets/js/09a8bfdb.0ac1b2f1.js delete mode 100644 assets/js/09a8bfdb.8aa625b6.js delete mode 100644 assets/js/09bc817a.5dc095ed.js create mode 100644 assets/js/09bc817a.aa76edbd.js delete mode 100644 assets/js/0b185270.32f1c719.js create mode 100644 assets/js/0b185270.a6fb6998.js create mode 100644 assets/js/0c06159a.64876cab.js delete mode 100644 assets/js/0c06159a.b22e0c76.js create mode 100644 assets/js/0e7f53a8.b1806df5.js delete mode 100644 assets/js/0e7f53a8.cffc0ef3.js create mode 100644 assets/js/112763a5.7878550e.js delete mode 100644 assets/js/112763a5.ca0b41a6.js delete mode 100644 assets/js/12b076f3.9eb621f4.js create mode 100644 assets/js/12b076f3.dfbfac79.js delete mode 100644 assets/js/12df3b9e.1600344c.js create mode 100644 assets/js/12df3b9e.e4979bf4.js rename assets/js/{17896441.bdec4053.js => 17896441.bf78c8e6.js} (98%) create mode 100644 assets/js/1817a557.1b2310b8.js delete mode 100644 assets/js/1817a557.3a6bc166.js delete mode 100644 assets/js/1a4e3797.cda3983d.js create mode 100644 assets/js/1a4e3797.d404ecd5.js delete mode 100644 assets/js/1b67d0f3.0ca1c00b.js create mode 100644 assets/js/1b67d0f3.e7a07eba.js create mode 100644 assets/js/1ca2b1db.4791e151.js delete mode 100644 assets/js/1ca2b1db.db972dc4.js create mode 100644 assets/js/1e5c3f00.2a7a8f17.js delete mode 100644 assets/js/1e5c3f00.e810230c.js create mode 100644 assets/js/1ec3ce74.4bbbc046.js delete mode 100644 assets/js/1ec3ce74.4c398aa5.js create mode 100644 assets/js/1f391b9e.62f4d628.js delete mode 100644 assets/js/1f391b9e.6ff12782.js create mode 100644 assets/js/1fabe0bd.354553d0.js delete mode 100644 assets/js/1fabe0bd.70077be9.js create mode 100644 assets/js/20d769d8.6b62af69.js delete mode 100644 assets/js/20d769d8.fc1bbd1d.js rename assets/js/{2237.71567272.js => 2237.b2c1d41b.js} (79%) create mode 100644 assets/js/229f7513.1144a374.js delete mode 100644 assets/js/229f7513.a0a2f53f.js delete mode 100644 assets/js/28bd9d7a.26846548.js create mode 100644 assets/js/28bd9d7a.e2593808.js create mode 100644 assets/js/299beccc.bd5fb890.js delete mode 100644 assets/js/299beccc.de7d8920.js delete mode 100644 assets/js/2d25ac87.12cde25d.js create mode 100644 assets/js/2d25ac87.ad88e0da.js create mode 100644 assets/js/2e23a845.60b30d51.js delete mode 100644 assets/js/2e23a845.996efb55.js create mode 100644 assets/js/2f08935f.fb7954df.js create mode 100644 assets/js/2fcb10cd.4dab5d96.js delete mode 100644 assets/js/2fcb10cd.5be239c1.js delete mode 100644 assets/js/318608aa.25b04195.js create mode 100644 assets/js/318608aa.d1f8abdb.js create mode 100644 assets/js/32987299.8275d921.js delete mode 100644 assets/js/32987299.bfa90a0c.js delete mode 100644 assets/js/345ef4f9.8c99b56f.js create mode 100644 assets/js/345ef4f9.9192bd69.js delete mode 100644 assets/js/37c719d6.704969fd.js create mode 100644 assets/js/37c719d6.da20abad.js create mode 100644 assets/js/3a2db09e.17e906d8.js delete mode 100644 assets/js/3a2db09e.1d6d5d92.js create mode 100644 assets/js/3d6cf458.13b149a4.js delete mode 100644 assets/js/3d6cf458.ade3502e.js create mode 100644 assets/js/43624f55.62b1a6b4.js delete mode 100644 assets/js/43624f55.f9414b4d.js delete mode 100644 assets/js/44e37655.804c7bd9.js create mode 100644 assets/js/44e37655.8123b1c7.js create mode 100644 assets/js/45f4020c.350d0fe8.js delete mode 100644 assets/js/45f4020c.7ec68f38.js rename assets/js/{467a109f.87b8ee9a.js => 467a109f.53fb113a.js} (68%) delete mode 100644 assets/js/489.ac3cadbd.js create mode 100644 assets/js/489.d07863ea.js rename assets/js/{489.ac3cadbd.js.LICENSE.txt => 489.d07863ea.js.LICENSE.txt} (100%) delete mode 100644 assets/js/48b7ca01.46746df6.js create mode 100644 assets/js/48b7ca01.58594b7d.js create mode 100644 assets/js/49b64d14.085e8d06.js delete mode 100644 assets/js/49b64d14.988cf361.js delete mode 100644 assets/js/4c678320.27764c57.js create mode 100644 assets/js/4c678320.9f702fca.js delete mode 100644 assets/js/4d877b09.678d5b0a.js create mode 100644 assets/js/4d877b09.a91cf442.js create mode 100644 assets/js/522a92e3.e4040f88.js delete mode 100644 assets/js/522a92e3.f4ebdf35.js delete mode 100644 assets/js/54a9c2bb.b8726434.js create mode 100644 assets/js/54a9c2bb.c7a9d911.js create mode 100644 assets/js/56786013.cc044280.js delete mode 100644 assets/js/56786013.f7d5bf56.js delete mode 100644 assets/js/59e6fde5.7808e7d7.js create mode 100644 assets/js/59e6fde5.f0729976.js delete mode 100644 assets/js/5b209502.05910955.js create mode 100644 assets/js/5b209502.143acbf3.js delete mode 100644 assets/js/5d1a7e8b.69e46796.js create mode 100644 assets/js/5d1a7e8b.761e5644.js create mode 100644 assets/js/5db6705b.a12c34f2.js delete mode 100644 assets/js/5db6705b.ec6b9e18.js create mode 100644 assets/js/5e069031.36e9153e.js delete mode 100644 assets/js/5e069031.5d8abc53.js delete mode 100644 assets/js/5e1194df.03677b01.js create mode 100644 assets/js/5e1194df.0c61c810.js create mode 100644 assets/js/5e95c892.15681440.js delete mode 100644 assets/js/5e95c892.7ef37dfe.js create mode 100644 assets/js/5ec46d54.267e3e91.js delete mode 100644 assets/js/5ec46d54.e5f80521.js delete mode 100644 assets/js/5f74c797.5a891c89.js create mode 100644 assets/js/5f74c797.aea89002.js rename assets/js/{6256.71aff5ef.js => 6256.73278753.js} (98%) rename assets/js/{6256.71aff5ef.js.LICENSE.txt => 6256.73278753.js.LICENSE.txt} (100%) create mode 100644 assets/js/632d0ef1.0eedb755.js delete mode 100644 assets/js/632d0ef1.ef33279f.js delete mode 100644 assets/js/6549b2b5.a78520af.js create mode 100644 assets/js/6549b2b5.f1203cf0.js create mode 100644 assets/js/65524f4d.62b7f26f.js delete mode 100644 assets/js/65524f4d.892c1f47.js delete mode 100644 assets/js/68dcf780.91c3ce2d.js create mode 100644 assets/js/68dcf780.a29fdadd.js delete mode 100644 assets/js/6bf0f114.ae960720.js create mode 100644 assets/js/6bf0f114.b3af70b8.js create mode 100644 assets/js/6c179ac5.d6e485fd.js delete mode 100644 assets/js/6c179ac5.ef042d18.js delete mode 100644 assets/js/6d85920a.576f4705.js create mode 100644 assets/js/6d85920a.6e752d07.js delete mode 100644 assets/js/70006292.b08b43f4.js create mode 100644 assets/js/70006292.c60b7b8c.js delete mode 100644 assets/js/70de1c07.0b62591d.js create mode 100644 assets/js/70de1c07.4df884f7.js delete mode 100644 assets/js/7385c97b.052a7324.js create mode 100644 assets/js/7385c97b.9ee263a4.js delete mode 100644 assets/js/75936cdf.b36d710c.js create mode 100644 assets/js/75936cdf.f2d00a0a.js delete mode 100644 assets/js/76096a15.2d7f04b6.js create mode 100644 assets/js/76096a15.f48bc36b.js delete mode 100644 assets/js/7d09a242.ce991e50.js create mode 100644 assets/js/7d09a242.fce803dc.js delete mode 100644 assets/js/7eff0f1a.47606ae6.js create mode 100644 assets/js/7eff0f1a.9a5d601b.js delete mode 100644 assets/js/7f76a12e.4b9d38ae.js create mode 100644 assets/js/7f76a12e.e417c56d.js delete mode 100644 assets/js/7fa695a7.4039b6b8.js create mode 100644 assets/js/7fa695a7.ac5844c6.js delete mode 100644 assets/js/80447496.2ec80bc4.js create mode 100644 assets/js/80447496.ea6304c4.js create mode 100644 assets/js/80bfa96b.cd5df282.js delete mode 100644 assets/js/80bfa96b.e5d4b132.js create mode 100644 assets/js/814f3328.39af2631.js delete mode 100644 assets/js/814f3328.ba8e6fdd.js create mode 100644 assets/js/81739261.b57112ee.js delete mode 100644 assets/js/81739261.ec5a3f1a.js delete mode 100644 assets/js/83732ada.0732b040.js create mode 100644 assets/js/83732ada.1017b5ad.js create mode 100644 assets/js/841b1305.347f21bf.js delete mode 100644 assets/js/841b1305.92aedeb8.js delete mode 100644 assets/js/842a7beb.3c1f9079.js create mode 100644 assets/js/842a7beb.f5e11ae0.js create mode 100644 assets/js/84e198a2.18879c5b.js delete mode 100644 assets/js/84e198a2.91ffddfe.js create mode 100644 assets/js/86ba2311.85a01566.js delete mode 100644 assets/js/86ba2311.bdcf75f1.js delete mode 100644 assets/js/8793.6c976fe1.js create mode 100644 assets/js/8793.ddc5836a.js create mode 100644 assets/js/8a894f7b.61cfc55c.js delete mode 100644 assets/js/8a894f7b.ed44ed07.js create mode 100644 assets/js/8aacd032.7172a8bf.js delete mode 100644 assets/js/8aacd032.b71489f2.js delete mode 100644 assets/js/8bdabb45.7ff3db00.js create mode 100644 assets/js/8bdabb45.ddb8e58e.js create mode 100644 assets/js/8eb2df80.1b3bf215.js delete mode 100644 assets/js/8eb2df80.251d8abd.js create mode 100644 assets/js/8ee2fdd1.82e49d7c.js delete mode 100644 assets/js/8ee2fdd1.a6b4589f.js delete mode 100644 assets/js/8f6f5e4c.428525cb.js create mode 100644 assets/js/8f6f5e4c.7fa5ae9c.js delete mode 100644 assets/js/9060e84a.4d74a2c8.js create mode 100644 assets/js/9060e84a.d53e734a.js delete mode 100644 assets/js/90aedb84.6dac006e.js create mode 100644 assets/js/90aedb84.99d3ef73.js create mode 100644 assets/js/915a111c.13149dda.js delete mode 100644 assets/js/915a111c.2e85eec2.js create mode 100644 assets/js/939f23de.2a2acb57.js delete mode 100644 assets/js/939f23de.7f243198.js create mode 100644 assets/js/94782d2d.2e40e9e1.js delete mode 100644 assets/js/94782d2d.d31eacaa.js delete mode 100644 assets/js/95e9a4c5.9c25a70f.js create mode 100644 assets/js/95e9a4c5.df3995e7.js delete mode 100644 assets/js/998d107e.6cbdd3c4.js create mode 100644 assets/js/998d107e.e90e9e41.js create mode 100644 assets/js/99c26446.557aea50.js delete mode 100644 assets/js/99c26446.f67ebc66.js create mode 100644 assets/js/9ba56b79.c96a2fc2.js delete mode 100644 assets/js/9ba56b79.fa7dee29.js create mode 100644 assets/js/9c171e5c.2ae1657d.js delete mode 100644 assets/js/9c171e5c.30eddb11.js delete mode 100644 assets/js/9cae5962.1ac861f4.js create mode 100644 assets/js/9cae5962.7f6f0663.js delete mode 100644 assets/js/9e4087bc.ba0deb5f.js create mode 100644 assets/js/9e4087bc.c688eee8.js create mode 100644 assets/js/9efd8a4a.4d2af715.js delete mode 100644 assets/js/9efd8a4a.99078227.js create mode 100644 assets/js/9f640ee8.37d95ba0.js delete mode 100644 assets/js/9f640ee8.7839ab16.js create mode 100644 assets/js/9f709603.998a2a99.js delete mode 100644 assets/js/9f709603.a689513c.js delete mode 100644 assets/js/a8f610c9.46a9e8d4.js create mode 100644 assets/js/a8f610c9.d16485c4.js rename assets/js/{aaf3ff15.cf26fcc3.js => aaf3ff15.38a05c5b.js} (68%) create mode 100644 assets/js/acf4709b.71ce111a.js delete mode 100644 assets/js/acf4709b.e19f1737.js delete mode 100644 assets/js/afe5e22f.4194e0a2.js create mode 100644 assets/js/afe5e22f.cb896c65.js create mode 100644 assets/js/b0535000.242a35de.js delete mode 100644 assets/js/b0535000.5c531d67.js create mode 100644 assets/js/b0839e7f.4fcf9a59.js delete mode 100644 assets/js/b261517a.eec96f03.js create mode 100644 assets/js/b261517a.f7731431.js create mode 100644 assets/js/b4030b4d.7c070528.js delete mode 100644 assets/js/b4030b4d.d3034021.js create mode 100644 assets/js/b4bbde8e.8982fcc9.js delete mode 100644 assets/js/b4bbde8e.a30040d0.js delete mode 100644 assets/js/b59b8cf7.43a6a0c1.js create mode 100644 assets/js/b59b8cf7.ac260982.js delete mode 100644 assets/js/b8af02bf.68d91565.js create mode 100644 assets/js/b8af02bf.6bd5e392.js create mode 100644 assets/js/bb17976f.a0392243.js delete mode 100644 assets/js/bb17976f.d85080c7.js create mode 100644 assets/js/bc32b9c5.a0a9d727.js delete mode 100644 assets/js/bc32b9c5.ea617b31.js create mode 100644 assets/js/bd173b27.2ce9d3ca.js delete mode 100644 assets/js/bd173b27.fb7135b6.js delete mode 100644 assets/js/be236901.1119a8ec.js create mode 100644 assets/js/be236901.b34449f2.js delete mode 100644 assets/js/bf9d09b6.3ec2a4e8.js create mode 100644 assets/js/bf9d09b6.c0b10498.js rename assets/js/{c15d9823.62f9ce37.js => c15d9823.5567b29d.js} (75%) delete mode 100644 assets/js/c19fbcae.26a90190.js create mode 100644 assets/js/c19fbcae.9b91b544.js create mode 100644 assets/js/c224274c.8ac21b1d.js delete mode 100644 assets/js/c224274c.ebb6a550.js create mode 100644 assets/js/c4f5d8e4.570c464d.js delete mode 100644 assets/js/c4f5d8e4.771b41be.js create mode 100644 assets/js/c7deb2e0.0c155dde.js delete mode 100644 assets/js/c7deb2e0.2f90776e.js delete mode 100644 assets/js/c92fe796.26342a37.js create mode 100644 assets/js/c92fe796.dd492aca.js create mode 100644 assets/js/c943a24a.3e2e52c2.js delete mode 100644 assets/js/c943a24a.7eb67860.js create mode 100644 assets/js/ccc49370.53a4f211.js delete mode 100644 assets/js/ccc49370.847a3819.js delete mode 100644 assets/js/cce09ffa.29842373.js create mode 100644 assets/js/cce09ffa.c2a08b45.js delete mode 100644 assets/js/cd6cf5b7.b06d844d.js create mode 100644 assets/js/cd6cf5b7.f8a17d72.js delete mode 100644 assets/js/ce98a713.462c84fe.js create mode 100644 assets/js/ce98a713.d6f37062.js create mode 100644 assets/js/cf7588c6.8e6af6c6.js delete mode 100644 assets/js/cf7588c6.f946bb2a.js delete mode 100644 assets/js/d1becb09.34b1a05b.js create mode 100644 assets/js/d1becb09.9b3996b0.js create mode 100644 assets/js/d337df6f.4e231f7b.js delete mode 100644 assets/js/d337df6f.b45bda30.js create mode 100644 assets/js/d5ab79da.1faa483d.js delete mode 100644 assets/js/d5ab79da.7a6ccdeb.js create mode 100644 assets/js/d5f89569.2c8d20a5.js delete mode 100644 assets/js/d5f89569.f9fcd397.js delete mode 100644 assets/js/d6535278.94e0b22c.js create mode 100644 assets/js/d6535278.e9ffe8cd.js create mode 100644 assets/js/d96727fd.0433b868.js delete mode 100644 assets/js/d96727fd.3aace257.js delete mode 100644 assets/js/ddce1156.112d455b.js create mode 100644 assets/js/ddce1156.a807cbdd.js create mode 100644 assets/js/e157395a.207bb473.js delete mode 100644 assets/js/e157395a.b8778f91.js delete mode 100644 assets/js/e1a437f7.415b8f79.js create mode 100644 assets/js/e1a437f7.50b0acba.js delete mode 100644 assets/js/e1c48702.31de42f4.js create mode 100644 assets/js/e1c48702.b987ce2c.js rename assets/js/{e33da66d.7bf505ce.js => e33da66d.97d80f76.js} (66%) delete mode 100644 assets/js/e3b00369.068a46ff.js create mode 100644 assets/js/e3b00369.6a6f7366.js delete mode 100644 assets/js/e641ee58.05299a4b.js create mode 100644 assets/js/e641ee58.c64968a6.js create mode 100644 assets/js/edaea366.3a139970.js delete mode 100644 assets/js/edaea366.d4254e2a.js delete mode 100644 assets/js/ee513c31.027b1fe5.js create mode 100644 assets/js/ee513c31.57d08833.js delete mode 100644 assets/js/ee8c27e3.1c988f9b.js create mode 100644 assets/js/ee8c27e3.bedb0161.js create mode 100644 assets/js/f4fea690.cf767130.js delete mode 100644 assets/js/f4fea690.d2c6d21a.js create mode 100644 assets/js/f81c1134.0751ef83.js delete mode 100644 assets/js/f81c1134.c4783553.js create mode 100644 assets/js/f9208490.ac89ffd0.js delete mode 100644 assets/js/f9208490.f2bf03d7.js create mode 100644 assets/js/fb02bab9.573df022.js delete mode 100644 assets/js/fb02bab9.88092581.js create mode 100644 assets/js/fda0af90.0cdab8f6.js delete mode 100644 assets/js/fda0af90.cf56670d.js delete mode 100644 assets/js/main.0d7a5f66.js create mode 100644 assets/js/main.1137f990.js rename assets/js/{main.0d7a5f66.js.LICENSE.txt => main.1137f990.js.LICENSE.txt} (100%) create mode 100644 assets/js/runtime~main.9de56483.js delete mode 100644 assets/js/runtime~main.f3ff2a54.js create mode 100644 blog/svt-av1-third-deep-dive.html delete mode 100644 fonts/.DS_Store delete mode 100644 img/.DS_Store create mode 100644 img/comp_showcase.webp create mode 100644 img/svt-2.2.x-testing-blog-image.webp diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index c2d09db934f17df8629235a3ac91c2b34b3e4638..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMPfrs;6o11X*^0;lML}b-u@@7FLPgXVLoE;`MnOst0$8{0v}{;rn%xBiLejII z`~W6iJ$W_p3wZJB&G-@Y3mAR#r%jM}Um3~d++q%dia9|LrZvuOfRxs9-_Bj4r9z86LV z1D{AkV^i~q7R$0)t)%=p6%`AwZVQTIWWA_?`+>p4)i-iSBH0YVpezJ%B|__ zioeSEb3p?>Wc0%b+SKuG{{ppU*uD1kOu&53N+JbYBY3b1rTyFykyFdEj`}SdEl0?P zrPvs}fea+CC;yNQeKlTwU9T~lnX^6Jz30yN zX6>$=n_npfV%0{u&x5qTMi)wfSICszyvIs&5q%bAye*owI}e0T)54QI)68ZWW8!-T zIo#cVQYOcnEEYo=&DH4hS-U;V2i*6kc<4nQXY-38?zxGGu1>Hb#~IggzfG2fE1ac4 zh*+01x8%Dy>QAyXk0QQ0?*@U(N;JJW=jAz5XWlM{#lxw9iXjst-*8i)BvSXQ$|a@P zkWh+nZoZbf6|b5!lGqI6j3!c3$`Hd_y-(h_v#N;4^%M@1%v; - + Page Not Found | Codec Wiki @@ -13,9 +13,9 @@ - - - + + +

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/css/styles.6ca912c1.css b/assets/css/styles.93aec407.css similarity index 56% rename from assets/css/styles.6ca912c1.css rename to assets/css/styles.93aec407.css index 4004031b8..c5537bb8b 100644 --- a/assets/css/styles.6ca912c1.css +++ b/assets/css/styles.93aec407.css @@ -1 +1 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.authorSocials_rSDt,.authorTitle_nd0D{-webkit-box-orient:vertical;overflow:hidden}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-blog-social-icon-size:1rem;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.centered-text,.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.header-discord-link:hover,.header-github-link:hover,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}@font-face{font-family:Monaspace Neon;font-stretch:100% 100%;font-weight:200 900;src:url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2 supports variations"),url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2-variations")}h4,h5,h6,html{font-family:Inter,sans-serif}h1,h2,h3{font-family:Mona Sans,sans-serif}code *{font-family:Monaspace Neon,monospace;font-variant-ligatures:discretionary-ligatures}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(66.47% 0.298 7);--ifm-color-primary-darker:oklch(66.47% 0.298 7);--ifm-color-primary-dark:oklch(66.47% 0.298 7);--ifm-color-primary:oklch(66.47% 0.298 7);--ifm-color-primary-light:oklch(66.47% 0.298 7);--ifm-color-primary-lighter:oklch(66.47% 0.298 7);--ifm-color-primary-lightest:oklch(66.47% 0.298 7)}.header-discord-link{height:24px}.header-discord-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 127.14 96.36'%3E%3Cpath fill='%235865F2' d='M107.7 8.07A105.2 105.2 0 0 0 81.47 0a72 72 0 0 0-3.36 6.83 97.7 97.7 0 0 0-29.11 0A72 72 0 0 0 45.64 0a106 106 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.7 105.7 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.4 68.4 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.7 68.7 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.3 105.3 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15M42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69m42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;right:550px;width:24px}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;width:24px}html[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.hideAction_vcyE>svg,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.authorSocialIcon_XYv3,.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size)}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.authorSocialIcon_XYv3,.authorSocialLink_owbf{width:var(--docusaurus-blog-social-icon-size)}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}[data-theme=dark] .githubSvg_Uu4N,[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .githubSvg_Uu4N,[data-theme=light] .xSvg_y3PF{fill:var(--dark)}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;line-clamp:1;-webkit-line-clamp:1}.authorSocialLink_owbf,.authorSocials_rSDt{line-height:0}.authorSocialLink_owbf{margin-right:.4rem}.authorImage_XqGP{--ifm-avatar-photo-size:3.6rem}.author-as-h1_n9oJ .authorImage_XqGP{--ifm-avatar-photo-size:7rem}.author-as-h2_gXvM .authorImage_XqGP{--ifm-avatar-photo-size:5.4rem}.authorDetails_lV9A{align-items:flex-start;display:flex;flex-direction:column;justify-content:space-around}.authorName_yefp{display:flex;flex-direction:row;font-size:1.1rem;line-height:1.1rem}.author-as-h1_n9oJ .authorName_yefp{display:inline;font-size:2.4rem;line-height:2.4rem}.author-as-h2_gXvM .authorName_yefp{display:inline;font-size:1.4rem;line-height:1.4rem}.authorTitle_nd0D{display:-webkit-box;font-size:.8rem;line-height:1rem;line-clamp:1;-webkit-line-clamp:1}.author-as-h1_n9oJ .authorTitle_nd0D{font-size:1.2rem;line-height:1.6rem}.author-as-h2_gXvM .authorTitle_nd0D{font-size:1rem;line-height:1.3rem}.authorBlogPostCount_iiJ5{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.8rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorCol_Hf19{max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.authorSocials_rSDt,.authorTitle_nd0D{-webkit-box-orient:vertical;overflow:hidden}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-blog-social-icon-size:1rem;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.centered-text,.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.header-discord-link:hover,.header-github-link:hover,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}@font-face{font-family:Monaspace Neon;font-stretch:100% 100%;font-weight:200 900;src:url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2 supports variations"),url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2-variations")}h4,h5,h6,html{font-family:Inter,sans-serif}h1,h2,h3{font-family:Mona Sans,sans-serif}code *{font-family:Monaspace Neon,monospace;font-variant-ligatures:discretionary-ligatures}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(66.47% 0.298 7);--ifm-color-primary-darker:oklch(66.47% 0.298 7);--ifm-color-primary-dark:oklch(66.47% 0.298 7);--ifm-color-primary:oklch(66.47% 0.298 7);--ifm-color-primary-light:oklch(66.47% 0.298 7);--ifm-color-primary-lighter:oklch(66.47% 0.298 7);--ifm-color-primary-lightest:oklch(66.47% 0.298 7)}.header-discord-link{height:24px}.header-discord-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 127.14 96.36'%3E%3Cpath fill='%235865F2' d='M107.7 8.07A105.2 105.2 0 0 0 81.47 0a72 72 0 0 0-3.36 6.83 97.7 97.7 0 0 0-29.11 0A72 72 0 0 0 45.64 0a106 106 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.7 105.7 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.4 68.4 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.7 68.7 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.3 105.3 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15M42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69m42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;right:550px;width:24px}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;width:24px}html[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.hideAction_vcyE>svg,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.authorSocialIcon_XYv3,.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size)}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.authorSocialIcon_XYv3,.authorSocialLink_owbf{width:var(--docusaurus-blog-social-icon-size)}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}[data-theme=dark] .githubSvg_Uu4N,[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .githubSvg_Uu4N,[data-theme=light] .xSvg_y3PF{fill:var(--dark)}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;line-clamp:1;-webkit-line-clamp:1}.authorSocialLink_owbf,.authorSocials_rSDt{line-height:0}.authorSocialLink_owbf{margin-right:.4rem}.authorImage_XqGP{--ifm-avatar-photo-size:3.6rem}.author-as-h1_n9oJ .authorImage_XqGP{--ifm-avatar-photo-size:7rem}.author-as-h2_gXvM .authorImage_XqGP{--ifm-avatar-photo-size:5.4rem}.authorDetails_lV9A{align-items:flex-start;display:flex;flex-direction:column;justify-content:space-around}.authorName_yefp{display:flex;flex-direction:row;font-size:1.1rem;line-height:1.1rem}.author-as-h1_n9oJ .authorName_yefp{display:inline;font-size:2.4rem;line-height:2.4rem}.author-as-h2_gXvM .authorName_yefp{display:inline;font-size:1.4rem;line-height:1.4rem}.authorTitle_nd0D{display:-webkit-box;font-size:.8rem;line-height:1rem;line-clamp:1;-webkit-line-clamp:1}.author-as-h1_n9oJ .authorTitle_nd0D{font-size:1.2rem;line-height:1.6rem}.author-as-h2_gXvM .authorTitle_nd0D{font-size:1rem;line-height:1.3rem}.authorBlogPostCount_iiJ5{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.8rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorCol_Hf19{max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/images/comp_showcase-3902fce14e72fc094b637b526525a24e.webp b/assets/images/comp_showcase-3902fce14e72fc094b637b526525a24e.webp new file mode 100644 index 0000000000000000000000000000000000000000..96564b8fdbef05b0bc26fdcb6c032943ebea03fe GIT binary patch literal 981890 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�W95k$XznBhJkbG=euDqvu%M@Hj9V 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�If^M}jYEzX{Meg4=X_8Kl8-J0E11N^XK#$mFfz0jm`$7z{v5 zg52l>qRDpJ0U!ggcYng1vjZbm^fD{sc25EjFjqoDRhTYtDFiepLtCJtg486>p~xbs z!D!6}0b|sjq#8g9!T={u1yvx25?+q55Kx1oB7qtJ0K{`ySuw@5l>kH2YHjUhqqe2i z*0n)}-AYeAmD*CvvZ^fN+ICF0H)U-jwiSaFo9l8$$7kGeTMoCr`ogl)-D>NOlFC7~ z&M6D2wG0gdG&3=rW}|Gd90QnSw5CW2(10vg2ZO+WI z)Ou6-Ol@Oj0+66}L7Enbk*5PCvCC@)0?a*XYo=q$sElN^ytP&}tK{yPEy39U7LTCX zu&a$`<7v6~Bi$^-n)JL|ty#5=uGo@VYe=z*x0e8jm1)~HI$p>oFfdMoS>SPQ&CoGs zQk{A%z$K&lWr4=TBK5&N`O@tcQc)FYX!bZ5A@Nog&Euj~Ynj7pJ4K5cq_%3H3@oEoUYNFajLGW8EFLBx7Sr+U zal%N!3pV3%ET)Z(aWl*k8)*bEJ!XLsz(5=f6lbBW>o}Ov3lw&fRhsGA7#h&MVQNN3 zGy}&dkdQzzrEFpZ9s|v0m}N6OW4VMxDJ4oAolA70*|P);1eh`;=q_>BQ58fL>CqS0gClQ^6vqi3H2J$6G>B4tOV3@kx&%ip$EBlHHfO@l9{L?il#}7+FBfbZ#RF6|M>hI0oY>f za|fHeoK_Tw5fsy$(VLTM_b_!~g-KE})11-l7>V=9Tq|Rx)S;Tf2_Zc4~PAn;;1&(Q=W{)}Y`?WQM3DDpX!s&T z(QH3$03c9dqAy4K@faV25)1$hLkuuL1xpuD3WWePEv%wV(>S8aTKl?hab(dGXztBJ zjd#m?o^|JQ(`KLE7j*O3Jdez0ZW@~Fm{#x20SLK^!C+SFE27rM$Rv&1%#=42%1Gv_ zTmTd^G#J1njbadWW!YK0P^nQ!)v)rUYK=iGI(pV6W^KrXbLMf+Je~18J|CV>Pj@i+ zJ^4;?UiIhRzPvyFeDC{bzw!NPdOJU;iJcTy%*|q6O7WLPOkdj4i6PB+xpU95(-aff z+$G!Oz~%icwKoyR;*nya?1{FQBZT&L42Z-g8so$$Wm5v?csR#qxhKrnc%&a}?lI9w zjIqrVWkES)scWy?oSw~M)x=tJ+(+8y+Pt##l+8wrj1fj)Ab>XfifajM@fsqjaM!-Ohjf7pc%4}sc zWL#NhnXug^*Np{(q!_7XClm^Mw)vdcJofJS=O!PH@R%#P)ye43ngEwcqv9%pko77IU7m>NqQn(ckprsD*-UT>>3#W5Z#n= zkbt-$A~l%+Ak*6Id!R*k_OUGLcAaqReO(m82Eoa4dVCDe6J9~>ACu^WQ{@Gq`Mlrx zlP6(vw2D~@01yB*u}8s96bHiC1m;u>0<@%rP1L^NWS z*bcL;*0nj?R&3PF$eO}uGMJDxi_~nI*fa@()+n8of>CUeW@SqCmZl(^sToE#+5R;5{0ZHraarlM+Z;p~lLOJgQR%$+xg zC9GLuLXX~-E8dd|#!6y(oOIi-RR?=@o|@g;ue)2%jKIK~ySv`A$A)1GEDd3nY9q2K zvMEd3tD5PEtx{2RT@O`~Dix{%!~i2;TNQ(~w9(QU>!#MaX{n}>)HXHOXk^tIX|k}j zGG;IW8X00>G!kXg2@xq5Gz$XD9j{%oZHY}LMx=qq@iYU0&0>n#1g2?48^tC;Q8Z0y zN}4wZd1Ec{R5nbANI;HFDUbsZOEb#YEX`(MyxEvBP^6KFkaCey5XEfDCKdyvjZ|$D zQiZCtx!iIg(b806tzsk8wwcZbWuIu^;us?rFGNyC z0tdC20Z34>Me-z)5xJ2J6{X0Hgt7wlsz&poH%de$4;2V3sxTB8AmAE}$T*srWJH?E zz%lOo&|ZCf#oYKiJnmql_SS?ZUJg-1#hkdubjdDPyj9!S;cB>K9x@jSsw_Q%D2ReH zpk5VK0Gz3>Lk<`i9y(=ED_Oe97So_Kz;p#uluUp}G;l#A0#(3bm_xw>O|;$s6rdr9 zGKFY@AwhuZYNt&?CTKYQG7UTFmCm<7ym z4YALi>ATH>;_i2@MHK52y2)bl#$CBUk9LSsW8&a?BW$N4z%$q}FU`8>yG zea0CTYnQ*{`!D{FfBCbVYiY-#9w-!NG)7|S8B1}h-Qd%BBrtY*4mB%{Gk$hm1M#-! z{(xtgGKw*mFrMOUK3?S3@!oc@M7+762ahnFogPTXcx8f+!|WLwtLpcRL38}lganp| z=CYKgrFFH5IQN6L6^pTR6jj~5(F2V4V&%;OX-4=bqghI`1dKEW#sh=!Y)T1(<|2(b z3=SiLFGd=9GbExBBjplij}&RjK(myMn6AAgtRb)&(JUBOwx!L}CB6Ng?@#vlWA@;Y z%fM*DF`YLb8*Dl-a%m*6lt!*@LzH8@9Gj*y$|eLGDNQUYTbdEF2>@71*%Sk8LV(ej zfH8}7Mzh?3F~t;w?D@bTRz_zu62@!sB+DN;gXr{o%o zY2_KKOze!cu~Q-r4XTEXE4RfPGw$M=90f$jMuE5}p?L?(Gy6IKwF}^lS52UywL}C! zpy1|vvGPS-0Fqz;fXrgx6y5X4k<07lLzIuKE=#27&Fj)RFDyi*)5nxB0lt@)Sc5q^ zb}fX40!{$WO{*bd4CNZa&IuqY7DXBmg%FgY&_$5hPylNRWEpH>%iHd}+ILmPfRJj& zDlMZWSO!37S!rpkowipR8ASlew(5C>Udv{dDQ(krM5ijK8V5IbcWtXFQ+1IUwra%^ zqM9-^OWRtLtu{5nyxa)bh%KP(3B;@=HfEJ^$}67UlC^cjR#@2xS_{C^+AQ0)RBpTN zx@-pRYoc^l@?R6J%v|izQ^jeVO*@CCCm^; zMws$zy@T8)t*r~$eI9DFtNE3MNR=gR5*WL#qY=l`ECYH1qQM2YnQVmJ8 zDrr?+sX~<`6{=XZY8ceEYCCC7t7a0K=D0=CCRRkN)*4HuW;G>iv$B?(M;33o zV+NX0_QVbf%H;?t_eg0n2l%5liDSh*%IC02pY-h>bR|q*}4G3P{`J-f1Im zDS1PNEk=~h5ibWiMh*ckM#`pO7(C2?=gnfqhz&%FgmXcGT%v5s#;h9IMB27WZEjQN zBC%VFWE@zURb$X%m6?fETWzw{C$Wh@Ax6p?NewF5jg$iX%lcNiM^f z&?wP_%v6XjuE>RWb|f1Rq(Fn??ek8hy86*VK?w>9Gz4t&+H6K>5F1=0kwR$z z3cvtT(lBIFND7GoxuK9vKsF#3%5|z1Tbt9`oQkZ*VOq>-txq-XF>i9e8x9M-C%A3@ zyf8kymNEj0My?tt30@SUH;t&oypbFoqIryx19GA{Wfr~BTP?>@yyjBKRDcyzJ!p*r zpcJQ`dtq?^1FHaxLMaNllTvFNdNiBU{Ce|o;%DMG8wc{va2~{be&@XB1kVqMu11e2(Sz>czO6>DaXDP8WzJV#1oo%pcuww6ZcW*O^VKx`@rV;0(2T^1b zZ#Lz&?43>AY!0)OzMw6I5~C-|&1I*F>Dt@O zotf!O+hc-=PKli(!n4F1m}P7V{KpZ%j1W^Az?fzu(bF^o7nn_;h`BKcjMBN>7%>}2 zl-LxMyKZLYO_5CiW+}}QOlH=`#{*!L=8dzrOHEp^@!U1r&`4?G5ik)udz#B)4lxD5 z@lqNojRewdWx2qZGCHw|$1tS|n{wJjHZc%lV8po@9e9>lj1lvu0kFA<3?~KH@GJ*L zlL8={)QZ3WMu8z2O*R5kHd~Xj0gT+;8fn;X{j553wq_-(yF7wDFZ}E_K&!{n;g)J< zG>(9s!!8?&VYfS+^ZV-Q&FNk6tW2yRJxHPzliJx1k`rlRh+s1bQ`#8BUzm^8eHhuY97-{Sq3QNu$|9819VG^+B`nC~wjh$pPz334-RFQ#+l+AC z0|(OpNpy1%%XIX7!LW0OE)1p@_m-e`=g-7uhMUaoAJawxHO>C%(_f7JZvs)6CWxy! zhAg8lK-gM{J5Yr-AxH_LL&$7Omx_2&9V(*OEOQUhy%GB6)ve~L_y*2Afo9)b{ zyr;H_xoe(T8Q3KQUxLm0c- z;~qC%Z_DxW?L2g>((S!Oti>3m?d4!glMOnaF$R7&wpg0@@*eG6t=VV-MKZCHqJ&2B zf}*N|msP4ziYg5;$llc(Q8ojcjH4#TO)}B6?s%eR*JL*&mdH$GS!Qm{!bp#%^ESW; zm;$q0HkVSG1`<6|Ou?o!qgh4)fbcXx$VQBjjWnBOM+U$U))aO#x@DYujcZS{>*dy) znHr2Bj46UkECmN30fB+Udv=-)-k8N~@DinCLJ$%t1zl}Mw~a>I%9d7bvehQ81E(5k zrON7zx-_dSjcrC&nVK23uzliLF>=vB<7!h3LKML>Mal3qXD$?qM38KZyo{(uiM|9C z2AaxMW$1wlmE`L6LKjbfX&_4M5{ldyi$E0$*Cq&pTwEKnV*+Q+!G$?&?9W-X*y>@LM{hCNe9+*YwH>yu*xs8{ z7Z1wKibQd*hYCeCt{3u;0KGj`S=&}#l+(V zqmcmi6hIJxVG5cH%p2@6VZxNoJKC{l>>NFiKC0WMTn`d&nhW3nfkrMO_grL8#CTKi z24Q4rhQy{AgAtqN&U;K_U^aJ3KNzMlxC0D1dVpgzJI>!+HjR;o98C;J5Hho4P?`lj zJJKx0pn13OEQgHPAh3)8vw7KT??-oZpC%r_=3|k~O=p9iK99fwz?6>vkjuS6O$lwQSf3uGBfT5{rgyRR_ii(>IOFjrX%o z*_N|A!ETo8dGuWH%7}27w-zj;0g#B&fF?1Nf*1>p;fIfKr=PQ66DSAc!Z1^J4H)YE z(CHiw#whNIC9U%Y!#6K(l}uIG-{Lw$wSmL7*xy^x6#(maXBT?L`Q{oHWjW*aqYSK@}hp zRj9y#0Fosi5j3@7LWu$-uF-q0(uLU#Pit!c1KUciR+YV-DQvr}+RDKSn-!#I zd->+kW4QKKEuI?pJ@4L)3bwUoT(5at235CPsh|;8vdZsvp9LwNXYa(o@i>NTT5HD} z$0W9wQ#@1e|Dgno(ddVgT=v;dx*KDb3D-kW1+*aT3;|;hB~; zv29hcwx`O_rKzgv3e}Wqt6QV8t**9BZE8ybs6LTbu4FOLCWRO=Ra2uxFx_(E2@|!f zs2DhSStJHTi9(W_%PFKv(?age1FaG1%~ek{&8cTf&OD2L+7uF|B1JU-&MT~WH*fKrx3G?hL2>6i z%(8RGN}2?bT^G$<9gtyELnCQ9d1Pc(b=AbQ$+e^iHuWY&dqQ~SH=+$k1<~ugc5pH% zWzdYiM8+gTff8#$v&f|gf=!fbv&l8>Lo$ps8?b{6)0CTLN(k5_Xh$e1nS!Jy$fW?_ zOfDtON~Ouggk&XTR77Ud5E5p%&hb*Ha2b-(BrGBjpj>$YF0kXA=#5q_M+&y~Y-~;| zC!N80y-hhWQH&6|?$}-}7NgoGn*=f?B@MkXykthSVi|PvP>oW!xyqt~5^$7vYfKmwm#p7(&fh*Y?=}SvuudGpb7o_zs0jU?%qJaUO;EKpF{PB%2fynn85_^B8G&)}jB+O)m;Nvax0l$_ZtiRj z@x*JLj*)MSDbid9#?2mQ^UY?X!Y0Fr7=&5UHnV~BY&M=v0||`Acy^AEV-pu30;b4c zk}Wot8;WTJrh$V-#u5I>f)NHzjMAXQd&bUR_G~a>Y3yhG-8&t}e1Ysa;voo(h&Rs7 zCN9Gi(;49(X+oCLNMKV^hQ(~89HW$`jAm)}EJlh2Cd)=(BsK-&d9!Jps#{FMNX@ux z4Wz-iiE$YRFiZhrAVy3KWU*>y&9Vz^$8XsnrYdGF?6ou6TJD;b&D~+w7!z}J2lj%@ zLWj}T=$!dCiv=z2;K!Y@Jl*ql4Rpsa^HCXC8g-C}cnBgmSWtRm9+F(iWI}^rT8Zz$ z)-0$1otT2bUDN~Zw@F{hxYX99!=iyoV2cZgQzQf?O^e78x7bwF@26Hv%DD}$sy*m2tIZjAPgXIWis2* ztnE>vRzxdNN!VcuE0sbi^-`b!EdbzB0}}`oPL_dU53-iDJ(b#Ktps33(eALCy^5CJ zx=B;jP}*#}Zf(|161K|{v8YvVgYc|(f@cynD_)hTG8ITI=QB#OsW9t;+0-g>@S4 z-c#FZ2AW9>cy+UFq-+){BcePx$#A(mg+0I_q z+p4x%y|=YGBWQDXkM?qF?QxUX8EMwen@Vp>X-QIRDQV5B%I4(O+mmdLylpL~XCp=S zgxfQ&S$f8Pz7Jk&J*zJ0ar6FsQ>A%8wTW46B;Lw)$R4?PsAhT`?)96DX4&4|VGGTS zHAzc_qEVC=P+{^|zKMA0-=n<=fPQMRINO4G_p zW^1vFHNc4G!OJa*!O8 zW20_cz#b*GCkBY}xCxYv+%Zl-8i^4DWrG+E#^wRDY*4Til#t_)sN|?N)|w$B+Ynn7 zn?cp$$~Zx#5gXM=nNgcmw$(PPnGx70#RezESYSaL2}A*?*K;b7vbfMZp#VTsB6>g| zizJaEco|6`DdpaAP!qi7<~dc?Xf`GHx==L&B#&tjBbKqK1r`)VsyD`n;8?ghP?H0w zqJu+_42cwv14KoJK!ME5(Y)E2Ad5RS*PLU*3X|N*#M`k2W_1y~o?K;S%ghBj(7eX( z!klFlG8#q(7c<9I-pp}JR$b+IMqpl7Q1lgSI8cyl*CJmc(i{wDkvtc9DHQeMVj4P7 z7)E1VNP?0eKxj%fxi$z5BOPSNl#-^+M97pxK@gB=17b*kzyt`X*F#OLq#y}~&8P${ zGhtL_NC*PQR>r&t7OrF#E&x!1KmZsP{mk)16LJu`}Njr>*VKqG;2{JULP z+dJz?H?Ii{*yY=+*FNXm{patrUvBrG{`>LYll>>3&_BIJrkF;cgMY2?4H8WvUDC*y z>;tXjCVrwrVt?8Xu=XHL3?jt3r-eDP*^?|KoFwLC0(60Y5ujvV ztWIvUufBkL{!=WjYn9ovE=quao6d~es!)DYnDAV^NA-KP+Vo!@2*jI`OrZCkg=een ze844<(#JUVxT8P)od42Fdw8{KUb_h*B&-U{E6oCuy8_%vS)emdH%7S}GLVYhR%^vS zo|&7tRd8g54L{z*f_-! zBSe>&8HGB45o7+S2%iVvhBxUsDmmjz{ej#>=pOc1HmlyR{VLM=071B+t?6W<6et~6 zT2iPf=~St@t{3)MJ=eyOn*4BBHRb&Q#25O+_ww)UM#(*kayL}d6##Jv^5jvcl5XHhtEYSDU3hrhx*n>9)4DZkW`-}HYZW^}*Mqg^c`58YdPqJ)N`?>u(}26A%^^_e z-tJbcH;U5{(QV+m?o4m0;nN{!F40wqS-x*6veioFMCn+Nh_I`atcKETmBC+hlQXC8v*$qsg$6NwzNvdoA1e4UzaVJ^hhuhs+xP0`li)(vVtOKa!kC5q#E&i-5N4m z*qV#`Z*ds$G3W5B^TbA_>4Nz%j&g`qqDK#cLWWOG?C_q?Mts3JfS<~QMBcX*atHDfaPgRmH+3Ga4G^smcY}^yf zLV>c%E%{9WN&w1jO+6>3w+R-Ys!*wbB$51{mcd1Ry3bAD&w}5%{#M^_5#mss<dvo*QPHs-QTqhMqow^=vD^Yy>jj-m^aFq4hz-4zSL3)`;HC0?X{W`}J5(^$ za6l(wxKVq*%+3FbDgWLz!hl?lg(O?c16%JaknvY{=_}J_so$GQi4MI{vr;TIrN3hR zHU9YfZ>v8h#`gbB`Qz8)3(sPbPS_vVvly4?`*-)Y1_MNYsj%FJD_pHRL)}h%F1mqV z^1_l?@cfqnachG#bc|4lOw61Ru##oL6K2@X8{*qaPmPaq9%n+dp%D`x7}Pip+#x<2}rXHD9=Sk3rPAd z6D3Jz!K!*oKmHWn%GHw}1BeU4ZWMl#Wfi|pO*pLpeTrL1vA3DqnP2j<8~b9TdRr7K zbWuPTY^TbCdyUC@73da?rBu(B=)5~yJm$#K0=?xHq^>!fkU=#Hxut>hVfOTl zch;n70MV*98Ld)E`S7WTU|a_t%d`BxU;Hxtc=O)8TPhhVzcx6OcoZ#1{&uif@rV4+ z&+4q(5zBKtXU8%V6#xXyabCR=gj4|U$Kw3o^!Y1Z7>Wua1@{75i~|9g-6v_!w9*#-MNTZg7kX&nQx5A7*R0}N%C zYjF)X!@-70)I~-8Fu2APs{_-p>RXdYdt^3x?JV;3 zG?nk~o9aX*a20u6@Q&(?aQ*Pfyc#P{Org(Vu87d2XX|1 zMK#?8g<_|QC-aLS;7-U5t9P$QKqdUx7rH)WqRWWWo$lK;VS9_(FP zPC<9&KoDahw4GxAx8`YmwRlfyCX`f%4OZ7)`G^r;t0@bcX!uQ>UtCJJ-d3{=*dU;B zLD}xSUY+~KqE&O>wXvt(w;bCvbGa?Ujvtw%Nbly4~`PIXYuRJyMFpe%f}(9*MFK} zuvKd5zd~|`nhK0)JSY^);Q0H%;~y)Hm|_-N1rIeQ20dnlT;&wvFP;>Ye%G1E126`h z?XNtrxsr+P0`isAs|FK;Z@kFJRVlFJK z81Se&r;^`ELt@QQamvxuAbh^8Y=Td%Pf|+jhVaGumM<1EHelOp{2c-<#0&0*R3HsJ z_`_}g;Oiobw7gop+S8?vy4iMt|6MoKr|?~td@zgF+69uCoWdJP=V8PhRdOi_%`$po zt)jjp?4fZHyVYH)>Dn~kfsT1oCjhK|KQ%m<|6FmGdkG}%_S5x|)NJV!_!s(LY2`KF z4~`#yBPw zBpo3s@iq;qrgp(&!WoO(xK6N5id9_^N4aQh>wfE6=181!E!qfl?qfvsn{UD5!C3wh zQ07veT5ed#L!b)^%VL^q3wj^nN09BQ7IiF-pcmD(?|zxtQP0e@zL)j_iv~}|@u}K0 zMVTmKn;;p>IC+_3-Eo61-3j5~F$07~Mp1heofVC0mHE-4e5FSfDe#ycDZk_`(V-^j?v!Vp~wS#Q5C0d>)naf^uE|5 zWDdIxmruy7MC)V9&JM(wt}M8sj*O7`jO5@lEm~PWL-@9KcAxGep-!lQ#7SO{geU~_ zps!r#mbkK$xj2`xI9FrqTvgsmzF!4iOQ5^>YR_OP3)kOI+eKBkC{EhJVXv1dB7HVuy%Zwv4)xbCh4^xf?*m8cs~&CXDBR+1 zl#`tt6r+YB%f$=N>Y}$_z;3<2ZDJNRoty80-_Vv#N+`lLio)nQw_V8eck+Oq`+SFK zsXAUzEIw`Pu!rltAzD_ElFxXUt_$&|P)g+=QkpxU=Vfjv=76+2t0@HS7xvYZ6iL?Y zu(ndQQHFfs+zd%dpaNcxgGyr*x&n%|&J5y?2AHYLs?3rSSn!y*pk{Q&Vz34!w!!bb zMioXb)H}*Xi6fo?8vF2vdxkWB1xA4-U1UHu9tPFbX7N>I#bNXBR4tLDn6Yy&NEbmx z9F^TrX_bH*t+iB@J#kZa!%Q_G`uDeapy@AJ(8!TYoi!Qt`wF&w(zYYp5!1F`Y;14j z6ioQOEt_?hbqxAkoo1G>I5?j{)y@^uc;~6p5w|<&nhg+;H}hUro}TS-P4EhN_305s zfwiqBtQX2}Zii`TkerFNx+G+loXdiEA56hR-ptpA3x50bcgDu++V-oxZ;=>w%3!ip zLQzmvc2QRWv1w1E3jCTp=_4lN-a}2RrMhP0XCA&YL+m?j*_}2-Ass74g_c`=-|)>Duq#m zRZD~PjEp1!g4!k$VpnT=%5wdj+9OmoLX6^f^fF6=1quWedu+)~!Zmy&H8} zl=<%5nSylsMKQP@atnwPm1}W#ni;drerKr%-t|?e`r-_i*{UqxDjd4F@1Uh>P~n;@ zph9p#=u`xtqC)-j2Ou3A)TtOf1LmrfCR zkTMtX0%Q)u=J!Drv}>=jgp@)QamCH~tfC5S;+~7tnOp1&?C14I-YMCb)fS)1eSKa)JzJg_?m zf}pK?ylj$!(wqM13t}0&+n&afPuty-(i=5>XJMVhksP7H>@eyt896p?`kJ04mNcS( zsJE4DXOPm!=bhb83L&I_Ag zeiJO>>y}hc$gromn<`e^#L%;Ca`@!{(qMs!CNDVIg5>MJzJopD3pS{9fDd*Qkr)B{ z2JI1A&mHK6H6M|r=5IoPn-Y>E;;I#zwgjz&JB_X&{YdN*Hf5@(lQH*!^?Bz> zH+QuV?#C;ue3WmvO5#c!KX_57)x3|&MRHI3%rYOwQ}x!Z&n zg$=)G-^SaL0T2@egVyfJZf|z>cUg2i@qg#Re8U#{)s(7ZJHZ;7=^(EM^WXYG=Ynfzf`Z!SnfSMkvDUD^+i~w02u>G6zwo8LX%HFKf|jl?z%1EdgdT(l#A#X1Nafeu z7_Ao!K10WAnq}O1Tl9?mSyl$b0{c%y6fg1=FFf}TskuXKbqPsF{U+fbGMV8|V|%fx z8SI&wO}*_<2h3}tsr=_E`KzI1HR3;Cz*$z^wyhB5(u z8}N_lODRA;(J@`81n4YM#|8$gB3}-VY#&vo^nN=WNPcgM{{9Sjq9w(ls(<(MS*!o8b%13puE-Wn&605g7vSoO=)BC2(6B3TslN4=5X+^HY_I2;nVM4(5%I~hwBDl zmzqBD19sR6Dw0=bwXcp!9VUKr^+{)M7X8|&^7D5tBI)P!cMQ|tw}YNyVEy?HU8t{@ zFmI&i4+y-w%in_3Zg z{Zk7cp+Z%d5i$I6qvh4dzY0ZI>+wB&<^5Yfu;-nDk=hHv4-;bq22;FmOYD*31G95+ zx^i%{?$<)vNq6{~-2p9jqI~ru?)l{7^%>+u@S`p+S3n1ff^hT}${4Fg@e0^B4uj2v z;SUYGP(T}r5U-xrGq^hNQMP;4dfWxIz;MiwNw}CoCvv(h@`>Q+SlfGem-wZ%t(lKV zaev44&?yq6!V<1&9@%4pYnXC49{Y%ijeLnS6B$f6T<<{M81g^M zF>9F`rwTi~hUnd=mZmu{d{AZ%9#8~cA0^~X6`xvF-{%r5@wIc^TI62h)t~1hIIt^4 zj0k%U62)zbPG`(d_cak=HLrRgSiy$w$U(;eMn{l;v)(?t;=>QY=mKuY8B}AQHWI&xm3*nCa!Np`(Q#>?qW4rN(IsDua)gOji!L zNs6X!A-i9a=ng7O^Oy85iV;bh^nUDc!qDd6n03f|>ti>wef&^=(3Se`-bRKYqx-+I zoQA4BL!?AIfn-N}=WMKKARpyL&rwLBgH&BXkW6jy^Iqt)Qq612o`qqb4EVsqpVsdx zq|eMQas#Mq_gM%6h{io9+=hx-S=s`ogL=AKR!N^B!FWeg zpq;CT#`yn2D~xqCW-#U%MdA;{L0|{;RF#)Q8!CEchpWvSR^|Ec^HqyJwb>N!&j_Vb zIf<{_x^-Nbh;`(>25V4SHV|CkATI)*d88<#E|8YVe`DkYP^Ky@D*!0UcfaH}1A7n8 zuj(brx_+{PB!PN9X?7;S9`2Bvq1vV+nMX*KJee5NY|#iI?C6{cyV$(?ytveANnLR@ z*8MVbX(3PXf?e!vJ2j2uNjSYU{&M5%F?hz zjMvL{$@QfMS$WX}Jhst~j71fUI^kpKM$vC!ve=cM{N~I@(J2 zgqWHQ1AubV2LQ+XAQQnEqj%LIXKkPb+UB7^6Zs(zWj=rcVD1GMskZ2gg)0s$V0^xM zD=Uj5Z^czR=>Xrgyn^C4b$`!HA5KM9p?L}3BRWyqQ-KDlZ$JlyeCCrSi|K;`>b7Hz zZ;d}a^qJ3WFjM!tvuP?SA$nru>SY-p8lr0XT4rk!^)lv<1;Q@$Zf^%-(j}Rn=6A$5 zR+=6(usdS;l0LcZS5mqv{AN~LwfpzkOk-d1j4#mY3CL*0N5>FYh@{ddgYO#zatKJE z8uq**E3%K3h&;6|o!asenA`b28o!XTy-nL>bd=&fbMe@Gd|j1*MuZn%aQY3<81Rxz zdg!um<)L0yxE^_XLv@9zClyw_ zd}(_y@$t9FlO4-NCfq~!Pkcj7$2UsSChkO}aA;+!{f&PmQLeDhM%Sh6Kq?K@TYZC3 zHN-t-x3OoNZ$+(#DmCL~+V6eM-SsO_kT`RoQ}@zNS`KzQu=o2PT5mC7rchQcQ?Z%P zXq+w(a_@3XBgXMC*34_p`*h>sH|?wRT~YmXo-`^ksH=Z&b|tAdYR@3VVh08MO`#zZ z{aPhzyZCoWsHb0IUF+u6R$;L(`%~x5mOb|Q#D^QCFt%19jsla17&HFd%Vli0hzrBW zsw>=y{<24=m!Vs7@7#^s>;mc&s$Dz;Bm+O6|Dw$&rlD;bC#Xl5R^I!VGSoN{iD;ZX z=1ZAXS;Sm~XJ1Ta&xR&R5WWYC-$$-ZYwzX8x94i{Ul%!_c%o-0xJVfW$Y(^263mp9 z`7;1d=#CO@&TW-V_IE%kdCzTCKdi@wgbswM^8>7H+V>ZcczwJdfayt{L6Upg&7vZB z92t>If!nwDNfWMSF|8PsNXnU-;5AIKqq{^&yk_2B(i4KzhoTEzgT0O6nKWa8iKxe{ zLF#QUQzA5MWp4J1D!`%>%F>sS6!%+9f|WMQc4OckX|#x9=wwaWoN4*Mu_jZRsFVAmnSUh`-_i z%$ig?HZ*T{_~Y)6U(g~^T1u?F=j+m6PnX_$9`B~q!Ez>^gx-q75mo0`LW-Pdo$8;m z%0wc=s4JK$J-oLo0{^gXn#L&tL|=-tQk58kbm?02$wWMN%+`AAkUKU%Ed9pT;G?4f z?0g9H9cHRa;R-(kzH(?Q=OyOIatzK_(>6wP2K|aLbnv+#^mv3P=0kfa6v>Qm1wz0s zxG{UMr>e(T08yKW)`WpILUCwLd@6X{K->9!o`*k$3Kqc3xiS`+Jb3}>uoZuG1f-Uj zQ_Tp~Wmh00z%(y`EU|IonCuMi?=A`0fOF=YW19J)P(Gv0`U z={K%q_`yea%%Ak90j)k+Jb4=W)7nO56ym1|tHdX3a|A@(l}eFuQ@BpC+Z3kd$@_}S zmVcYH?zHWJ9At_F?2KfWck+R6Kj;)!%x0Lw2OG4p&jkxTkZ^C^I#HnKok_)niNU0R zN`U}+-nCZzL3NNa2r@RAPy@n{lO%5Fr?^%>K3JQ`m0 z$N103b%1w_TSmTq`up_CW6?^|RO}jQk9u#S2yfEUzAke0(xl#R7hWh5;@gI~t{0R) zU2P-1p&?$SUjKVe<2OI)QV*hnj*z^US;g8N=S!~*B)(kq$0 z^6Qtw!%sLB3)n2B;Qkit&F05IN#?wDg>L)d?8mycI1TtdS3X{BI6}EDOa$!u1=cnZ zCPu=EIR73?9{7eaWvwz3RoXXe03fg$CJ#Sq16Wn2LIZfD5SE!2bHXd>_7Hp_DeNX# zZ4yW73rYP|G`8wde0qSnz?UaK1tkCX=})WVU!h{*nDCgQutJ5d{QGYS_G(Mw)h2M~ z>Q}BO#bABGtjuz)ngYm0KCX?3kWztK=VJc8o^b&uLnY^S{(P&!&6}K$(~QuBX@AeU zOsA4JS-Y{(?KF)gLZp%J)W*$$;UYd&$l*0m&iwm6MpDDmjjF~kOXoG0rmx=*S$*B} zyYhLE9fXg&B|5E{0heyrA&#Z?+_dGS$%c-|7CeX#QnmBuw=gLSD-pG`(}Mt{ZJ5m| zkDc~Os}@oIe1aZyd%Pi&$ibU=`Qv5Nhp(+Np<#v*C^M`5gT*~2Rvsio78{wsn*<+T zq7Im7_@h_5mOx!3+`xnzHJl@Q^48EW0<+IWGD~q@U;&&ceSG729Cf~8vhv$b^)qZx z&#V$St}Cdp%P`4*VPy{?c1t8zr>@)HUY;X0Su;I<{#FdWZWQrE^K#`B)w5v6$;WF+ z(>tByL>KKEGTJHf4L}X9$(^$@+{$;E;{ZtcgfQn7d+2gC48!Wo8I;`b)@&8l0$0U}MFp^2 z>S_jVAr3_-oirR`@M`VE9b9|hS->>6XNSL&M)pm3liJK4g3HbgLujC@jcLhSgi))G zr>O?4gJK$T*~QJOWu;mc^=OW7R+(DoZ2DCa)t@3O>AQ8eVv?1TlQQ#E;afdK2{L|W z>A~3(Q*8Z+uSe#s#iE1mSlzJ-c7Gf94{WB$PhsuS;8>oHYl*FiY@Y5@T}=H(H5h6f z5*A_R|3_=ZZ>lsL1$9OKBN2Y^WopUMw7}lBG(vtvi1MchKW0i>bwV)1QYh2gBnw~6 zVaA_;zAmjJ$-$MeFDL^O74l|O6nBLS)iTWl<=uPpAL(11<~NX-!q8Crd2KJIyIMnL zy@$E@$~;gZV_d{r$3H*W;QU6;VvVyWjY<1{cu48LvBT~1-0hC+SHZ4vk{1YZR#0j? z!CEC3A2MObgQeQXI%|B_4s_C0WB+xeYgPA$ok+NTK0I`mMeBoi?sF#>)y- zm6d&Bhn=JH8Je?DUEG%v} zLGpyoN)4<+<8Am0OIad*5EK3n798 zqYFErJddrsK67z=JN@b;^e>R~xOv0!?mhDzeqKKh>huKO7HR#V{CtLHOcph=r! z)jAJp;zTCntL_rNf<9Udsb9D5ROR?%(mv4(Z2d(SoZvkY5Prgjc`%h-?45Wajp?=~^l z;l(ovbX!2T4k+wki^Q&?Zt;|kjU2zIYA0>V!2kz7u?9q9^F&02Az?uI#%WT5!H71N zSEM>bzSaVbD1ww2*M4PAc;LL7tJ1v_?nG2Nwjf?R^AC?>Sw)N7V{PJ>5;Rar*2vL1n z-RArjpF~YZdNzyC8zR}(ly%z5MXGOLSAS%ZT$zCBy}#^CDgphQ>2rJj%at~dXK$HGR9~VR=<2wl(y}MDsedw<}jB!YAq0Fr#k-UO1br8o@ z%TO00CJoCxkYG&_dKAD=<|}NGy*`Q@)`h|^(a(5&pHy-D@ODzip8(*beq zmEvG!Xd0UKQ!jhSP|q5Ty@vPgJ>*7iv>Aq>*pyu^#v9|rgnLft7#N~mhfcrWOL_UX z+Rzv6(LM2)JH3V|o9>3G1@&P@BAMrL3*s#f{FtlgY6M0)k( zs-I3HNC)T*MFb+g_BTkaUc=Y)OoR0$nx*dhdC)^VTn`ehHOl1%!mG{|;AbL$d065M zPp29n+2e##a#b=dRVe2SF2gP{QRU0)_l7RZ#1oqNU>6r|L~`UmS%J#T(($}>TNiAu zsQ-XjVpIUwbLlC`zV&pAux-8rBCqd`5LrnFER%^<3^hH5$=&Hb=P~s1Bx7LQw&OdoExK%>ai~gGsEsE(mZE9ZDF_?!v7uk{{P7 z#MGVQP~R|0y{RW32MOT0ED2z6ZZIwY#aq?o^}uPKo}8rFB1SwGIAS3AO2VRxkHklp z4Vj>f@MnX%O2;e0@(lR>-sm7&9X=%(Jb>{^=9Y}3X`Ft<0!ofZvv0&9l!(00eeqDS zyv&$iUxF9t_kIO)JZqR@$H|+fJD*MOiU+i8Xf9HcQ;+uJa%^RR<<1$2l0`~_A$^)9 z{hUA=M-JJi&nc#wu!&X=BfG!WhA`mQr&D~nVE6F4bu^te+m6gXZJ6eHQY77;R^I!T z0-xcba91Rj53OJ^(Tp!!y{pzSO^&>_)qflo0?O`31=2MFxcJ`gLj0s54_}qUWNg4= zn)W^~(aDF2oz0s8N*7SM8A59ao>1V#t_e2L@D<2FGG3-}cW^nyNE^@xSyTW!FGo-m z;vhd#-oW=tg|D$GiGfTBGFgCIcl~bwaeJGY&!I0jmydV1tosuGDx`Oq=>K#3 z*U$gX{`3C7_upv+$0z^%)j_u0iM{bM@ze4DE|?XS*HM!Hi~n}(yULf3^XIj{omgLb zwNVbrQ{U>z;@Pk0Rjw~jaYKWzR~EtLQ!cwC@88Qa&MG9E0oD!et~|^8<<4)>X=cg@ zCz69W7QIavt!U;$2TUvlL>JZ={M2O*jN#g2z0phR)-pVIVeFyrlS}lmC?+Gh52OE%WL{ymxBEY4JanS3hw_5`<<^;+(YW~KZiK|hsCM;OSFUy9 zo+aJk>%*kO*1w;vSqwew>hr1JvVxA$w93P1l)Fx^Ji?`ZNLeC1-;b-r{v zR1KFo-CypHgtMOvj+`W!SM=`&iAW(Gc(r~5^Gi=R=U6XC$Z~Y==}tVFmc}qULG~=Z z;A)azUgUVYT(B}3Fhbxoj4hdQ3h3EQC>A@7)Ivkdgou%0yhw}6tHM6Y4+x=xfThNcJU`ON1yPp%-@Z!|MJ&(*lNy&HPUP36hDPtr!vyLL`9qu6aVF|HJER{ zjXHz-_Xh3t!+33NnEUH`ZLxB0ti_iB@mo52h%vvgh9UeMVxU}@$ShA7lBOce5s z3`3M|$O2l}BWVyHnvNtVQ%MpC^_ z@Vc}wE;>mCJ*j=8xFy7VUK6G2@iHH24z0GZ<=eFIrdUI|D$1(cPd{BQ^k5~ODigLR z7`*fRj7ix^T=$PqH5^@MP2`xE>5-aIih(ZWaMbD4_%_hhu(#DOBz=?5KYJvs*vtz@ zgFRAUGsi#<^d1SI-dqkdaV+{<+S6}Cbtp@6wck6=^r!Y&)5buYG~3lE_Xu}XB46Rv zjQ^HKrEzoYe7Bp{JEUjqoQj`2L3M_u$6OECi)UXbXw172-a6pZ+>v*w7rMlK*gg%z zPP$N<{JafZ5ew^^bEu=+#cSjNyc*f!5(^E|ag2%DPs3gn7;}tiVJIvEdq#+6GwEJ0 z3_$4E6;$tI`VeKFNtxZ}Ff1_HNmebukdxdY4iL~!*d_GG+T3rly}yw_NK&B3$1EiH zq-%U5sNmYSI$29hMrUtGyo)wmz76KcP`@40j4x8ZF)%#>%juS8cO!U#9^S)NKa)BwB5I-#uvv@jM`BEzX*1u?`{x0HJzny=ou)k zHt7+|`Z8%lm!`*TQnG?FWuVJnCFFk=3_VM71rVp5I>p~s z9k_KA_XVrC3tzwr_&%XyNj1rHYQ9RdvJlEoy1+s}g*)s;~bY~5>+qe#}$e?agPY-J& zk#rb4<kqT;SUEtNx-v9cqKo|Y zB8NtoBTxuDN$Y_JFVeq>HUO87Ie*1+sOCKQPhQ*yVRpk;2yN=o1VD3wt;&F1%-QDgln(L zW~$Zzb%&SCTYI)WwEB)0z1F|a`1$WPoM44iFx5L<4zaXC%l5TuRJ8euu}|(w^RMjP z11+1K2T>{8>$OZ7EnR|iLC1l#>(9juqAZC`5y+0@p4C25Kj6Ex zY;&8J{h?F$yYW3i10Y&yP5-(yCQQ6yB)5tVZ1OP93pa01-n?|_Cu;ML9bQsuAAZ3N zPKSgUR{HuddORDg@-3(>%x*|nVGEkiO#IcT+@t{oV1a_#9GyCjO1mt< zXlBTvc*xw&DlQIN4pwo&$yq<}e+^f|8FgKL93Ive9xS~YJxP)yaCzH!vV1^9dLWe; z&=%e&UNHPhJ#I?cY_%-Bj>=LrTThzhMs{|Y;G}Th9HR^pZ8*=L%X{LZ;=@=K?>uIf zf=f$`-Oef-3o;2Nq}z&wGgZ{sIHVdxR%0n)p*rLe%5JcRRwug>XMvh8h7)Py==e_J z?t$)2FU7Ig6KTGHJNgz$O;Qz2EjCiKi>~rnFB}ELhZCSS)$m|JWAPW_6;c{AJHx{D zxZHr^Je}sMTzMs8k5q}jfcj^Y2YuN zS_I0>j?}o4ion>!qTVjFF z{_z{*0x&rbm2D8FMR=z)vS-U=Y-q%erKh<-t1mrrh$uMbR6Im98H)-)A#B z$~5p2z}6Ofp(a5|xI&4fO~$9&&JYRXF^kTc(@57>UBSzd4-odklI{>;fK%U}bsrXQ zO{pMn^-_M9Z?HYSbMIERbcT=Rb>9@ft;0v(2Vx#ylr~HssNX95@A`j#|1$aM<;#12 z246Q=+rn#GU;8e_g8y56;h*ZRpVxMH{Ut8B&!w7fh0;&L%_;voQu|mPReSBya_(ab z&X4v~Z_N0JRi~)h(0M*#*tfwOVfwshA!$kHhY8*01v1CGV66=NvV#3hVxq1v94NW~v)7z0F_aa9B2feVKJjv{Jhf z6hBi!rq6nhdXsyqXKXyvU|2y;4(8sZ89jA>TTNM`XoPF4dYyIAcj(!=fdiCI|vSzym z@9v384BYk@p1?@@BE!PL;=4x)yKeWIjm*tOK-nU)8xEB~(b8r4jL2LEyl7XE-k3c@ z}V}{npZ_1G$t)vLqFX&`LZ`L&)oeEJjzp z^X`l&|A6sh^z0J(CFW>;C{Awl*3hBR-L0a<%wFfi*M~{pxv2h49Bo>`|B6?X>4+5r z;}zwKdDmKW>AhcL$m0222|>(D&K^_O3tG~+R;ZwqH*yNBJ4>eanXzH_g~3GGt6r~^ z6=#b8KudYrd%xvwQ^Prb+zY1hBSAfFcrW_?(sP}9-RJHSFdO3x6ZeTQo3XrQ$80Ig zFm4Wj=Ew+OfWcb(;lrnIw+60X&k|Q zcDrlQpR=@DzJLA6U(x7iGpnA7KkC-|6M0GE@#dpR&7Fe=D=n71rx$+TH>wKpimWk) zgX_`!=ZK9W1ghHAE-(J#$!cq*S>X2jCDYtPCM9K*VQchEYEB$WB2!ln~y2G4Yu|$)py)D6CH~h zoWe}tu|cti;X%^r1VnVeVOQk$&&}R}+`l`D*NFQ82%5(G1Uc%+x3qH0AggpQg0Ub3 zZQ{zHCBaSZe0FW;PVLox_%MO9=sxU!@`R*-yvM-xP?=XQf9&opg!pZ)ryx$ue(fcM zpZ?*Gze@hge@thA^P;`zb9-1ol4JI`xGY64-H)p0z37tW?&R_W*`>$Y+ng;Gf3eei zxSTw?s$Um~;4MW05Ppd-Qg}2)-YIubpV++`5gHmn4web>-zvMN<4eBQUAnT`bHofR z`tc>0ozP2UYSlCH67bCm;I}YEagQP*2*48U_;H`TZTY`{Uf&SM#0nQ_fF>u3wqGX! zZ5#uC6F5Z<{Jpc4ycyWr{QV8?-i^H+CTC(Gz1ASTnh0}&C4@h}??ZMTm(`2b$WQp% zZW1`ne){GbnJTCiv;QWtIayx2_t0piMysVQ(!EBqV<|eKQp_o%sRQx&$jzZ+KKj{v zB;tss0!`m8@^B*sy&OnCX5I=9&nu)!G^hcBZEmbQpf0z1A$%+Q_m14y(B=T8#?u3Z zwn8m0#10$7)l>{JFd=gm5wpQ??Y|eqAFLj$dh2w zYL31OHjQr>*VX1hd*ol^>@;4H<>^S`$}-@To91$O7i^?gf^SV^cuICihVg(2 z`7IO6vctltycM{Lr?cxi6kjhk(e(57>#xZLEg#4W4Mp5x?`{2tr}<-If{H4TGq*l4IXaatPVQFjS_e8)YF+WFrgT~+3f)9 zN1b=*WG5G4nwp@E`X&N*jefZ!HX@Lc2||~MILH8Qb>3id7+^regYq%mpRiXh@p(B))n+3h?Bz@E0Tc~zP4^bKc0A@(lkE{pNM=oV@sy}H@ zT*?+wqTAv!fH#b8=EqeRXL619o?Nl{@|mS=_(i z{V(j2fmY;az%(}xV)$|?n{Uux{h6ks;ApP;?0kQO@Nq!S-YWC2upSHgG6LSgMK>d% zwp|&2ylB_IdYHPj-VBHOTYt#o=nUKf6Ql1l*xE4j8|H-LiD&RGP0dp zw1s&WL-j*g|M;WIrr1dG0eNoGh$&sZ!R@Fr;%)X0^&ZLTr}yO3T07KZAVqC*m}lg* zwtjD(1N&ZG&%oDOezX=tX#Oc+_mj4YuBQ~7 z8Y(S#$zp0`Vq>j`wS4yxS$?SNed5m-(*Ha9ckBJZa5mRJj@xaO)-FX)TcdW3h@#F>t5(!V ztcYVJWYHo~wEY{UcI}nY7EuzR5{VL8YL94*ge0UxX^n8YIGyM3?ep@!p6kA^-}rpK z8>C~ay@`B{m5M}7-wg*#?nN9&R~XJ-X!Dn>hg7>g=Rb0Xc4rIsJexhyRNLl-$B>Hd zrq8(gZc2gyo*C`?u8vY0h<<;7P*;9m}S;Sy=>u6iXX}tCvgG zirz7eJ4HezY`Pmh!Y!Jv3E!a_@d?{X$f{Sth-eC#x8BN7hWkPJ7dvir?z9K}3KdKS zedZaG%kf_$_^HUtr2@)1tZL`?32<}|qZYd%5;zU&%~t*EhczKjAubB~kgkEE(7nS> z7Y;vRm=jA(NvxN!3oE97hA!KLc1;&Qf8%0xc;!!tZ_dW}R>}f;=Ue%E1YoF^l2|VZQBgkY`Gzq;(kI`pTFJ`04Z9Ndy6b>^+;~Y!A3Ch* zKMUTPS%49)N%|?1F!XP=JE&9}3F$)YOy#80d#`0sugOUdeILWuPjSr8Q%u})xbnuP zm~VI)9Hgr@2ZQMABKM@+kdJU%X<$~mk|fa@0om1uD2Bhptu#j|sYg<3CbBiBDCR9E zD>2>zFeUmW z>8r<>dT41K5H!POpo56bxwe-l$920#;lRc%M)&*nWQ{=2HY`Ou+_+UoUtgILNOu7H zfmj9}TJj!#4CQ{j0m`7uzB$_Jd_pprgauoD4F z7J35P%@-`MoC3wK2OU))XrPzMGnOi+Q+i5GeSt8Vxus;Lxz>Csw^O;?mTK*yi!d7* z{I14~L#l`6 z;vy_2Q|}=x8f3(eY%hn|o5*3b541CpF=m{ckwDL3IeY1}h)HUgsEQ}=xtSbN>iKy2 zu%2$Fyq472Fw@#}RfJ3!MhX}ya#$km%!sPKm3(||2QDb?+yk1HaVm}>&j-~m5dS5%WcHFk<${M;;a~7?IyKi ziQ^DT_nTUMykix$g|Fi~+Y{{2c z$9_8)XSvRNLLbWd5|~0ntnL-HBl%U&_Pah$BNNI4kyBo>AUcE5L_ZJ&#jBgi8wMn^ zFe3joUiPDaRxbW8Kp4Ph1R#%DnSS?TT)QKe_r6y>p>Pm>b*lhf6rRVD)LTkC^-=2X z$nwSE5be{f!k)3a+hdBzALU8H)3)b9>=4a;1JOczk;iZTeZ8k{vini<#{SPi=+IEc z|86?HvP-&=x_d$Jb@3x$=d(imKTm(&*)1$cU46%VdgJdyVk{e@)*f+uVDn@H@fCpWdPl}9Tlf*0N~zCUiYA}|L@LKN-#3KmXM$lGwA@2&06CiqXP zJcnzx|D>0rir5doV*>U<%oJ=m+vNPo;SUa${+lwx3FEfbgkEvIrI2n4*%Qp}54Iw8 zkV>ni9`fNqq1l;6=YM~?eofyCEJ{kRAh$Q92LwUGEtSGer~88@GzMX)d*x7}^@#`l z?vpdJw27Nl6TBMNRE8yRRW?WMlE0O)C45e6A4$htjuS9s>`5sjc9@ltNu5mn7E#P` z6|NM^7W6r0NtZGbHkfT}K@L-tx5}-7z09*lVTp*q@atA(W|I8{{)M({KBX$f2!AB& z;K{{+jMg!w(+U;GJ>L3IvDTKmDya!>ZFFfZmnHDR-lVyu<5XLFs#Yh2zqP5Ek2S&b z805vDn}8RGqXAz0@t*3^d(BVYRvP-r$L2;L+Y7zJA4Xtd9)67qjSGPX%buuF?9*)a z6YO19`(yn|T{|?AqE7}xD!QH+sn-}TmURWIH>`$F%%79lZjY`}s!vg+@aE&==Ht~0 zWzg1tM&TlN>k^*zZ*3dXZ ztA#P>Ye>2xcGoKsj5-fVRyUi>sC;f3;jSU&EG?HIcaV-G6(OUdk#h#|;=}f(QRLfLM zT=hcBzXnp!w;)TlGJ zv-&2Dr;W-J30fC)l|zM>zqP=)g31@x(TAGYJ4 zkqe6bEa48LvxtEYCi??}0-g-^nwPp>W1?ZiiuO7$D_HTo=DV}{D2=Hr{%>& zCw09Ga(@Bx0~iR;9;fYIGi%Yovmz3Cd_wQD++QgA&sA;3O9|Zke=`1i`}fsQU#HQ` z{G;-HHrH~pj7nrOY@-ipjZ{5}!^^?`{rzB8a_nY&&`yNZZ=hVlSt%P?EBEgIQLle5 zYj?cI1eN*TE=*1{*;&~7ruky=#|_cUQ602>m4}n5-kyu%Rc`x?-Y%sv&T+AFmm#FI zhyMunNQh>W8TUXm+xm2@Gq1c=C!br3dcTrN82PcYn6hU>5PGv|6lnadgWN7ZVuV4} zj!hz{#{jI>%dgqF-|NyMT53_j3N6VlDO3|Y))}qgi}kf~O&C80ba&V0ygRQ1@CneQ z?mZlv_tZC5`TDSpl*QJ9CJ=Dv3GBd|g1;RBC2-_GLj6NDI)YFY-h-Wc>FI^eC7Rw} zxvW_P>+eb2%gAeo;J}l68)af$l07877HH4U;Be047B;ibUuQgvMNLC&8y!12f`hcS zclsxr>Sm%y5nht(bMTuGlHm!kG6Wn#lWydxz>c&Yb*hw&G0LK*@KH$P^CT>3Qz1;+ z&JuOPKW!;fUh#~|=c2v-8@7dh1|W{{%{#$vKhYD3XWrL!rW99>jn zDx8_(e4mKczd7`-7K*B=QDipj6$=zh44>$2lS!-=SPmd@s ztd1Cd()UTCn_T5$*4=-QRRLKo;#D?JwU8XL8JG#4_R-uhyTTC#!@>B$NnOi}=VK~c zXUoGYWCvI&Jug$4+@#(9kp5F?fkA`@taQF*)aOK=5e99_j2-P;cE8ng$bEY@wjYlU z-d$#B9QPjp28xybc@HH%l7hEgNpUS;SVp+KzV^}m5z*}Z5^Y}fQSzYOR5pSCR)?Lf zV?OU(t31@uioLBLp`Z?Gz#^fae62doI_=YnEYCq$^I4ZI~B zBkToLC40}I0weDBBa)DFx<#l2m`iMn?g@=#$N1vrvtEDi>?k*>U4@K2wmdr9u(C(; z7BV3Cygx>O%8WpIhCHYJdV(-`%9zz&f}vP6B21@tzK?iwQ-}{!a$j0AB>-}e0VdNDmF-6!$2TB~n*pBj3wAvICcKrzLFSq~t(f;b^oZ#l= z@BQSJl%m0b)6M^INU0TDeb|L%#%G-Vk9a<=dlo`D64`2GTg0a_52orUId!&1ywO3Y zA#HG0wR&mQI@I%pWR%Eou8-VHpD&*!YB}+x5thprYYNNmZ-P2LRc~D&%MHG363LHx z`(*Xg#7yQCx^Y%4_U+$=E+3N~i0pMfxhUoPKgpb-ro{(kxzFXt1gpOYnN{p`yGL#= zpSow=!L~J%g!mEAXad|qWOCgdj7V-;N6o{yRl6y>b^%pZ0nvs5 zHTVh?2I2>-u!CYxWAGG8Ztn_b3Zus2$UJZ6<{(@xJZbZOF4aVXHivj@DspVgu4?H)k#TxlrLJzvaevQwW1?@W=4BwV>mM)>|`Pha8S{6;?ZA&<+Wmrd*)Aj8cy0e zegN7$yO?-NeTMLAz~l43CtQ9i*ge%u=zg;o+6^@P^QPlG%$ z0|!Z!d`U@e-NvzWcQtblepp!>JF=tSx?Ix7!%Eqp5+Zw69S%#HhvEE`)2-4r+8Q7W zx|MTYq;?dEoUyYBhV(R;H)p1mf_*RP65(`QKsBoQCIno_Hi#?`4bETgENKRECpoO? zPUIT<6Lr&_s1342n@K~nnp2zrJl$cH2OxMD*~L5|WXHUd(+p$LTBj~TiHnT3Sn`#R zn~c}PE+eH-Ppmh#zqOWr8?-XLJhbX0Rl)SryN9-G*u0-E@ zUtChszw9C8>~=-3r^#95)vS-M@_LK9%I`HB#2YvSwK~8r)ll7yV{GiX@m+YTx3%)= zaSd*<5(25k74*(AA~+FqCynPnw+HjIJ=@cW_qNiuvVD!^{Li^e7)=Hux?8#UU>16| zb|S4!ta>f11AW}3OXZ@u88+d;Xb#d*-LlN|?KPRk5ZY$)V}ts-AIUftx)NX;^;mT% z$2Ir+G2^}A_5}gC&GO3ye!=r0L3sSPtM`A?P1%@A_1Ec{EMXfjINxnJ1N1Tnbc{gl zsVF2^SFep$+s7f*kMScWO-C*irvW07*@vA9ZkNcXtNO}}78cZ>D3?7@2Z?IIgPiil zz4N;&yS&xHD`O;zS;r*SB=g6Qn#dFFn`R{qAAaEZR~{s~6m!zV%nM4=RizvcbiRkp z#6?b42dYFy9BwEFy*JGft?mp0evEkxm|Ai*5?5ti@EngBWhn%@s6}YY+(^8yLT=_1 zaV_MaVEC%?XSvZxrU}O6h@z>%;9$Z5xPCHY`^(kj;DH#^4;;*cNl8wziVM1e3r;P_ zIRPysVIEd5Y4!^?T?6fyeQGCw#^h1_q9eaf=CWEQiE{50)Op%+J_T6J8643Mmt@;nv4HfKMQ)YPbuHO=kH-3*Rdt&^=Bc?F4pzuo+$r# zFglX;j9$UN8l$g<%-FORH~>}pDw$qQUJp|&N6xhBlL^fQdb-&n8K%w1m``5{!nLhM z!b((&6lv{Dw^X~oe%=_YTIqfZ;hS8gVMzWxU|^Uyg-H>tlR&Nq2_-BTD= zX}l)fE!(=eZ2Kb4@#)dt%b#tFPX7{Yg;|WS>>A7PL-#X-|FjZd!j5rioI#hVj zh}RD{xS^cpH?wZ~_2WvXrex#rj*K$Dtlu?OcTBL@OQvEw2>pO5|D+eCecX^A%#}kH zp=b(mbTM>>W*nBue)z~Zl6HR{v5PGx`0a=C!Tnsn%@Fn_Xy;Db1`|aBkA_rGTHN&f znmy>0qnTy<8IhfqQT$VLDsk@JRltj?8O9^^&%0Wes%DT5I+f*-PS$xkK)FcUe_7g# zUC}W|2?Q=uy+jssjsaFjsz(LV#~#_m(o}}Qo-eM10^5_4PcgZIzThW;0l{JYQvvnp}YA|G)V~V45gW< zs*Utr7PFwwj83k}YFQ!|n?2B6{|VPfsA$^?sseW)IR{wR#E0s8`hpScW3kJLJRR%$wKv(|HlMw|xG8Sv5ib*E zIEmQM7EJN(Mf)j3U-j>|nQOvHvpGi}t)94-_leOS8qhZ9LYjrUjZ9J6Cr6*0)q#9o zcEUl}kP=k+33_ZHpEDX8nD`;)$EM2hq0#D5>Okpaa1+ySJu&*h!sf#QUl&V9dY3La z?J5p3muR40krQr{)6gQ-i9(Vplp0IT8NHVm+b>b7?)D(XbUg&Mk@=lL)zh2iFr>7B zXh6Z5Y$2v~8ax-yy3GKr$)7BBu5_-iWCL2+87DG(;ObV;3Kn3xQc+)l+S6v~yNJH# zQL8+sC0hn`7S^&c!u^KDOlv!XshSl2B_^(~HDjdm@Vo#!%1?fqD<6qW{+5mE=prEZ zi>$?Cprb+#!nWU7ixW?CFL807$R|}c8R+FwtJ^Kz=_M$`+Wrh}Vh~wUx4oZwNlnzA zzqI9&>qe7MH$v2o06eBV{k|csaRTDHCHwQ8QorHgww}?aWg-gSF>fX;8PUY^tPu!=QqTmxYSrvp> zvQgL3&IoWbyh$Nq|>x-t)!Wp>Tfm74nSeZ>9c}M!GOI>PWcqoNba z$eBs%M%ibpODo)w?UDZCO=fHz$vB;biZ zJrLJ;@81utPS^NPoIbrJmNtY32fXuAdG8^2_>d?Xq=4_s0|rdDXJ-RagLxW50P-d< z0^UBXE2HekuvO0ns!8!1pmd!8N6aZ6q+pxa%X;VIoNDSkVwhT&-cwf+-C z`P$bCH{}oUAIDq$iBC+3PinSE##pj%@SLc`>6`0z8=Te5Zc zj@Q#YP=utPnN?c#7w|_x>OS`qq&JFbJIZ*p$lLph-tO7N%+7TS+C!trOjKll>N=v` zMGNbX-ll$Be%3AfN@6yI8hy7U8oc8^N@r|VG8Ay1>ugfzw|ohtl=xD4<%pLn0{a>` zz=J?o;oEgs)3mSkBeHcufAcg1kmRzTmmXC2Fz$RG3#KDEK|85%W~X4rK*+f zYjKRE-hSoac|NA?Oy@Qtc|o_UXPSE@IR8RmyTL2MeplYD`%ibq`k-G>T2;2NsAXN; zsglJgqsFPkFeu4&8REGGo?u@$hwZ6OSF97uP;g zeO@Qq7mm|_t{nkxOQY}nv6g~u?8mk%M4#NPJ|R&We6Q;g{LACyJHWdu`_wFI#V}}# z?t-|OD}P!!V-i1R03k*3lYq|xyxDf_>CI7Yl2yQe+iN>utqESx7A(DI3k0F}&>(IG z&@BH(6M2s=0CUP7VrF>wnO2lAsEDLU8q-IVo>9?ojEsQz7fghME!=93 zdM80hF$9;>Dq(V>E;W#-EvoUbn6?oZn}l9@BvApHP(5n;5JvYh{w(irs6|HnF?$h9 z>Uq6X)0s8PV?5uB4dR}QwT(YS&0)Uc` zIEwho#_qGh%;(M{LN28fPk4an0<~fvNQ%B=vG*=~7g}+p-v+tgO^J$saTTaACVn6? zGFg7dQYObx@{I9Dgc|HN7IozAD)ZTrP3oC1cuT&C*50`8;OPm2$EetqboYfWJ)$mH zkyw=#d=yPkK|gPhaRJI-kQTW#zBDX0a9B=6t~e)M^-Y|a$N{xCCuLN}>cH^B7f?`XOC}*47)a;=5 zLJlp?O|K#SnS=4`VaCWCT_<2x9|gTrZwI%^g=fF1`V9$sCuxsZREw=i*SA44y}6sD z@2=|?Fkf%}{J60k{mSir(Q5ho<*#3(xY@Q=z9fe+w<8nqhg{I!e>j~%-G zmPW2NK2!qyYP{0hee44!U1t01+rFs1-Y1-0q22#n|40~LC#^6ybo^3PhDPsMPYd`M zf(6v5gv*Ey#B$=T7B((6r!3cRe2BG*zKb(B1g%(Z@HKAbfzyI4S(T=iSlb;C)z}!j zIL>KHQB&5k?Zg6=yW;{1UlL=Nw?17Vn=n(m+k4;qiu1qLkRluqAdP; ziD-n_b``$Fdh^rdGDli4y1%!4zP|Nn^GS{CuZOV%#)1vIaIbC<;rN#%+DHas&L|z! z#;Nq?pM`M!!;KlG*n@?j#|OFc86djoLBl^qM)?sId0@}3c19ThoKDe1wuU!9){FFmDC4jjp=PlEKfnjGihnjWS7B6yj^ zEkPuO%Q_oaWfH2FF-v|j&3K9laQ;w@BDp_bFlaC+DH~~;4!E|UssA9cAnQX5cMd0+ zCJ&Ge3=(-V@@d9>!Q08ulOP$X>Qp+2e_4> z;*l$xxGR7tsND%Di3Jv*SC+OI0OY~_#y7x_{k!`;V;x3jRSWRc3b-J!miE5ci0}Kg z?d4o?=Wuluz81TLc%R4 zhJaQf2hBAbW9Rxf!*97gC6;z?2U`Z|0Y*sV96{xJLbd#QT_pdHnfY#&xt%qWIMh51 zyq8@<|J4=n>Zi-yuP<&NKRMcikvJ10 zK|pZBETU*?)M!@=6>&2&Z=k)nh&=1CT2A`gOEUU5sbzqYDDVU#@Zr!SNOcvJ2;-Z)|@glYK} zKOf#Tk$O4W+J*1vQN|b^d~`P5<+3uDP^QCg;;x_%+j%W4Ps|5*LXf!?)^23LGyj_|-A% zyRfyS?|z5mP?HkxvjSINgCu?w%k=|;rHZO%omFK{X`gg$bpBH%*g7Z9XgrktG-0r% z)n%B$hSk8H_`h1R*k-}_Lz?RLbfHNszcB>+Ig4h94YZuA&uFyVtkz!JGWo>-zt1wMGA*i7RON2UX256g%PM774>27mS~)v# zWOC-?QZ~C4|3)t)y7%&FlbD?*wg9BnxN@s`wFfsH7DIp{`7sQvzugq((bO~vI~;+% z5;hpR5`jL&=6neg_?!iQ-qU?_4QD~^!)>nHz9{lxEu*smpN!ysv@mFt4-nqS4nq37 zpdU|8&%Hh=Iutt|QzpL+M|P5fI*^?~p4`e_v?dwo7qvxzJvLMEkX})G+}jO_^s|7e z$7qYFJ}TS&2p9ry5)BT%)i`)^js)r@Infl=l=Gi%VB@fmpz1{m&-J=|UR;_VZtPbSB z1ZA-0KY-HoJT4yi8FO$$7>Q(?NBiNgI{P?3RGpHVy3LwAc7=>9!ivquSdl_Ioa6RU z7S5Q6vntXPKrp|Yq3f|}8nZMGRHLK)xgpF?FL#^`<0|?fk&x_g@&J&IJuvUxy7)MQ z9em{&atvjPll2R=tkqPE<=pz#zrlHsQLgO{`PAk2hV2dpH#q2Rc?M}3`sL)nuvsTt z^MklCoO?^UU9&l`ZoV(8tqbAlh~*naS|IM>NtDWyI44C=C0k*tE%u0|N49RaC~KUd zp?I`WEm!a3x>!Ub9q2+!3sML5U#os@Z&Ws$lbar){^`?lL5Aw8a3+-){)6ROZTd!{ zNlmjR3EllHWipZ*!a?Oe}9k6c=|M9gf^wbkC+=sCyD1e31by%$N


e<9Sj}VHG(+mBsn~#& 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

HxF`t;cPP7q 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 z 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�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�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±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%0AT6BOm;fMLkb2tV~@qY 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 rFDQgsXoa%b9>)b#GKp}hH{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"audio/FLAC","title":"FLAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/audio/FLAC.mdx","sourceDirName":"audio","slug":"/audio/FLAC","permalink":"/docs/audio/FLAC","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/FLAC.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"FLAC","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"ALAC","permalink":"/docs/audio/ALAC"},"next":{"title":"WavPack","permalink":"/docs/audio/WavPack"}}');var t=n(4848),s=n(8453);const a={title:"FLAC",sidebar_position:7},r="FLAC",c={},d=[{value:"Software support",id:"software-support",level:2},{value:"WAV to FLAC using FFmpeg:",id:"wav-to-flac-using-ffmpeg",level:3},{value:"WAV to FLAC using FLAC command-line tool:",id:"wav-to-flac-using-flac-command-line-tool",level:3}];function l(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"flac",children:"FLAC"})}),"\n",(0,t.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsx)(o.p,{children:"FLAC (Free Lossless Audio Coding) is an open-source lossless audio codec with widespread support & compatibility released in 2001. It represents the most efficent lossless audio format in common use today."}),"\n",(0,t.jsxs)(o.p,{children:["FLAC is commonly contained in a ogg container with either a ",(0,t.jsx)(o.code,{children:".flac"})," or ",(0,t.jsx)(o.code,{children:".ogg"})," extension. It can less commonly be used within a matroska container (",(0,t.jsx)(o.code,{children:".mkv"})," or ",(0,t.jsx)(o.code,{children:".mka"}),") for mixing with a video stream."]}),"\n",(0,t.jsx)(o.admonition,{type:"caution",children:(0,t.jsx)(o.p,{children:"It is not recommended to transcode a lossily encoded file to FLAC as the file size will grow tremendously while any quality loss from lossy encoding will remain. FLAC is best if you need to preserve existing lossless audio."})}),"\n",(0,t.jsx)(o.h2,{id:"software-support",children:"Software support"}),"\n",(0,t.jsx)(o.p,{children:"FLAC is supported by the majority of web browsers and media players in common use as of 2024."}),"\n",(0,t.jsxs)(o.h3,{id:"wav-to-flac-using-ffmpeg",children:["WAV to FLAC using ",(0,t.jsx)(o.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),":"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"ffmpeg -i example.wav -c:a flac example.flac\n"})}),"\n",(0,t.jsx)(o.h3,{id:"wav-to-flac-using-flac-command-line-tool",children:"WAV to FLAC using FLAC command-line tool:"}),"\n",(0,t.jsx)(o.p,{children:"You can include an argument of a number 0-8 to specify the compression effort, 0 being fastest and 8 having the highest compression."}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"flac example.wav -8 -o example.flac\n"})})]})}function u(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>a,x:()=>r});var i=n(6540);const t={},s=i.createContext(t);function a(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0092d9fd.e1425c83.js b/assets/js/0092d9fd.e1425c83.js deleted file mode 100644 index d5e2d9057..000000000 --- a/assets/js/0092d9fd.e1425c83.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9057],{3372:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var n=i(4848),t=i(8453);const s={title:"FLAC",sidebar_position:7},a="FLAC",r={id:"audio/FLAC",title:"FLAC",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/FLAC.mdx",sourceDirName:"audio",slug:"/audio/FLAC",permalink:"/docs/audio/FLAC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/FLAC.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"FLAC",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"ALAC",permalink:"/docs/audio/ALAC"},next:{title:"WavPack",permalink:"/docs/audio/WavPack"}},c={},d=[{value:"Software support",id:"software-support",level:2},{value:"WAV to FLAC using FFmpeg:",id:"wav-to-flac-using-ffmpeg",level:3},{value:"WAV to FLAC using FLAC command-line tool:",id:"wav-to-flac-using-flac-command-line-tool",level:3}];function l(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"flac",children:"FLAC"})}),"\n",(0,n.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsx)(o.p,{children:"FLAC (Free Lossless Audio Coding) is an open-source lossless audio codec with widespread support & compatibility released in 2001. It represents the most efficent lossless audio format in common use today."}),"\n",(0,n.jsxs)(o.p,{children:["FLAC is commonly contained in a ogg container with either a ",(0,n.jsx)(o.code,{children:".flac"})," or ",(0,n.jsx)(o.code,{children:".ogg"})," extension. It can less commonly be used within a matroska container (",(0,n.jsx)(o.code,{children:".mkv"})," or ",(0,n.jsx)(o.code,{children:".mka"}),") for mixing with a video stream."]}),"\n",(0,n.jsx)(o.admonition,{type:"caution",children:(0,n.jsx)(o.p,{children:"It is not recommended to transcode a lossily encoded file to FLAC as the file size will grow tremendously while any quality loss from lossy encoding will remain. FLAC is best if you need to preserve existing lossless audio."})}),"\n",(0,n.jsx)(o.h2,{id:"software-support",children:"Software support"}),"\n",(0,n.jsx)(o.p,{children:"FLAC is supported by the majority of web browsers and media players in common use as of 2024."}),"\n",(0,n.jsxs)(o.h3,{id:"wav-to-flac-using-ffmpeg",children:["WAV to FLAC using ",(0,n.jsx)(o.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),":"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"ffmpeg -i example.wav -c:a flac example.flac\n"})}),"\n",(0,n.jsx)(o.h3,{id:"wav-to-flac-using-flac-command-line-tool",children:"WAV to FLAC using FLAC command-line tool:"}),"\n",(0,n.jsx)(o.p,{children:"You can include an argument of a number 0-8 to specify the compression effort, 0 being fastest and 8 having the highest compression."}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"flac example.wav -8 -o example.flac\n"})})]})}function u(e={}){const{wrapper:o}={...(0,t.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,o,i)=>{i.d(o,{R:()=>a,x:()=>r});var n=i(6540);const t={},s=n.createContext(t);function a(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/015d9d66.c465fc5f.js b/assets/js/015d9d66.c465fc5f.js new file mode 100644 index 000000000..41f97d126 --- /dev/null +++ b/assets/js/015d9d66.c465fc5f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4598],{4893:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"metrics/PSNR","title":"PSNR","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/metrics/PSNR.mdx","sourceDirName":"metrics","slug":"/metrics/PSNR","permalink":"/docs/metrics/PSNR","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/PSNR.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"PSNR","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"autocompressor","permalink":"/docs/utilities/autocompressor"},"next":{"title":"SSIM","permalink":"/docs/metrics/SSIM"}}');var o=i(4848),s=i(8453);const r={title:"PSNR",sidebar_position:1},c="PSNR",a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"psnr",children:"PSNR"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>c});var n=i(6540);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/015d9d66.caaa4d35.js b/assets/js/015d9d66.caaa4d35.js deleted file mode 100644 index 566219577..000000000 --- a/assets/js/015d9d66.caaa4d35.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4598],{1854:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var n=i(4848),o=i(8453);const r={title:"PSNR",sidebar_position:1},s="PSNR",c={id:"metrics/PSNR",title:"PSNR",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/PSNR.mdx",sourceDirName:"metrics",slug:"/metrics/PSNR",permalink:"/docs/metrics/PSNR",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/PSNR.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"PSNR",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"autocompressor",permalink:"/docs/utilities/autocompressor"},next:{title:"SSIM",permalink:"/docs/metrics/SSIM"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"psnr",children:"PSNR"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>c});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.1d323d33.js b/assets/js/01a85c17.1d323d33.js new file mode 100644 index 000000000..74368f05e --- /dev/null +++ b/assets/js/01a85c17.1d323d33.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8209],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>P,Ki:()=>A,kJ:()=>b,x:()=>l,e7:()=>m,J_:()=>f,Gx:()=>y});var s=a(6540),n=a(9532),i=a(6803),r=a(4848);function l(){const e=(0,i.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=s.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,r.jsx)(o.Provider,{value:i,children:t})}function m(){const e=(0,s.useContext)(o);if(null===e)throw new n.dV("BlogPostProvider");return e}var d=a(6025),u=a(4586);const g=e=>new Date(e).toISOString();function h(e){const t=e.map(x);return{author:1===t.length?t[0]:t}}function p(e,t,a){return e?{image:j({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function b(e){const{siteConfig:t}=(0,u.A)(),{withBaseUrl:a}=(0,d.hH)(),{metadata:{blogDescription:s,blogTitle:n,permalink:i}}=e,r=`${t.url}${i}`;return{"@context":"https://schema.org","@type":"Blog","@id":r,mainEntityOfPage:r,headline:n,description:s,blogPost:e.items.map((e=>function(e,t,a){const{assets:s,frontMatter:n,metadata:i}=e,{date:r,title:l,description:o,lastUpdatedAt:c}=i,m=s.image??n.image,d=n.keywords??[],u=`${t.url}${i.permalink}`,b=c?g(c):void 0;return{"@type":"BlogPosting","@id":u,mainEntityOfPage:u,url:u,headline:l,name:l,description:o,datePublished:r,...b?{dateModified:b}:{},...h(i.authors),...p(m,a,l),...d?{keywords:d}:{}}}(e.content,t,a)))}}function f(){const e=l(),{assets:t,metadata:a}=m(),{siteConfig:s}=(0,u.A)(),{withBaseUrl:n}=(0,d.hH)(),{date:i,title:r,description:o,frontMatter:c,lastUpdatedAt:b}=a,f=t.image??c.image,x=c.keywords??[],j=b?g(b):void 0,N=`${s.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":N,mainEntityOfPage:N,url:N,headline:r,name:r,description:o,datePublished:i,...j?{dateModified:j}:{},...h(a.authors),...p(f,n,r),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${s.url}${e.blogBasePath}`,name:e.blogTitle}}}function x(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function j(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var N=a(6347),v=a(8774),C=a(1682),k=a(9169);function y(e){const{pathname:t}=(0,N.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,k.ys)(e.permalink,t))}(e,t)))),[e,t])}function A(e){const t=(0,C.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function P(e){let{items:t,ulClassName:a,liClassName:s,linkClassName:n,linkActiveClassName:i}=e;return(0,r.jsx)("ul",{className:a,children:t.map((e=>(0,r.jsx)("li",{className:s,children:(0,r.jsx)(v.A,{isNavLink:!0,to:e.permalink,className:n,activeClassName:i,children:e.title})},e.permalink)))})}},8027:(e,t,a)=>{a.d(t,{A:()=>O});var s=a(6540),n=a(4164),i=a(7823),r=a(4581),l=a(1312),o=a(4096),c=a(6342),m=a(1107),d=a(4848);function u(e){let{year:t,yearGroupHeadingClassName:a,children:s}=e;return(0,d.jsxs)("div",{role:"group",children:[(0,d.jsx)(m.A,{as:"h3",className:a,children:t}),s]})}function g(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:s}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,d.jsx)(d.Fragment,{children:e.map((e=>{let[t,n]=e;return(0,d.jsx)(u,{year:t,yearGroupHeadingClassName:a,children:(0,d.jsx)(s,{items:n})},t)}))})}return(0,d.jsx)(s,{items:t})}const h=(0,s.memo)(g),p="sidebar_re4s",b="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",x="sidebarItem__DBe",j="sidebarItemLink_mo7H",N="sidebarItemLinkActive_I1ZP",v="yearGroupHeading_rMGB",C=e=>{let{items:t}=e;return(0,d.jsx)(o.OU,{items:t,ulClassName:(0,n.A)(f,"clean-list"),liClassName:x,linkClassName:j,linkActiveClassName:N})};function k(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,d.jsx)("aside",{className:"col col--3",children:(0,d.jsxs)("nav",{className:(0,n.A)(p,"thin-scrollbar"),"aria-label":(0,l.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,d.jsx)("div",{className:(0,n.A)(b,"margin-bottom--md"),children:t.title}),(0,d.jsx)(h,{items:a,ListComponent:C,yearGroupHeadingClassName:v})]})})}const y=(0,s.memo)(k);var A=a(5600);const P={yearGroupHeading:"yearGroupHeading_QT03"},_=e=>{let{items:t}=e;return(0,d.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function w(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,d.jsx)(h,{items:a,ListComponent:_,yearGroupHeadingClassName:P.yearGroupHeading})}function B(e){return(0,d.jsx)(A.GX,{component:w,props:e})}const G=(0,s.memo)(B);function H(e){let{sidebar:t}=e;const a=(0,r.l)();return t?.items.length?"mobile"===a?(0,d.jsx)(G,{sidebar:t}):(0,d.jsx)(y,{sidebar:t}):null}function O(e){const{sidebar:t,toc:a,children:s,...r}=e,l=t&&t.items.length>0;return(0,d.jsx)(i.A,{...r,children:(0,d.jsx)("div",{className:"container margin-vert--lg",children:(0,d.jsxs)("div",{className:"row",children:[(0,d.jsx)(H,{sidebar:t}),(0,d.jsx)("main",{className:(0,n.A)("col",{"col--7":l,"col--9 col--offset-1":!l}),children:s}),a&&(0,d.jsx)("div",{className:"col col--2",children:a})]})})})}},9158:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(6540);var s=a(4164),n=a(1312);const i=()=>(0,n.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var r=a(1213),l=a(7559),o=a(8027),c=a(6133),m=a(1107);const d={tag:"tag_Nnez"};var u=a(4848);function g(e){let{letterEntry:t}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(m.A,{as:"h2",id:t.letter,children:t.letter}),(0,u.jsx)("ul",{className:"padding--none",children:t.tags.map((e=>(0,u.jsx)("li",{className:d.tag,children:(0,u.jsx)(c.A,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function h(e){let{tags:t}=e;const a=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[s]=t;return a.localeCompare(s)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return(0,u.jsx)("section",{className:"margin-vert--lg",children:a.map((e=>(0,u.jsx)(g,{letterEntry:e},e.letter)))})}var p=a(1463);function b(e){let{tags:t,sidebar:a}=e;const n=i();return(0,u.jsxs)(r.e3,{className:(0,s.A)(l.G.wrapper.blogPages,l.G.page.blogTagsListPage),children:[(0,u.jsx)(r.be,{title:n}),(0,u.jsx)(p.A,{tag:"blog_tags_list"}),(0,u.jsxs)(o.A,{sidebar:a,children:[(0,u.jsx)(m.A,{as:"h1",children:n}),(0,u.jsx)(h,{tags:t})]})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var s=a(4164),n=a(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(4848);function l(e){let{permalink:t,label:a,count:l,description:o}=e;return(0,r.jsxs)(n.A,{href:t,title:o,className:(0,s.A)(i.tag,l?i.tagWithCount:i.tagRegular),children:[a,l&&(0,r.jsx)("span",{children:l})]})}}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.ee34b9e6.js b/assets/js/01a85c17.ee34b9e6.js deleted file mode 100644 index 9243252a4..000000000 --- a/assets/js/01a85c17.ee34b9e6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8209],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>P,Ki:()=>A,kJ:()=>b,x:()=>l,e7:()=>m,J_:()=>f,Gx:()=>y});var s=a(6540),n=a(9532),i=a(6803),r=a(4848);function l(){const e=(0,i.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=s.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,r.jsx)(o.Provider,{value:i,children:t})}function m(){const e=(0,s.useContext)(o);if(null===e)throw new n.dV("BlogPostProvider");return e}var d=a(6025),u=a(4586);const g=e=>new Date(e).toISOString();function h(e){const t=e.map(x);return{author:1===t.length?t[0]:t}}function p(e,t,a){return e?{image:j({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function b(e){const{siteConfig:t}=(0,u.A)(),{withBaseUrl:a}=(0,d.hH)(),{metadata:{blogDescription:s,blogTitle:n,permalink:i}}=e,r=`${t.url}${i}`;return{"@context":"https://schema.org","@type":"Blog","@id":r,mainEntityOfPage:r,headline:n,description:s,blogPost:e.items.map((e=>function(e,t,a){const{assets:s,frontMatter:n,metadata:i}=e,{date:r,title:l,description:o,lastUpdatedAt:c}=i,m=s.image??n.image,d=n.keywords??[],u=`${t.url}${i.permalink}`,b=c?g(c):void 0;return{"@type":"BlogPosting","@id":u,mainEntityOfPage:u,url:u,headline:l,name:l,description:o,datePublished:r,...b?{dateModified:b}:{},...h(i.authors),...p(m,a,l),...d?{keywords:d}:{}}}(e.content,t,a)))}}function f(){const e=l(),{assets:t,metadata:a}=m(),{siteConfig:s}=(0,u.A)(),{withBaseUrl:n}=(0,d.hH)(),{date:i,title:r,description:o,frontMatter:c,lastUpdatedAt:b}=a,f=t.image??c.image,x=c.keywords??[],j=b?g(b):void 0,N=`${s.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":N,mainEntityOfPage:N,url:N,headline:r,name:r,description:o,datePublished:i,...j?{dateModified:j}:{},...h(a.authors),...p(f,n,r),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${s.url}${e.blogBasePath}`,name:e.blogTitle}}}function x(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function j(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var N=a(6347),v=a(8774),C=a(1682),k=a(9169);function y(e){const{pathname:t}=(0,N.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,k.ys)(e.permalink,t))}(e,t)))),[e,t])}function A(e){const t=(0,C.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function P(e){let{items:t,ulClassName:a,liClassName:s,linkClassName:n,linkActiveClassName:i}=e;return(0,r.jsx)("ul",{className:a,children:t.map((e=>(0,r.jsx)("li",{className:s,children:(0,r.jsx)(v.A,{isNavLink:!0,to:e.permalink,className:n,activeClassName:i,children:e.title})},e.permalink)))})}},8027:(e,t,a)=>{a.d(t,{A:()=>O});var s=a(6540),n=a(4164),i=a(263),r=a(4581),l=a(1312),o=a(4096),c=a(6342),m=a(1107),d=a(4848);function u(e){let{year:t,yearGroupHeadingClassName:a,children:s}=e;return(0,d.jsxs)("div",{role:"group",children:[(0,d.jsx)(m.A,{as:"h3",className:a,children:t}),s]})}function g(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:s}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,d.jsx)(d.Fragment,{children:e.map((e=>{let[t,n]=e;return(0,d.jsx)(u,{year:t,yearGroupHeadingClassName:a,children:(0,d.jsx)(s,{items:n})},t)}))})}return(0,d.jsx)(s,{items:t})}const h=(0,s.memo)(g),p="sidebar_re4s",b="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",x="sidebarItem__DBe",j="sidebarItemLink_mo7H",N="sidebarItemLinkActive_I1ZP",v="yearGroupHeading_rMGB",C=e=>{let{items:t}=e;return(0,d.jsx)(o.OU,{items:t,ulClassName:(0,n.A)(f,"clean-list"),liClassName:x,linkClassName:j,linkActiveClassName:N})};function k(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,d.jsx)("aside",{className:"col col--3",children:(0,d.jsxs)("nav",{className:(0,n.A)(p,"thin-scrollbar"),"aria-label":(0,l.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,d.jsx)("div",{className:(0,n.A)(b,"margin-bottom--md"),children:t.title}),(0,d.jsx)(h,{items:a,ListComponent:C,yearGroupHeadingClassName:v})]})})}const y=(0,s.memo)(k);var A=a(5600);const P={yearGroupHeading:"yearGroupHeading_QT03"},_=e=>{let{items:t}=e;return(0,d.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function w(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,d.jsx)(h,{items:a,ListComponent:_,yearGroupHeadingClassName:P.yearGroupHeading})}function B(e){return(0,d.jsx)(A.GX,{component:w,props:e})}const G=(0,s.memo)(B);function H(e){let{sidebar:t}=e;const a=(0,r.l)();return t?.items.length?"mobile"===a?(0,d.jsx)(G,{sidebar:t}):(0,d.jsx)(y,{sidebar:t}):null}function O(e){const{sidebar:t,toc:a,children:s,...r}=e,l=t&&t.items.length>0;return(0,d.jsx)(i.A,{...r,children:(0,d.jsx)("div",{className:"container margin-vert--lg",children:(0,d.jsxs)("div",{className:"row",children:[(0,d.jsx)(H,{sidebar:t}),(0,d.jsx)("main",{className:(0,n.A)("col",{"col--7":l,"col--9 col--offset-1":!l}),children:s}),a&&(0,d.jsx)("div",{className:"col col--2",children:a})]})})})}},9158:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(6540);var s=a(4164),n=a(1312);const i=()=>(0,n.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var r=a(1213),l=a(7559),o=a(8027),c=a(6133),m=a(1107);const d={tag:"tag_Nnez"};var u=a(4848);function g(e){let{letterEntry:t}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(m.A,{as:"h2",id:t.letter,children:t.letter}),(0,u.jsx)("ul",{className:"padding--none",children:t.tags.map((e=>(0,u.jsx)("li",{className:d.tag,children:(0,u.jsx)(c.A,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function h(e){let{tags:t}=e;const a=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[s]=t;return a.localeCompare(s)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return(0,u.jsx)("section",{className:"margin-vert--lg",children:a.map((e=>(0,u.jsx)(g,{letterEntry:e},e.letter)))})}var p=a(1463);function b(e){let{tags:t,sidebar:a}=e;const n=i();return(0,u.jsxs)(r.e3,{className:(0,s.A)(l.G.wrapper.blogPages,l.G.page.blogTagsListPage),children:[(0,u.jsx)(r.be,{title:n}),(0,u.jsx)(p.A,{tag:"blog_tags_list"}),(0,u.jsxs)(o.A,{sidebar:a,children:[(0,u.jsx)(m.A,{as:"h1",children:n}),(0,u.jsx)(h,{tags:t})]})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var s=a(4164),n=a(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(4848);function l(e){let{permalink:t,label:a,count:l,description:o}=e;return(0,r.jsxs)(n.A,{href:t,title:o,className:(0,s.A)(i.tag,l?i.tagWithCount:i.tagRegular),children:[a,l&&(0,r.jsx)("span",{children:l})]})}}}]); \ No newline at end of file diff --git a/assets/js/03af419f.15f9e88f.js b/assets/js/03af419f.15f9e88f.js new file mode 100644 index 000000000..dc93eeccf --- /dev/null +++ b/assets/js/03af419f.15f9e88f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9305],{8619:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"encoders/VVenC","title":"VVenC","description":"{t.d(n,{A:()=>s});t(6540);var a=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function s(e){let{children:n,hidden:t,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,s),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>w});var a=t(6540),r=t(4164),i=t(3104),s=t(6347),l=t(205),o=t(7485),c=t(1682),u=t(679);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const r=(0,s.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,o.aZ)(i),(0,a.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=h(e),[s,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:i}))),[c,d]=m({queryString:t,groupId:r}),[f,b]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,u.Dv)(t);return[r,(0,a.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:r}),g=(()=>{const e=c??f;return p({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),b(e)}),[d,b,i]),tabValues:i}}var b=t(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(4848);function x(e){let{className:n,block:t,selectedValue:a,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=o.indexOf(n),r=l[t].value;r!==a&&(c(n),s(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>o.push(e),onKeyDown:d,onClick:u,...i,className:(0,r.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function V(e){let{lazy:n,children:t,selectedValue:i}=e;const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===i));return e?(0,a.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function j(e){const n=f(e);return(0,v.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(V,{...n,...e})]})}function w(e){const n=(0,b.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var a=t(6540);const r={},i=a.createContext(r);function s(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03af419f.85fed8d0.js b/assets/js/03af419f.85fed8d0.js deleted file mode 100644 index 5cb203293..000000000 --- a/assets/js/03af419f.85fed8d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9305],{1865:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var a=t(4848),r=t(8453),i=t(1470),s=t(9365);const l={title:"VVenC",sidebar_position:12},o="VVenC",c={id:"encoders/VVenC",title:"VVenC",description:'{t.d(n,{A:()=>s});t(6540);var a=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function s(e){let{children:n,hidden:t,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,s),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>w});var a=t(6540),r=t(4164),i=t(3104),s=t(6347),l=t(205),o=t(7485),c=t(1682),u=t(679);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const r=(0,s.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,o.aZ)(i),(0,a.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=h(e),[s,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:i}))),[c,d]=m({queryString:t,groupId:r}),[f,b]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,u.Dv)(t);return[r,(0,a.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:r}),g=(()=>{const e=c??f;return p({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),b(e)}),[d,b,i]),tabValues:i}}var b=t(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(4848);function x(e){let{className:n,block:t,selectedValue:a,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=o.indexOf(n),r=l[t].value;r!==a&&(c(n),s(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>o.push(e),onKeyDown:d,onClick:u,...i,className:(0,r.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function V(e){let{lazy:n,children:t,selectedValue:i}=e;const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===i));return e?(0,a.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function j(e){const n=f(e);return(0,v.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(V,{...n,...e})]})}function w(e){const n=(0,b.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var a=t(6540);const r={},i=a.createContext(r);function s(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03e95fdf.2b32f9af.js b/assets/js/03e95fdf.2b32f9af.js new file mode 100644 index 000000000..2f6a4c101 --- /dev/null +++ b/assets/js/03e95fdf.2b32f9af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3485],{9909:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"video/VP8","title":"VP8","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/VP8.mdx","sourceDirName":"video","slug":"/video/VP8","permalink":"/docs/video/VP8","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VP8.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"VP8","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"VVC / H.266","permalink":"/docs/video/VVC"},"next":{"title":"VP9","permalink":"/docs/video/VP9"}}');var n=t(4848),s=t(8453);const r={title:"VP8",sidebar_position:4},c="VP8",a={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"vp8",children:"VP8"})}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(i.p,{children:["VP8 is a video compression format developed by On2 Technologies released in 2008. It was later released as a royalty free codec in 2010 by Google. Its efficiency is competitive with ",(0,n.jsx)(i.a,{href:"/docs/video/AVC",children:"AVC"}),". VP8 was a significant player in the royalty-free codec space and was used in various applications like web video delivery. It is the precursor to ",(0,n.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"}),", which both further improve video compression efficiency. VP8 has faced criticism for having a messy specification that many considered to be incomplete."]})]})}function u(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>c});var o=t(6540);const n={},s=o.createContext(n);function r(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03e95fdf.a11034af.js b/assets/js/03e95fdf.a11034af.js deleted file mode 100644 index 7809a40b3..000000000 --- a/assets/js/03e95fdf.a11034af.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3485],{1789:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=t(4848),n=t(8453);const s={title:"VP8",sidebar_position:4},r="VP8",c={id:"video/VP8",title:"VP8",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VP8.mdx",sourceDirName:"video",slug:"/video/VP8",permalink:"/docs/video/VP8",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VP8.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"VP8",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"VVC / H.266",permalink:"/docs/video/VVC"},next:{title:"VP9",permalink:"/docs/video/VP9"}},d={},a=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"vp8",children:"VP8"})}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(i.p,{children:["VP8 is a video compression format developed by On2 Technologies released in 2008. It was later released as a royalty free codec in 2010 by Google. Its efficiency is competitive with ",(0,o.jsx)(i.a,{href:"/docs/video/AVC",children:"AVC"}),". VP8 was a significant player in the royalty-free codec space and was used in various applications like web video delivery. It is the precursor to ",(0,o.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,o.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"}),", which both further improve video compression efficiency. VP8 has faced criticism for having a messy specification that many considered to be incomplete."]})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>c});var o=t(6540);const n={},s=o.createContext(n);function r(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/04dda763.032833c7.js b/assets/js/04dda763.032833c7.js deleted file mode 100644 index 52023fae2..000000000 --- a/assets/js/04dda763.032833c7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6778],{3763:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var t=i(4848),s=i(8453);const r={title:"AV1 for Dummies",description:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.",slug:"av1-for-dummies",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"},{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","compression"],image:"/img/av1_for_dummies_guide.jpg",hide_table_of_contents:!1},o=void 0,l={permalink:"/blog/av1-for-dummies",source:"@site/blog/2024-06-24-av1-for-dummies-2.mdx",title:"AV1 for Dummies",description:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.",date:"2024-06-24T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"}],readingTime:16.645,hasTruncateMarker:!0,authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4",key:null,page:null},{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4",key:null,page:null}],frontMatter:{title:"AV1 for Dummies",description:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.",slug:"av1-for-dummies",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"},{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","compression"],image:"/img/av1_for_dummies_guide.jpg",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Codec Wiki: One Year Later",permalink:"/blog/codec-wiki-one-year-later"},nextItem:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",permalink:"/blog/svt-av1-second-deep-dive"}},a={authorsImageUrls:[void 0,void 0]},c=[{value:"Introduction",id:"introduction",level:2},{value:"Why AV1?",id:"why-av1",level:3},{value:"Do's & Don'ts",id:"dos--donts",level:3},{value:"Tools",id:"tools",level:2},{value:"GUI",id:"gui",level:3},{value:"CLI",id:"cli",level:3},{value:"Conclusion",id:"conclusion",level:3},{value:"Encoders",id:"encoders",level:2},{value:"SVT-AV1",id:"svt-av1",level:3},{value:"rav1e",id:"rav1e",level:3},{value:"aomenc (libaom)",id:"aomenc-libaom",level:3},{value:"SVT-AV1-PSY",id:"svt-av1-psy",level:3},{value:"Conclusion",id:"conclusion-1",level:3},{value:"Final Conclusion",id:"final-conclusion",level:2}];function d(e){const n={a:"a",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Compare",src:i(8632).A+"",width:"2048",height:"1080"})}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/AV1",children:"AV1"})," is a royalty-free video codec developed by the Alliance for Open Media. It is designed to replace ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/VP9",children:"VP9"})," and presently competes with ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/VVC",children:"H.266"}),". AV1 is known for its high compression efficiency, which the marketing will have you believe reduces file sizes by up to 50% compared to ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/AVC",children:"H.264"})," and up to 30% compared to ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/HEVC",children:"H.265"})," across the board. It is supported by several major browsers and is widely used across many streaming services and video platforms."]}),"\n",(0,t.jsx)(n.h3,{id:"why-av1",children:"Why AV1?"}),"\n",(0,t.jsxs)(n.p,{children:["Before we dive in, it is important to understand ",(0,t.jsx)(n.em,{children:"why"})," you may want to use AV1 instead of other codecs. The reality is that AV1 is ",(0,t.jsx)(n.em,{children:"not"})," better than H.264/5 in every single scenario; video encoding is a complicated field, and the best codec for you will depend on your specific needs. AV1 excels in:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Low to medium-high fidelity encoding"}),"\n",(0,t.jsx)(n.li,{children:"Higher resolution encoding"}),"\n",(0,t.jsx)(n.li,{children:"Encoding content with very little grain or noise"}),"\n",(0,t.jsx)(n.li,{children:"Slow, non-realtime contexts (e.g. offline encoding)"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The enumeration above still consists of broad strokes, but the point is to understand that AV1 is not a silver bullet. It will not automatically make your videos smaller while preserving your desired quality. To make things more difficult, the ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/x264",children:"x264"})," & ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/x265",children:"x265"})," encoders are very mature, while AV1 encoding efforts designed to meet the extremely complicated needs of the human eye are still in their infancy."]}),"\n",(0,t.jsx)(n.p,{children:"This guide focuses almost entirely on tools great for offline, non-realtime encoding for various kinds of content. Streaming is an altogether different application of AV1, and is only covered sparsely here."}),"\n",(0,t.jsx)(n.h3,{id:"dos--donts",children:"Do's & Don'ts"}),"\n",(0,t.jsx)(n.p,{children:"Due to a lot of misunderstandings about codecs and compression, there are a lot of common misconceptions that are held regarding video encoding. We'll start by outlining some bad practices:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Don't"})," encode the same video multiple times. This is a common mistake made by people new to video encoding. Every time you encode a video, you lose additional quality due to ",(0,t.jsx)(n.em,{children:"generation loss"}),". This is because video codecs are lossy, and every time you encode a video, you lose more information. This is why it is important to keep the original video file if you frequently re-encode it."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Don't"})," blindly copy settings from others without understanding them. What works for one person's content and workflow may not work for yours. Even the default settings on many encoders are not optimal for most content."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Don't"})," assume that higher bitrate equates to better quality. Inefficient encoding can waste bits without improving visual quality, and efficient encoding can make lower bitrate video look drastically better than higher bitrate video using the same codec."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Don't"})," assume all encoders/presets/settings/implementations are created equal. Even given two encoding frameworks that use the same underlying encoder, you may achieve different results given encoder version mismatches or subtly different settings used under the hood."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Don't"})," use unnecessarily slow presets/speeds unless you have a specific need and ample time. While slower presets improve encoding efficiency most of the time, the quality gains reach a point of diminishing returns beyond a certain point. Use the slowest preset you can tolerate, not the slowest preset available."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Don't"})," blindly trust metric scores. It is unfortunate how trusted ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/metrics/VMAF",children:"VMAF"})," is considering how infrequently it correlates with visual fidelity in practice now that it has become so popular. Even the beloved ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," is not a perfect one-to-one with the human eye."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Now, let's move on to some ",(0,t.jsx)(n.strong,{children:"good"})," practices:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Experiment with different settings and compare the results."}),"\n",(0,t.jsx)(n.li,{children:"Consider your content type when choosing encoding settings. Film, animation, and sports all have different characteristics that benefit from distinct approaches."}),"\n",(0,t.jsx)(n.li,{children:"Try to use CRF for offline encoding, as opposed to CBR or VBR. While the latter two are effective for precisely targeting a particular bitrate, CRF is more effective at targeting a specific quality level efficiently."}),"\n",(0,t.jsx)(n.li,{children:"Always use 10-bit color, even with an 8-bit source. AV1's internal workings are much more suited to 10-bit color, and you are almost always guaranteed quality improvements with zero compatibility penalty as 10-bit color is part of AV1's baseline profile."}),"\n",(0,t.jsx)(n.li,{children:"Consider using grain synthesis for grainy content, as AV1 can struggle with preserving film grain efficiently."}),"\n",(0,t.jsx)(n.li,{children:"Keep your encoding software up-to-date; the encoding world moves quickly."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"tools",children:"Tools"}),"\n",(0,t.jsx)(n.p,{children:"Since writing the last guide, there are now several versatile tools available for AV1 encoding. Below, we've assembled some tables of popular encoding tools and their features."}),"\n",(0,t.jsx)(n.h3,{id:"gui",children:"GUI"}),"\n",(0,t.jsx)(n.p,{children:"Here's the key:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Encoder(s)"}),": The AV1 encoder(s) the software uses or is able to use. This is between ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"}),", ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"}),", ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1-PSY",children:"SVT-AV1-PSY"}),", and various aomenc forks. We'll get into this more later."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Ease of Use"}),": How intuitive the software is, especially for beginners."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Complexity"}),": How flexible the software can be for advanced users."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Efficiency"}),': How "good" the underlying encoder(s) are. This is more subjective, but tools with bad defaults, misleading options, or slow release cycles won\'t score well here.']}),"\n"]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Name"}),(0,t.jsx)(n.th,{children:"Platform(s)"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Encoder(s)"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Ease of Use"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Complexity"}),(0,t.jsx)(n.th,{children:"Efficiency"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/Aviator",children:"Aviator"})}),(0,t.jsx)(n.td,{children:"Linux"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"SVT-AV1-PSY"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{children:"\u25cf\u25cf\u25cf\u25cf\u25cf"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/nmkoder",children:"NMKODER"})}),(0,t.jsx)(n.td,{children:"Windows"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,t.jsx)(n.td,{children:"\u25cf\u25cf\u25cb\u25cb\u25cb"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://github.com/Av1ation-Association/Av1ation-Creations/releases/",children:"Av1ation Station"})}),(0,t.jsx)(n.td,{children:"Any"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,t.jsx)(n.td,{children:"\u25cf\u25cf\u25cf\u25cf\u25cb"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://github.com/staxrip/staxrip",children:"StaxRip"})}),(0,t.jsx)(n.td,{children:"Windows"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,t.jsx)(n.td,{children:"\u25cf\u25cf\u25cf\u25cf\u25cb"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://github.com/Alkl58/NotEnoughAV1Encodes",children:"NEAV1E"})}),(0,t.jsx)(n.td,{children:"Windows"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,t.jsx)(n.td,{children:"\u25cf\u25cf\u25cb\u25cb\u25cb"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://handbrake.fr/",children:"Handbrake"})}),(0,t.jsx)(n.td,{children:"Any"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"SVT-AV1"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{children:"\u25cf\u25cf\u25cb\u25cb\u25cb"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://github.com/cdgriffith/FastFlix",children:"FastFlix"})}),(0,t.jsx)(n.td,{children:"Any"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,t.jsx)(n.td,{children:"\u25cf\u25cf\u25cb\u25cb\u25cb"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator",children:"rAV1ator"})}),(0,t.jsx)(n.td,{children:"Linux"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"rav1e"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,t.jsx)(n.td,{children:"\u25cf\u25cb\u25cb\u25cb\u25cb"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://autocompressor.net/",children:"Autocompressor"})}),(0,t.jsx)(n.td,{children:"Web"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"SVT-AV1"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{children:"\u25cf\u25cf\u25cf\u25cb\u25cb"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"Our top pics are:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["For beginners: ",(0,t.jsx)(n.strong,{children:"Aviator"}),". If you are on Linux and you want zero hassle whatsoever, Aviator is simple but highly effective. As a Flatpak application, it ships a bundled SVT-AV1-PSY binary that is up-to-date, compiled efficiently, and handled with extensively tested defaults. It is hard to go wrong with Aviator even as an advanced user, despite its simplicity."]}),"\n",(0,t.jsxs)(n.li,{children:["For advanced users: ",(0,t.jsx)(n.strong,{children:"Av1ation Station"}),". Av1ator Station is thoughtfully designed to be your one-stop shop for video encoding. Even though it is brand new, it has proven itself to be a capable and reliable solution for advanced video encoders that have a lot of settings to tweak and encodes to keep track of."]}),"\n",(0,t.jsxs)(n.li,{children:["For Windows users: ",(0,t.jsx)(n.strong,{children:"StaxRip"}),". StaxRip is a long-standing, well-maintained, and highly flexible video encoding tool that supports a plethora of encoders and formats. It comes bundled with SVT-AV1-PSY and is a great choice for Windows users who want a powerful and versatile tool for video encoding."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cli",children:"CLI"}),"\n",(0,t.jsx)(n.p,{children:"In the terminal, advanced encoders can explore a much greater degree of complexity than many GUIs allow. That being said, ease of use is still a consideration when managing complex command-line encoding workflows. Let's begin with the key:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"We're omitting the \"Platform(s)\" column here, as this section targets Linux users. As a Windows user, WSL has you covered - as a Mac user, you're likely to experience parity with Linux (most of the time)."}),"\n"]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Name"}),(0,t.jsx)(n.th,{children:"Framework(s)"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Ease of Use"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Complexity"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Features"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Scene Detection"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"SvtAv1EncApp"}),(0,t.jsx)(n.td,{children:"None"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/ffmpeg",children:"FFmpeg"})}),(0,t.jsx)(n.td,{children:"Itself"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an",children:"Av1an"})}),(0,t.jsx)(n.td,{children:"FFmpeg"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})}),(0,t.jsx)(n.td,{children:"Av1an"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://github.com/kingstefan26/alabamaEncoder",children:"alabamaEncoder"})}),(0,t.jsx)(n.td,{children:"FFmpeg"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"Our top picks are:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["For beginners: ",(0,t.jsx)(n.strong,{children:"rAV1ator CLI"}),". rAV1ator CLI essentially walks you through the process of writing Av1an commands. It can install binaries for you, save your previous commands, and detect scenes via Av1an. This makes it a great choice for beginners who want to learn the ropes of AV1 encoding without diving into the deep end headfirst. For advanced users, it makes rapidly writing, testing, & cataloging Av1an encoding commands much simpler."]}),"\n",(0,t.jsxs)(n.li,{children:["For advanced users: ",(0,t.jsx)(n.strong,{children:"alabamaEncoder"}),". alabamaEncoder is a powerful and flexible tool that allows you to encode video with FFmpeg and AV1. It is highly configurable and supports a mind-bending array of powerful features that would be hard to find elsewhere. While the tool is still new, it is already a great choice for advanced users who want to push the boundaries of what is possible to incorporate into an encoding workflow."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"conclusion",children:"Conclusion"}),"\n",(0,t.jsx)(n.p,{children:"In conclusion, the best AV1 tool for you will depend on your needs and experience level. If you are a beginner, Aviator is a great choice for Linux users, while StaxRip is a good option for Windows users. For advanced users, Av1ation Station is a powerful and versatile tool that can handle numerous encoding tasks. If you prefer the command line, rAV1ator CLI is a great choice for beginners, while alabamaEncoder is a powerful tool for advanced users. No matter which tool you choose, it is hard to go wrong in the modern AV1 encoding landscape when it comes to your utility of choice."}),"\n",(0,t.jsx)(n.h2,{id:"encoders",children:"Encoders"}),"\n",(0,t.jsx)(n.p,{children:"The world of AV1 encoding is diverse and complex, with several open-source encoders available, each bringing its own set of strengths, weaknesses, and unique features to the table. In this section, we'll dive deep into the characteristics of four major AV1 encoders:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"SVT-AV1,"}),"\n",(0,t.jsx)(n.li,{children:"rav1e,"}),"\n",(0,t.jsx)(n.li,{children:"aomenc (libaom), and"}),"\n",(0,t.jsx)(n.li,{children:"SVT-AV1-PSY"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Understanding these encoders is crucial for making informed decisions about what best suits your specific encoding needs."}),"\n",(0,t.jsx)(n.h3,{id:"svt-av1",children:"SVT-AV1"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"})," (Scalable Video Technology for AV1) is an AV1 encoder library and application developed by Intel, Netflix, and others. It has gained significant popularity in the encoding community due to its impressive balance of speed, quality, and scalability."]}),"\n",(0,t.jsx)(n.p,{children:"Links:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Wiki page: ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"})]}),"\n",(0,t.jsxs)(n.li,{children:["Git repository: ",(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1",children:"https://gitlab.com/AOMediaCodec/SVT-AV1"})]}),"\n",(0,t.jsxs)(n.li,{children:["Documentation: ",(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/README.md",children:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/README.md"})]}),"\n"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Performance & Scalability"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SVT-AV1 is renowned for its encoding speed, particularly at higher speed presets."}),"\n",(0,t.jsx)(n.li,{children:"It leverages parallel processing, making it exceptionally efficient on multi-core systems. Fun fact: SVT-AV1's parallel processing is lossless, so it doesn't compromise quality for speed."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Quality-to-Speed Ratio"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SVT-AV1 strikes an impressive balance between encoding speed and output quality."}),"\n",(0,t.jsx)(n.li,{children:"At faster presets, it usually outperforms other encoders in quality per unit of encoding time."}),"\n",(0,t.jsxs)(n.li,{children:["While it may not achieve the absolute highest ",(0,t.jsx)(n.em,{children:"quality per bit"})," possible, its quality is generally considered impressive for its speed."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Flexibility"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SVT-AV1 offers a wide range of encoding options and presets, allowing fine-tuned control over the encoding process."}),"\n",(0,t.jsx)(n.li,{children:"It provides 14 presets (0-13), with 0 being the slowest and highest quality, and 13 being the fastest but lowest quality."}),"\n",(0,t.jsx)(n.li,{children:"Advanced options allow users to adjust parameters like hierarchical levels, intra-refresh type, and tuning modes."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Continuous Development"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SVT-AV1 receives frequent updates and optimizations, with new releases often coming alongside big changes."}),"\n",(0,t.jsx)(n.li,{children:"The open-source nature of the project encourages community contributions and rapid feature development."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1 is an excellent choice for a wide range of encoding scenarios. It's particularly well-suited for:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"High-volume encoding operations where speed is crucial"}),"\n",(0,t.jsx)(n.li,{children:"Live or near-live encoding of high-resolution content"}),"\n",(0,t.jsx)(n.li,{children:"Scenarios where a balance between quality and encoding speed is required"}),"\n",(0,t.jsx)(n.li,{children:"Users with multi-core systems who want to leverage their hardware efficiently"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Some downsides include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Higher memory usage compared to other encoders"}),"\n",(0,t.jsx)(n.li,{children:"The developers assess quality via its performance on traditional legacy metrics, which harms its perceptual fidelity ceiling."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"rav1e",children:"rav1e"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"})," is an AV1 encoder written in Rust & Assembly. Developed by the open-source community alongside Xiph, it brings a unique approach to AV1 encoding with its focus on safety and correctness."]}),"\n",(0,t.jsx)(n.p,{children:"Links:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Wiki page: ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"})]}),"\n",(0,t.jsxs)(n.li,{children:["Git repository: ",(0,t.jsx)(n.a,{href:"https://github.com/xiph/rav1e",children:"https://github.com/xiph/rav1e"})]}),"\n",(0,t.jsxs)(n.li,{children:["Documentation: ",(0,t.jsx)(n.a,{href:"https://github.com/xiph/rav1e/tree/master/doc#readme",children:"https://github.com/xiph/rav1e/tree/master/doc#readme"})]}),"\n"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Safety & Reliability"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Being written in Rust, rav1e emphasizes memory safety and thread safety."}),"\n",(0,t.jsx)(n.li,{children:"This focus on safety translates to a more stable and reliable encoding process, with reduced risks of crashes or undefined behavior."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"High Fidelity"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"At high fidelity targets - an area where AV1 usually lacks - rav1e is a strong contender compared to other encoders."}),"\n",(0,t.jsx)(n.li,{children:"It excels in preserving fine details and textures, making it a good choice for high-fidelity encoding."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Quality"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"While not typically matching aomenc or SVT-AV1 in pure compression efficiency, rav1e can produce high-quality output videos."}),"\n",(0,t.jsx)(n.li,{children:"It often achieves a good balance between quality and encoding time, especially at medium-speed settings."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Perceptually Driven"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"rav1e's development is driven by visual fidelity, without relying heavily on metrics."}),"\n",(0,t.jsx)(n.li,{children:"This focus on perceptual quality leads to a stronger foundation for future potential improvements in visual quality, as well as making the encoder very easy to use as it does not require excessive tweaking."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"rav1e is well-suited for:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Projects where stability is paramount"}),"\n",(0,t.jsx)(n.li,{children:"Users who prioritize a community-driven, open-source development approach"}),"\n",(0,t.jsx)(n.li,{children:"Encoding tasks where a balance between quality and speed is needed, but the absolute fastest speeds are not required"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Some limitations of rav1e include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Lagging development compared to other encoders"}),"\n",(0,t.jsx)(n.li,{children:"Slower encoding speeds compared to SVT-AV1 at similar quality & size"}),"\n",(0,t.jsx)(n.li,{children:"Fewer advanced options compared to other encoders"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"aomenc-libaom",children:"aomenc (libaom)"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"}),", based on the libaom library, is the reference encoder for AV1. Developed by the Alliance for Open Media (AOM), it is the benchmark for AV1 encoding quality and compliance."]}),"\n",(0,t.jsx)(n.p,{children:"Links:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Wiki page: ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"})]}),"\n",(0,t.jsxs)(n.li,{children:["Git repository: ",(0,t.jsx)(n.a,{href:"https://aomedia.googlesource.com/aom/",children:"https://aomedia.googlesource.com/aom/"})]}),"\n"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Encoding Quality"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"aomenc is widely regarded as the gold standard for AV1 encoding quality."}),"\n",(0,t.jsx)(n.li,{children:"It often achieves high compression efficiency among AV1 encoders, especially at slower speed settings."}),"\n",(0,t.jsx)(n.li,{children:"The encoder squeezes out nearly every last bit of efficiency from the AV1 codec, making it ideal for archival purposes or when quality per bit is critical."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Encoding Speed"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"aomenc is generally the slowest among major AV1 encoders."}),"\n",(0,t.jsx)(n.li,{children:"It offers 13 CPU speed levels (0-12), but even at its fastest settings, it's typically slower than other encoders at their slower settings."}),"\n",(0,t.jsx)(n.li,{children:"The slow speed is often considered a trade-off for its high compression efficiency."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Extensive Options"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"As the reference implementation, aomenc offers the most comprehensive encoding options."}),"\n",(0,t.jsx)(n.li,{children:"It provides fine-grained control over nearly every aspect of the AV1 encoding process."}),"\n",(0,t.jsx)(n.li,{children:"Advanced users can tweak many parameters to optimize for specific content types or encoding scenarios."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Flexibility"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Being the reference encoder, aomenc produces highly standards-compliant AV1 bitstreams that take advantage of the full arsenal of AV1 features."}),"\n",(0,t.jsx)(n.li,{children:"It supports 4:2:0 and 4:4:4 chroma subsampling, 8- to 12-bit color depth, and various other advanced features that more specialized encoders like SVT-AV1 do not support."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"aomenc is ideal for:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Scenarios where achieving the highest possible quality is the primary goal"}),"\n",(0,t.jsx)(n.li,{children:"Archival encoding where compression efficiency is crucial"}),"\n",(0,t.jsx)(n.li,{children:"Research and development in video compression"}),"\n",(0,t.jsx)(n.li,{children:"Encoding projects where encoding time is not a significant constraint"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Some drawbacks of aomenc include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Unresponsive development driven by legacy metrics, leading to slower adoption of new techniques and ignoring improvements communicated by people outside the Google development team"}),"\n",(0,t.jsx)(n.li,{children:"Cripplingly difficult to use for beginners, with a culture of cargo-culting settings"}),"\n",(0,t.jsx)(n.li,{children:"Slow encoding speeds compared to other AV1 encoders, which has less of an impact on the quality of the output than it used to compared to maturing encoders like SVT-AV1"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"svt-av1-psy",children:"SVT-AV1-PSY"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/svt-av1-psy",children:"SVT-AV1-PSY"})," is a community fork of the SVT-AV1 encoder focused on psychovisual optimizations to enhance perceived visual quality. It aims at closing the distance between SVT-AV1's high speeds and the perceptual quality of aomenc's slow brute force approach."]}),"\n",(0,t.jsx)(n.p,{children:"Links:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Wiki page: ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/svt-av1-psy",children:"SVT-AV1-PSY"})]}),"\n",(0,t.jsxs)(n.li,{children:["Git repository: ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"https://github.com/gianni-rosato/svt-av1-psy"})]}),"\n",(0,t.jsxs)(n.li,{children:["Documentation: ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato/svt-av1-psy/blob/master/Docs/PSY-Development.md",children:"https://github.com/gianni-rosato/svt-av1-psy/blob/master/Docs/PSY-Development.md"})]}),"\n"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Perceptual Optimizations"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SVT-AV1-PSY introduces various psychovisual enhancements to improve the perceived quality of encoded video."}),"\n",(0,t.jsx)(n.li,{children:"These optimizations often result in output that looks better to the human eye, even if it might not always score as well in objective metrics."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Additional Features"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Introduces new options like variance boost, which can help maintain detail in high-contrast scenes."}),"\n",(0,t.jsx)(n.li,{children:"Offers alternative curve options for more nuanced control over the encoding process."}),"\n",(0,t.jsx)(n.li,{children:"Extends the CRF (Constant Rate Factor) range to 70 (from 63 in mainline SVT-AV1), allowing for extremely low-bitrate encodes."}),"\n",(0,t.jsx)(n.li,{children:'Introduces additional tuning options, including a new "SSIM with Subjective Quality Tuning" mode that can improve perceived quality.'}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Visual Fidelity Focus"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Aims to produce more visually pleasing results, sometimes at the expense of metric performance."}),"\n",(0,t.jsx)(n.li,{children:"Includes options like sharpness adjustment and adaptive film grain synthesis which can significantly impact the visual characteristics of the output."}),"\n",(0,t.jsx)(n.li,{children:"Features modified defaults driven by perceptual quality considerations."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Extended HDR Support"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Includes built-in support for Dolby Vision & HDR10+ encoding."}),"\n",(0,t.jsx)(n.li,{children:"This makes it particularly useful for encoding HDR content without requiring additional post-processing steps or external tools."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Performance"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Based on SVT-AV1, it retains the performance characteristics of its parent encoder."}),"\n",(0,t.jsx)(n.li,{children:"Adds super slow presets (-2 and -3) for research purposes and extremely high-quality encoding. These additional presets can be useful for creating reference encodes or applications where encoding time is not a concern."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY is particularly well-suited for:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Encoding scenarios where subjective visual quality is prioritized over pure metric performance"}),"\n",(0,t.jsx)(n.li,{children:"HDR content encoding in Dolby Vision or HDR10+"}),"\n",(0,t.jsx)(n.li,{children:"Users who want fine-grained control over psychovisual aspects of encoding"}),"\n",(0,t.jsx)(n.li,{children:"Projects that require a balance between the speed of SVT-AV1 and enhanced visual quality"}),"\n",(0,t.jsx)(n.li,{children:"Encoding challenging content with complex textures or high-contrast scenes"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Some drawbacks are:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Everything that applies to SVT-AV1, including the lack of support for 4:4:4 chroma subsampling and 12-bit color depth that are useful in specific scenarios"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"conclusion-1",children:"Conclusion"}),"\n",(0,t.jsx)(n.p,{children:"While SVT-AV1 is known for being fast, aomenc is renowned for its high-quality output, and rav1e is recognized for its safety and reliability, each encoder has strengths and weaknesses. The best encoder for you will depend on your specific needs and priorities."}),"\n",(0,t.jsxs)(n.p,{children:["As this guide is focused on offline encoding, ",(0,t.jsx)(n.strong,{children:"SVT-AV1-PSY"})," combines aomenc's traditional perceptual strength with SVT-AV1's speed. Like rav1e, it is easy to use due to strong default settings that prevent cargo culting, and overall it can be considered the best of all three worlds. It is actively developed by a team of responsive community members, and it is a great choice for most users who want a balance between quality per bit, speed, and ease of use."]}),"\n",(0,t.jsx)(n.p,{children:'The "best" encoder often depends on your use case, content type, and target audience. It\'s always worth experimenting with different encoders and settings to find the optimal balance for your needs. Many advanced users even employ multiple encoders in their workflows, choosing the most appropriate tool for each specific task or content type.'}),"\n",(0,t.jsx)(n.h2,{id:"final-conclusion",children:"Final Conclusion"}),"\n",(0,t.jsxs)(n.p,{children:["The AV1 ecosystem has grown to the point where a single comprehensive guide cannot effectively cover the entire extent of the available tools and techniques for AV1 encoding across ",(0,t.jsx)(n.em,{children:"every"})," use case. If you want more detail about a particular tool, where to acquire it, or how to compile an encoder, you can find that information throughout the various wiki entries linked on this page."]}),"\n",(0,t.jsxs)(n.p,{children:["Reading can get you far, but it is natural to have questions. Please don't hesitate to connect with the team behind the Codec Wiki and many of these tools via our ",(0,t.jsx)(n.a,{href:"https://discord.gg/bbQD5MjDr3",children:"AV1 for Dummies Discord server"}),". We're happy to help you with anything you need, and your questions and feedback help the wiki grow and improve. We hope you enjoy your journey into AV1 encoding, and we wish you the best of luck in your encoding endeavors!"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8632:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/av1_for_dummies_guide-a83f247bebb2261a1ba671e33ddf1e99.avif"},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var t=i(6540);const s={},r=t.createContext(s);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/04dda763.11381acb.js b/assets/js/04dda763.11381acb.js new file mode 100644 index 000000000..50dfc7e44 --- /dev/null +++ b/assets/js/04dda763.11381acb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6778],{3763:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>c});var t=i(9543),s=i(4848),r=i(8453);const o={title:"AV1 for Dummies",description:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.",slug:"av1-for-dummies",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"},{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","compression"],image:"/img/av1_for_dummies_guide.jpg",hide_table_of_contents:!1},l=void 0,a={authorsImageUrls:[void 0,void 0]},c=[{value:"Introduction",id:"introduction",level:2},{value:"Why AV1?",id:"why-av1",level:3},{value:"Do's & Don'ts",id:"dos--donts",level:3},{value:"Tools",id:"tools",level:2},{value:"GUI",id:"gui",level:3},{value:"CLI",id:"cli",level:3},{value:"Conclusion",id:"conclusion",level:3},{value:"Encoders",id:"encoders",level:2},{value:"SVT-AV1",id:"svt-av1",level:3},{value:"rav1e",id:"rav1e",level:3},{value:"aomenc (libaom)",id:"aomenc-libaom",level:3},{value:"SVT-AV1-PSY",id:"svt-av1-psy",level:3},{value:"Conclusion",id:"conclusion-1",level:3},{value:"Final Conclusion",id:"final-conclusion",level:2}];function d(e){const n={a:"a",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Compare",src:i(1669).A+"",width:"2048",height:"1080"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/AV1",children:"AV1"})," is a royalty-free video codec developed by the Alliance for Open Media. It is designed to replace ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/VP9",children:"VP9"})," and presently competes with ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/VVC",children:"H.266"}),". AV1 is known for its high compression efficiency, which the marketing will have you believe reduces file sizes by up to 50% compared to ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/AVC",children:"H.264"})," and up to 30% compared to ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/video/HEVC",children:"H.265"})," across the board. It is supported by several major browsers and is widely used across many streaming services and video platforms."]}),"\n",(0,s.jsx)(n.h3,{id:"why-av1",children:"Why AV1?"}),"\n",(0,s.jsxs)(n.p,{children:["Before we dive in, it is important to understand ",(0,s.jsx)(n.em,{children:"why"})," you may want to use AV1 instead of other codecs. The reality is that AV1 is ",(0,s.jsx)(n.em,{children:"not"})," better than H.264/5 in every single scenario; video encoding is a complicated field, and the best codec for you will depend on your specific needs. AV1 excels in:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Low to medium-high fidelity encoding"}),"\n",(0,s.jsx)(n.li,{children:"Higher resolution encoding"}),"\n",(0,s.jsx)(n.li,{children:"Encoding content with very little grain or noise"}),"\n",(0,s.jsx)(n.li,{children:"Slow, non-realtime contexts (e.g. offline encoding)"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The enumeration above still consists of broad strokes, but the point is to understand that AV1 is not a silver bullet. It will not automatically make your videos smaller while preserving your desired quality. To make things more difficult, the ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/x264",children:"x264"})," & ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/x265",children:"x265"})," encoders are very mature, while AV1 encoding efforts designed to meet the extremely complicated needs of the human eye are still in their infancy."]}),"\n",(0,s.jsx)(n.p,{children:"This guide focuses almost entirely on tools great for offline, non-realtime encoding for various kinds of content. Streaming is an altogether different application of AV1, and is only covered sparsely here."}),"\n",(0,s.jsx)(n.h3,{id:"dos--donts",children:"Do's & Don'ts"}),"\n",(0,s.jsx)(n.p,{children:"Due to a lot of misunderstandings about codecs and compression, there are a lot of common misconceptions that are held regarding video encoding. We'll start by outlining some bad practices:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Don't"})," encode the same video multiple times. This is a common mistake made by people new to video encoding. Every time you encode a video, you lose additional quality due to ",(0,s.jsx)(n.em,{children:"generation loss"}),". This is because video codecs are lossy, and every time you encode a video, you lose more information. This is why it is important to keep the original video file if you frequently re-encode it."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Don't"})," blindly copy settings from others without understanding them. What works for one person's content and workflow may not work for yours. Even the default settings on many encoders are not optimal for most content."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Don't"})," assume that higher bitrate equates to better quality. Inefficient encoding can waste bits without improving visual quality, and efficient encoding can make lower bitrate video look drastically better than higher bitrate video using the same codec."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Don't"})," assume all encoders/presets/settings/implementations are created equal. Even given two encoding frameworks that use the same underlying encoder, you may achieve different results given encoder version mismatches or subtly different settings used under the hood."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Don't"})," use unnecessarily slow presets/speeds unless you have a specific need and ample time. While slower presets improve encoding efficiency most of the time, the quality gains reach a point of diminishing returns beyond a certain point. Use the slowest preset you can tolerate, not the slowest preset available."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Don't"})," blindly trust metric scores. It is unfortunate how trusted ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/metrics/VMAF",children:"VMAF"})," is considering how infrequently it correlates with visual fidelity in practice now that it has become so popular. Even the beloved ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," is not a perfect one-to-one with the human eye."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Now, let's move on to some ",(0,s.jsx)(n.strong,{children:"good"})," practices:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Experiment with different settings and compare the results."}),"\n",(0,s.jsx)(n.li,{children:"Consider your content type when choosing encoding settings. Film, animation, and sports all have different characteristics that benefit from distinct approaches."}),"\n",(0,s.jsx)(n.li,{children:"Try to use CRF for offline encoding, as opposed to CBR or VBR. While the latter two are effective for precisely targeting a particular bitrate, CRF is more effective at targeting a specific quality level efficiently."}),"\n",(0,s.jsx)(n.li,{children:"Always use 10-bit color, even with an 8-bit source. AV1's internal workings are much more suited to 10-bit color, and you are almost always guaranteed quality improvements with zero compatibility penalty as 10-bit color is part of AV1's baseline profile."}),"\n",(0,s.jsx)(n.li,{children:"Consider using grain synthesis for grainy content, as AV1 can struggle with preserving film grain efficiently."}),"\n",(0,s.jsx)(n.li,{children:"Keep your encoding software up-to-date; the encoding world moves quickly."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"tools",children:"Tools"}),"\n",(0,s.jsx)(n.p,{children:"Since writing the last guide, there are now several versatile tools available for AV1 encoding. Below, we've assembled some tables of popular encoding tools and their features."}),"\n",(0,s.jsx)(n.h3,{id:"gui",children:"GUI"}),"\n",(0,s.jsx)(n.p,{children:"Here's the key:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Encoder(s)"}),": The AV1 encoder(s) the software uses or is able to use. This is between ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"}),", ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"}),", ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1-PSY",children:"SVT-AV1-PSY"}),", and various aomenc forks. We'll get into this more later."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Ease of Use"}),": How intuitive the software is, especially for beginners."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Complexity"}),": How flexible the software can be for advanced users."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Efficiency"}),': How "good" the underlying encoder(s) are. This is more subjective, but tools with bad defaults, misleading options, or slow release cycles won\'t score well here.']}),"\n"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Platform(s)"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Encoder(s)"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Ease of Use"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Complexity"}),(0,s.jsx)(n.th,{children:"Efficiency"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/Aviator",children:"Aviator"})}),(0,s.jsx)(n.td,{children:"Linux"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"SVT-AV1-PSY"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{children:"\u25cf\u25cf\u25cf\u25cf\u25cf"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/nmkoder",children:"NMKODER"})}),(0,s.jsx)(n.td,{children:"Windows"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,s.jsx)(n.td,{children:"\u25cf\u25cf\u25cb\u25cb\u25cb"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://github.com/Av1ation-Association/Av1ation-Creations/releases/",children:"Av1ation Station"})}),(0,s.jsx)(n.td,{children:"Any"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,s.jsx)(n.td,{children:"\u25cf\u25cf\u25cf\u25cf\u25cb"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://github.com/staxrip/staxrip",children:"StaxRip"})}),(0,s.jsx)(n.td,{children:"Windows"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,s.jsx)(n.td,{children:"\u25cf\u25cf\u25cf\u25cf\u25cb"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://github.com/Alkl58/NotEnoughAV1Encodes",children:"NEAV1E"})}),(0,s.jsx)(n.td,{children:"Windows"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,s.jsx)(n.td,{children:"\u25cf\u25cf\u25cb\u25cb\u25cb"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://handbrake.fr/",children:"Handbrake"})}),(0,s.jsx)(n.td,{children:"Any"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"SVT-AV1"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{children:"\u25cf\u25cf\u25cb\u25cb\u25cb"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://github.com/cdgriffith/FastFlix",children:"FastFlix"})}),(0,s.jsx)(n.td,{children:"Any"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"Any"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,s.jsx)(n.td,{children:"\u25cf\u25cf\u25cb\u25cb\u25cb"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator",children:"rAV1ator"})}),(0,s.jsx)(n.td,{children:"Linux"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"rav1e"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,s.jsx)(n.td,{children:"\u25cf\u25cb\u25cb\u25cb\u25cb"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://autocompressor.net/",children:"Autocompressor"})}),(0,s.jsx)(n.td,{children:"Web"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"SVT-AV1"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{children:"\u25cf\u25cf\u25cf\u25cb\u25cb"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"Our top pics are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For beginners: ",(0,s.jsx)(n.strong,{children:"Aviator"}),". If you are on Linux and you want zero hassle whatsoever, Aviator is simple but highly effective. As a Flatpak application, it ships a bundled SVT-AV1-PSY binary that is up-to-date, compiled efficiently, and handled with extensively tested defaults. It is hard to go wrong with Aviator even as an advanced user, despite its simplicity."]}),"\n",(0,s.jsxs)(n.li,{children:["For advanced users: ",(0,s.jsx)(n.strong,{children:"Av1ation Station"}),". Av1ator Station is thoughtfully designed to be your one-stop shop for video encoding. Even though it is brand new, it has proven itself to be a capable and reliable solution for advanced video encoders that have a lot of settings to tweak and encodes to keep track of."]}),"\n",(0,s.jsxs)(n.li,{children:["For Windows users: ",(0,s.jsx)(n.strong,{children:"StaxRip"}),". StaxRip is a long-standing, well-maintained, and highly flexible video encoding tool that supports a plethora of encoders and formats. It comes bundled with SVT-AV1-PSY and is a great choice for Windows users who want a powerful and versatile tool for video encoding."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"cli",children:"CLI"}),"\n",(0,s.jsx)(n.p,{children:"In the terminal, advanced encoders can explore a much greater degree of complexity than many GUIs allow. That being said, ease of use is still a consideration when managing complex command-line encoding workflows. Let's begin with the key:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"We're omitting the \"Platform(s)\" column here, as this section targets Linux users. As a Windows user, WSL has you covered - as a Mac user, you're likely to experience parity with Linux (most of the time)."}),"\n"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Framework(s)"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Ease of Use"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Complexity"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Features"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Scene Detection"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"SvtAv1EncApp"}),(0,s.jsx)(n.td,{children:"None"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/ffmpeg",children:"FFmpeg"})}),(0,s.jsx)(n.td,{children:"Itself"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an",children:"Av1an"})}),(0,s.jsx)(n.td,{children:"FFmpeg"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cb\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})}),(0,s.jsx)(n.td,{children:"Av1an"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://github.com/kingstefan26/alabamaEncoder",children:"alabamaEncoder"})}),(0,s.jsx)(n.td,{children:"FFmpeg"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cb\u25cb\u25cb"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"\u25cf\u25cf\u25cf\u25cf\u25cf"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"Yes"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"Our top picks are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For beginners: ",(0,s.jsx)(n.strong,{children:"rAV1ator CLI"}),". rAV1ator CLI essentially walks you through the process of writing Av1an commands. It can install binaries for you, save your previous commands, and detect scenes via Av1an. This makes it a great choice for beginners who want to learn the ropes of AV1 encoding without diving into the deep end headfirst. For advanced users, it makes rapidly writing, testing, & cataloging Av1an encoding commands much simpler."]}),"\n",(0,s.jsxs)(n.li,{children:["For advanced users: ",(0,s.jsx)(n.strong,{children:"alabamaEncoder"}),". alabamaEncoder is a powerful and flexible tool that allows you to encode video with FFmpeg and AV1. It is highly configurable and supports a mind-bending array of powerful features that would be hard to find elsewhere. While the tool is still new, it is already a great choice for advanced users who want to push the boundaries of what is possible to incorporate into an encoding workflow."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"conclusion",children:"Conclusion"}),"\n",(0,s.jsx)(n.p,{children:"In conclusion, the best AV1 tool for you will depend on your needs and experience level. If you are a beginner, Aviator is a great choice for Linux users, while StaxRip is a good option for Windows users. For advanced users, Av1ation Station is a powerful and versatile tool that can handle numerous encoding tasks. If you prefer the command line, rAV1ator CLI is a great choice for beginners, while alabamaEncoder is a powerful tool for advanced users. No matter which tool you choose, it is hard to go wrong in the modern AV1 encoding landscape when it comes to your utility of choice."}),"\n",(0,s.jsx)(n.h2,{id:"encoders",children:"Encoders"}),"\n",(0,s.jsx)(n.p,{children:"The world of AV1 encoding is diverse and complex, with several open-source encoders available, each bringing its own set of strengths, weaknesses, and unique features to the table. In this section, we'll dive deep into the characteristics of four major AV1 encoders:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"SVT-AV1,"}),"\n",(0,s.jsx)(n.li,{children:"rav1e,"}),"\n",(0,s.jsx)(n.li,{children:"aomenc (libaom), and"}),"\n",(0,s.jsx)(n.li,{children:"SVT-AV1-PSY"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Understanding these encoders is crucial for making informed decisions about what best suits your specific encoding needs."}),"\n",(0,s.jsx)(n.h3,{id:"svt-av1",children:"SVT-AV1"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"})," (Scalable Video Technology for AV1) is an AV1 encoder library and application developed by Intel, Netflix, and others. It has gained significant popularity in the encoding community due to its impressive balance of speed, quality, and scalability."]}),"\n",(0,s.jsx)(n.p,{children:"Links:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Wiki page: ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"})]}),"\n",(0,s.jsxs)(n.li,{children:["Git repository: ",(0,s.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1",children:"https://gitlab.com/AOMediaCodec/SVT-AV1"})]}),"\n",(0,s.jsxs)(n.li,{children:["Documentation: ",(0,s.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/README.md",children:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/README.md"})]}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Performance & Scalability"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"SVT-AV1 is renowned for its encoding speed, particularly at higher speed presets."}),"\n",(0,s.jsx)(n.li,{children:"It leverages parallel processing, making it exceptionally efficient on multi-core systems. Fun fact: SVT-AV1's parallel processing is lossless, so it doesn't compromise quality for speed."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Quality-to-Speed Ratio"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"SVT-AV1 strikes an impressive balance between encoding speed and output quality."}),"\n",(0,s.jsx)(n.li,{children:"At faster presets, it usually outperforms other encoders in quality per unit of encoding time."}),"\n",(0,s.jsxs)(n.li,{children:["While it may not achieve the absolute highest ",(0,s.jsx)(n.em,{children:"quality per bit"})," possible, its quality is generally considered impressive for its speed."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Flexibility"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"SVT-AV1 offers a wide range of encoding options and presets, allowing fine-tuned control over the encoding process."}),"\n",(0,s.jsx)(n.li,{children:"It provides 14 presets (0-13), with 0 being the slowest and highest quality, and 13 being the fastest but lowest quality."}),"\n",(0,s.jsx)(n.li,{children:"Advanced options allow users to adjust parameters like hierarchical levels, intra-refresh type, and tuning modes."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Continuous Development"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"SVT-AV1 receives frequent updates and optimizations, with new releases often coming alongside big changes."}),"\n",(0,s.jsx)(n.li,{children:"The open-source nature of the project encourages community contributions and rapid feature development."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"SVT-AV1 is an excellent choice for a wide range of encoding scenarios. It's particularly well-suited for:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"High-volume encoding operations where speed is crucial"}),"\n",(0,s.jsx)(n.li,{children:"Live or near-live encoding of high-resolution content"}),"\n",(0,s.jsx)(n.li,{children:"Scenarios where a balance between quality and encoding speed is required"}),"\n",(0,s.jsx)(n.li,{children:"Users with multi-core systems who want to leverage their hardware efficiently"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Some downsides include:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Higher memory usage compared to other encoders"}),"\n",(0,s.jsx)(n.li,{children:"The developers assess quality via its performance on traditional legacy metrics, which harms its perceptual fidelity ceiling."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"rav1e",children:"rav1e"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"})," is an AV1 encoder written in Rust & Assembly. Developed by the open-source community alongside Xiph, it brings a unique approach to AV1 encoding with its focus on safety and correctness."]}),"\n",(0,s.jsx)(n.p,{children:"Links:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Wiki page: ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"})]}),"\n",(0,s.jsxs)(n.li,{children:["Git repository: ",(0,s.jsx)(n.a,{href:"https://github.com/xiph/rav1e",children:"https://github.com/xiph/rav1e"})]}),"\n",(0,s.jsxs)(n.li,{children:["Documentation: ",(0,s.jsx)(n.a,{href:"https://github.com/xiph/rav1e/tree/master/doc#readme",children:"https://github.com/xiph/rav1e/tree/master/doc#readme"})]}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Safety & Reliability"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Being written in Rust, rav1e emphasizes memory safety and thread safety."}),"\n",(0,s.jsx)(n.li,{children:"This focus on safety translates to a more stable and reliable encoding process, with reduced risks of crashes or undefined behavior."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"High Fidelity"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"At high fidelity targets - an area where AV1 usually lacks - rav1e is a strong contender compared to other encoders."}),"\n",(0,s.jsx)(n.li,{children:"It excels in preserving fine details and textures, making it a good choice for high-fidelity encoding."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Quality"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"While not typically matching aomenc or SVT-AV1 in pure compression efficiency, rav1e can produce high-quality output videos."}),"\n",(0,s.jsx)(n.li,{children:"It often achieves a good balance between quality and encoding time, especially at medium-speed settings."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Perceptually Driven"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"rav1e's development is driven by visual fidelity, without relying heavily on metrics."}),"\n",(0,s.jsx)(n.li,{children:"This focus on perceptual quality leads to a stronger foundation for future potential improvements in visual quality, as well as making the encoder very easy to use as it does not require excessive tweaking."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"rav1e is well-suited for:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Projects where stability is paramount"}),"\n",(0,s.jsx)(n.li,{children:"Users who prioritize a community-driven, open-source development approach"}),"\n",(0,s.jsx)(n.li,{children:"Encoding tasks where a balance between quality and speed is needed, but the absolute fastest speeds are not required"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Some limitations of rav1e include:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Lagging development compared to other encoders"}),"\n",(0,s.jsx)(n.li,{children:"Slower encoding speeds compared to SVT-AV1 at similar quality & size"}),"\n",(0,s.jsx)(n.li,{children:"Fewer advanced options compared to other encoders"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"aomenc-libaom",children:"aomenc (libaom)"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"}),", based on the libaom library, is the reference encoder for AV1. Developed by the Alliance for Open Media (AOM), it is the benchmark for AV1 encoding quality and compliance."]}),"\n",(0,s.jsx)(n.p,{children:"Links:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Wiki page: ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"})]}),"\n",(0,s.jsxs)(n.li,{children:["Git repository: ",(0,s.jsx)(n.a,{href:"https://aomedia.googlesource.com/aom/",children:"https://aomedia.googlesource.com/aom/"})]}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Encoding Quality"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"aomenc is widely regarded as the gold standard for AV1 encoding quality."}),"\n",(0,s.jsx)(n.li,{children:"It often achieves high compression efficiency among AV1 encoders, especially at slower speed settings."}),"\n",(0,s.jsx)(n.li,{children:"The encoder squeezes out nearly every last bit of efficiency from the AV1 codec, making it ideal for archival purposes or when quality per bit is critical."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Encoding Speed"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"aomenc is generally the slowest among major AV1 encoders."}),"\n",(0,s.jsx)(n.li,{children:"It offers 13 CPU speed levels (0-12), but even at its fastest settings, it's typically slower than other encoders at their slower settings."}),"\n",(0,s.jsx)(n.li,{children:"The slow speed is often considered a trade-off for its high compression efficiency."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Extensive Options"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"As the reference implementation, aomenc offers the most comprehensive encoding options."}),"\n",(0,s.jsx)(n.li,{children:"It provides fine-grained control over nearly every aspect of the AV1 encoding process."}),"\n",(0,s.jsx)(n.li,{children:"Advanced users can tweak many parameters to optimize for specific content types or encoding scenarios."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Flexibility"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Being the reference encoder, aomenc produces highly standards-compliant AV1 bitstreams that take advantage of the full arsenal of AV1 features."}),"\n",(0,s.jsx)(n.li,{children:"It supports 4:2:0 and 4:4:4 chroma subsampling, 8- to 12-bit color depth, and various other advanced features that more specialized encoders like SVT-AV1 do not support."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"aomenc is ideal for:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Scenarios where achieving the highest possible quality is the primary goal"}),"\n",(0,s.jsx)(n.li,{children:"Archival encoding where compression efficiency is crucial"}),"\n",(0,s.jsx)(n.li,{children:"Research and development in video compression"}),"\n",(0,s.jsx)(n.li,{children:"Encoding projects where encoding time is not a significant constraint"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Some drawbacks of aomenc include:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Unresponsive development driven by legacy metrics, leading to slower adoption of new techniques and ignoring improvements communicated by people outside the Google development team"}),"\n",(0,s.jsx)(n.li,{children:"Cripplingly difficult to use for beginners, with a culture of cargo-culting settings"}),"\n",(0,s.jsx)(n.li,{children:"Slow encoding speeds compared to other AV1 encoders, which has less of an impact on the quality of the output than it used to compared to maturing encoders like SVT-AV1"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"svt-av1-psy",children:"SVT-AV1-PSY"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/svt-av1-psy",children:"SVT-AV1-PSY"})," is a community fork of the SVT-AV1 encoder focused on psychovisual optimizations to enhance perceived visual quality. It aims at closing the distance between SVT-AV1's high speeds and the perceptual quality of aomenc's slow brute force approach."]}),"\n",(0,s.jsx)(n.p,{children:"Links:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Wiki page: ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/svt-av1-psy",children:"SVT-AV1-PSY"})]}),"\n",(0,s.jsxs)(n.li,{children:["Git repository: ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"https://github.com/gianni-rosato/svt-av1-psy"})]}),"\n",(0,s.jsxs)(n.li,{children:["Documentation: ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/svt-av1-psy/blob/master/Docs/PSY-Development.md",children:"https://github.com/gianni-rosato/svt-av1-psy/blob/master/Docs/PSY-Development.md"})]}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Perceptual Optimizations"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"SVT-AV1-PSY introduces various psychovisual enhancements to improve the perceived quality of encoded video."}),"\n",(0,s.jsx)(n.li,{children:"These optimizations often result in output that looks better to the human eye, even if it might not always score as well in objective metrics."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Additional Features"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Introduces new options like variance boost, which can help maintain detail in high-contrast scenes."}),"\n",(0,s.jsx)(n.li,{children:"Offers alternative curve options for more nuanced control over the encoding process."}),"\n",(0,s.jsx)(n.li,{children:"Extends the CRF (Constant Rate Factor) range to 70 (from 63 in mainline SVT-AV1), allowing for extremely low-bitrate encodes."}),"\n",(0,s.jsx)(n.li,{children:'Introduces additional tuning options, including a new "SSIM with Subjective Quality Tuning" mode that can improve perceived quality.'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Visual Fidelity Focus"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Aims to produce more visually pleasing results, sometimes at the expense of metric performance."}),"\n",(0,s.jsx)(n.li,{children:"Includes options like sharpness adjustment and adaptive film grain synthesis which can significantly impact the visual characteristics of the output."}),"\n",(0,s.jsx)(n.li,{children:"Features modified defaults driven by perceptual quality considerations."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Extended HDR Support"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Includes built-in support for Dolby Vision & HDR10+ encoding."}),"\n",(0,s.jsx)(n.li,{children:"This makes it particularly useful for encoding HDR content without requiring additional post-processing steps or external tools."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Performance"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Based on SVT-AV1, it retains the performance characteristics of its parent encoder."}),"\n",(0,s.jsx)(n.li,{children:"Adds super slow presets (-2 and -3) for research purposes and extremely high-quality encoding. These additional presets can be useful for creating reference encodes or applications where encoding time is not a concern."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"SVT-AV1-PSY is particularly well-suited for:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Encoding scenarios where subjective visual quality is prioritized over pure metric performance"}),"\n",(0,s.jsx)(n.li,{children:"HDR content encoding in Dolby Vision or HDR10+"}),"\n",(0,s.jsx)(n.li,{children:"Users who want fine-grained control over psychovisual aspects of encoding"}),"\n",(0,s.jsx)(n.li,{children:"Projects that require a balance between the speed of SVT-AV1 and enhanced visual quality"}),"\n",(0,s.jsx)(n.li,{children:"Encoding challenging content with complex textures or high-contrast scenes"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Some drawbacks are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Everything that applies to SVT-AV1, including the lack of support for 4:4:4 chroma subsampling and 12-bit color depth that are useful in specific scenarios"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"conclusion-1",children:"Conclusion"}),"\n",(0,s.jsx)(n.p,{children:"While SVT-AV1 is known for being fast, aomenc is renowned for its high-quality output, and rav1e is recognized for its safety and reliability, each encoder has strengths and weaknesses. The best encoder for you will depend on your specific needs and priorities."}),"\n",(0,s.jsxs)(n.p,{children:["As this guide is focused on offline encoding, ",(0,s.jsx)(n.strong,{children:"SVT-AV1-PSY"})," combines aomenc's traditional perceptual strength with SVT-AV1's speed. Like rav1e, it is easy to use due to strong default settings that prevent cargo culting, and overall it can be considered the best of all three worlds. It is actively developed by a team of responsive community members, and it is a great choice for most users who want a balance between quality per bit, speed, and ease of use."]}),"\n",(0,s.jsx)(n.p,{children:'The "best" encoder often depends on your use case, content type, and target audience. It\'s always worth experimenting with different encoders and settings to find the optimal balance for your needs. Many advanced users even employ multiple encoders in their workflows, choosing the most appropriate tool for each specific task or content type.'}),"\n",(0,s.jsx)(n.h2,{id:"final-conclusion",children:"Final Conclusion"}),"\n",(0,s.jsxs)(n.p,{children:["The AV1 ecosystem has grown to the point where a single comprehensive guide cannot effectively cover the entire extent of the available tools and techniques for AV1 encoding across ",(0,s.jsx)(n.em,{children:"every"})," use case. If you want more detail about a particular tool, where to acquire it, or how to compile an encoder, you can find that information throughout the various wiki entries linked on this page."]}),"\n",(0,s.jsxs)(n.p,{children:["Reading can get you far, but it is natural to have questions. Please don't hesitate to connect with the team behind the Codec Wiki and many of these tools via our ",(0,s.jsx)(n.a,{href:"https://discord.gg/bbQD5MjDr3",children:"AV1 for Dummies Discord server"}),". We're happy to help you with anything you need, and your questions and feedback help the wiki grow and improve. We hope you enjoy your journey into AV1 encoding, and we wish you the best of luck in your encoding endeavors!"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1669:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/av1_for_dummies_guide-a83f247bebb2261a1ba671e33ddf1e99.avif"},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var t=i(6540);const s={},r=t.createContext(s);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:n},e.children)}},9543:e=>{e.exports=JSON.parse('{"permalink":"/blog/av1-for-dummies","source":"@site/blog/2024-06-24-av1-for-dummies-2.mdx","title":"AV1 for Dummies","description":"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you\'re on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.","date":"2024-06-24T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"}],"readingTime":16.645,"hasTruncateMarker":true,"authors":[{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4","socials":{},"key":null,"page":null},{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"AV1 for Dummies","description":"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you\'re on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.","slug":"av1-for-dummies","authors":[{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"},{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"}],"tags":["video","compression"],"image":"/img/av1_for_dummies_guide.jpg","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Codec Wiki: One Year Later","permalink":"/blog/codec-wiki-one-year-later"},"nextItem":{"title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","permalink":"/blog/svt-av1-second-deep-dive"}}')}}]); \ No newline at end of file diff --git a/assets/js/059e36ab.6366493b.js b/assets/js/059e36ab.6366493b.js new file mode 100644 index 000000000..d881c4ed3 --- /dev/null +++ b/assets/js/059e36ab.6366493b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6838],{1021:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>d,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"video/utvideo","title":"UT Video","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/utvideo.mdx","sourceDirName":"video","slug":"/video/utvideo","permalink":"/docs/video/utvideo","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/utvideo.mdx","tags":[],"version":"current","sidebarPosition":13,"frontMatter":{"title":"UT Video","sidebar_position":13},"sidebar":"tutorialSidebar","previous":{"title":"FFV1","permalink":"/docs/video/FFV1"},"next":{"title":"ProRes","permalink":"/docs/video/prores"}}');var n=o(4848),s=o(8453);const d={title:"UT Video",sidebar_position:13},r="UT Video Codec Suite",c={},a=[];function l(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"ut-video-codec-suite",children:"UT Video Codec Suite"})}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsx)(i.p,{children:"UT Video Codec Suite is a fast, lossless video codec, developed by Takeshi Umezawa (\u6885\u6fa4 \u5a01\u5fd7, Umezawa Takeshi) and released under the free GNU General Public License. The algorithm of UT video is based on the Huffman code."}),"\n",(0,n.jsx)(i.p,{children:"UT Video was developed as an alternative to HuffYUV, in order to achieve better compression. It can handle color spaces such as YUV422 (ULY2), RGB (ULRG), RGBA (ULRA) and, most recently, YUV420 (ULY0)."}),"\n",(0,n.jsx)(i.p,{children:"It has both x86 and x64 builds. Due to its multithreading support, this codec is also capable of encoding HDTV material in real time. The codec requires support for the SSE2 instruction set because it is heavily used for speed optimizations."}),"\n",(0,n.jsxs)(i.p,{children:["There are various predction modes, which can be used via ",(0,n.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),":"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"no prediction employed"}),"\n",(0,n.jsx)(i.li,{children:"left neighbour prediction (continuous for the whole slice)"}),"\n",(0,n.jsx)(i.li,{children:"gradient prediction"}),"\n",(0,n.jsx)(i.li,{children:"median prediction"}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["You can use FFmpeg to encode utvideo as follows:\n",(0,n.jsx)(i.code,{children:"ffmpeg -i [input] -c:v utvideo -pred [0,1,2,3] [output]"})]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.em,{children:["References: ",(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Ut_Video_Codec_Suite",children:"Wikipedia"})]})})]})}function u(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>d,x:()=>r});var t=o(6540);const n={},s=t.createContext(n);function d(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/059e36ab.6cb6d2de.js b/assets/js/059e36ab.6cb6d2de.js deleted file mode 100644 index a54f0f40e..000000000 --- a/assets/js/059e36ab.6cb6d2de.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6838],{6587:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>s,metadata:()=>r,toc:()=>a});var t=o(4848),n=o(8453);const s={title:"UT Video",sidebar_position:13},d="UT Video Codec Suite",r={id:"video/utvideo",title:"UT Video",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/utvideo.mdx",sourceDirName:"video",slug:"/video/utvideo",permalink:"/docs/video/utvideo",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/utvideo.mdx",tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"UT Video",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"FFV1",permalink:"/docs/video/FFV1"},next:{title:"ProRes",permalink:"/docs/video/prores"}},c={},a=[];function u(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"ut-video-codec-suite",children:"UT Video Codec Suite"})}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsx)(i.p,{children:"UT Video Codec Suite is a fast, lossless video codec, developed by Takeshi Umezawa (\u6885\u6fa4 \u5a01\u5fd7, Umezawa Takeshi) and released under the free GNU General Public License. The algorithm of UT video is based on the Huffman code."}),"\n",(0,t.jsx)(i.p,{children:"UT Video was developed as an alternative to HuffYUV, in order to achieve better compression. It can handle color spaces such as YUV422 (ULY2), RGB (ULRG), RGBA (ULRA) and, most recently, YUV420 (ULY0)."}),"\n",(0,t.jsx)(i.p,{children:"It has both x86 and x64 builds. Due to its multithreading support, this codec is also capable of encoding HDTV material in real time. The codec requires support for the SSE2 instruction set because it is heavily used for speed optimizations."}),"\n",(0,t.jsxs)(i.p,{children:["There are various predction modes, which can be used via ",(0,t.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),":"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"no prediction employed"}),"\n",(0,t.jsx)(i.li,{children:"left neighbour prediction (continuous for the whole slice)"}),"\n",(0,t.jsx)(i.li,{children:"gradient prediction"}),"\n",(0,t.jsx)(i.li,{children:"median prediction"}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["You can use FFmpeg to encode utvideo as follows:\n",(0,t.jsx)(i.code,{children:"ffmpeg -i [input] -c:v utvideo -pred [0,1,2,3] [output]"})]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsxs)(i.em,{children:["References: ",(0,t.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Ut_Video_Codec_Suite",children:"Wikipedia"})]})})]})}function l(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>d,x:()=>r});var t=o(6540);const n={},s=t.createContext(n);function d(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06ed4e86.3d735a2d.js b/assets/js/06ed4e86.3d735a2d.js deleted file mode 100644 index 8dac189f0..000000000 --- a/assets/js/06ed4e86.3d735a2d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8161],{3514:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var t=o(4848),n=o(8453);const s={title:"Dolby Digital",sidebar_position:3},a="Dolby Digital",r={id:"audio/Dolby",title:"Dolby Digital",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/audio/Dolby.mdx",sourceDirName:"audio",slug:"/audio/Dolby",permalink:"/docs/audio/Dolby",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Dolby.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Dolby Digital",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Opus",permalink:"/docs/audio/Opus"},next:{title:"MP3",permalink:"/docs/audio/MP3"}},d={},l=[{value:"Format Overview",id:"format-overview",level:2},{value:"AC-3",id:"ac-3",level:3},{value:"Dolby Digital Surround EX",id:"dolby-digital-surround-ex",level:4},{value:"E-AC-3",id:"e-ac-3",level:3},{value:"TrueHD",id:"truehd",level:3},{value:"AC-4",id:"ac-4",level:3},{value:"Atmos",id:"atmos",level:3}];function c(e){const i={admonition:"admonition",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"dolby-digital",children:"Dolby Digital"})}),"\n",(0,t.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsx)(i.p,{children:"Dolby Digital is a family of both lossless and lossy audio compression algorithms and technologies."}),"\n",(0,t.jsx)(i.h2,{id:"format-overview",children:"Format Overview"}),"\n",(0,t.jsx)(i.h3,{id:"ac-3",children:"AC-3"}),"\n",(0,t.jsx)(i.p,{children:"Originally known as Dolby Digital, AC-3 was first released in 1991 to provide digital 5.1 sound in cinemas from 35mm film reels. AC-3 is notable for being the first audio codec to make use of the \u201cModified Discrete Cosine Transform\u201d algorithm. The codec has seen widespread use an adoption, due to its prevalence in DVDs, TV, and Blu-rays as a surround codec."}),"\n",(0,t.jsx)(i.h4,{id:"dolby-digital-surround-ex",children:"Dolby Digital Surround EX"}),"\n",(0,t.jsx)(i.p,{children:"Like Dolby\u2019s earlier Pro Logic technology, Dolby Digital Surround EX matrixes a sixth, centre back surround channel into the left and right surround channels of a 5.1 stream, allowing for a 6.1 mix to be unfolded when played on a 6.1 or 7.1 system with EX decoding. This technology is fully backwards compatible with existing AC-3 decoders, producing the standard 5.1 stream. Surround EX was first introduced in 1999 with the release of \u201cStar Wars: Episode I \u2013 The Phantom Menace\u201d."}),"\n",(0,t.jsx)(i.h3,{id:"e-ac-3",children:"E-AC-3"}),"\n",(0,t.jsx)(i.p,{children:"Often referred to as \u201cDolby Digital Plus\u201d, E-AC-3 is the successor to Dolby\u2019s earlier AC-3 codec, featuring support for higher bitrates (6,144kbps vs 640kbps), more channels (15 vs 5), and additional coding tools allowing for more efficient encoding. E-AC-3 can be found in the short-lived HD-DVD format, Blu-ray discs, and as the main surround codec for most streaming services, particularly if Dolby Atmos is used. Contrary to popular belief, E-AC-3 is not backwards compatible with AC-3, rather Dolby mandates that all E-AC-3 decoders can also decode standard AC-3 content. As E-AC-3 is an optional codec on Blu-ray, all discs encoded with E-AC-3 encode the first 5.1 channels as AC-3, with the additional rear channels/Atmos content being encoded as E-AC-3."}),"\n",(0,t.jsx)(i.h3,{id:"truehd",children:"TrueHD"}),"\n",(0,t.jsx)(i.p,{children:"Dolby\u2019s TrueHD is a lossless multi-channel audio codec based on Meridian\u2019s Lossless Packing (MLP) codec, although the two aren\u2019t compatible with each other. TrueHD is mainly used on Blu-ray and supports Dolby Atmos\u2019s spatial audio data. The TrueHD specification supports up to 16 audio channels (although the Blu-ray specification limits this to 7.1) with a sample rate of 192KHz and a bit depth of 24 bits. As TrueHD is an optional codec on Blu-ray, each TrueHD steam includes a backup AC-3 stream encoded alongside it for compatibility purposes. Since 2010, Dolby TrueHD has seen a decline in usage in favour of DTS-HD Master Audio on Blu-ray discs, but has seen a slight resurgence as the codec used for Dolby Atmos audio, but DTS-HD MA is still more common on non-Atmos titles."}),"\n",(0,t.jsx)(i.h3,{id:"ac-4",children:"AC-4"}),"\n",(0,t.jsx)(i.p,{children:"To be added."}),"\n",(0,t.jsx)(i.h3,{id:"atmos",children:"Atmos"}),"\n",(0,t.jsx)(i.p,{children:"To be added."})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>a,x:()=>r});var t=o(6540);const n={},s=t.createContext(n);function a(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06ed4e86.ef80a140.js b/assets/js/06ed4e86.ef80a140.js new file mode 100644 index 000000000..c975ab9b6 --- /dev/null +++ b/assets/js/06ed4e86.ef80a140.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8161],{9845:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"audio/Dolby","title":"Dolby Digital","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/audio/Dolby.mdx","sourceDirName":"audio","slug":"/audio/Dolby","permalink":"/docs/audio/Dolby","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Dolby.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Dolby Digital","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Opus","permalink":"/docs/audio/Opus"},"next":{"title":"MP3","permalink":"/docs/audio/MP3"}}');var n=o(4848),s=o(8453);const a={title:"Dolby Digital",sidebar_position:3},r="Dolby Digital",l={},d=[{value:"Format Overview",id:"format-overview",level:2},{value:"AC-3",id:"ac-3",level:3},{value:"Dolby Digital Surround EX",id:"dolby-digital-surround-ex",level:4},{value:"E-AC-3",id:"e-ac-3",level:3},{value:"TrueHD",id:"truehd",level:3},{value:"AC-4",id:"ac-4",level:3},{value:"Atmos",id:"atmos",level:3}];function c(e){const i={admonition:"admonition",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"dolby-digital",children:"Dolby Digital"})}),"\n",(0,n.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsx)(i.p,{children:"Dolby Digital is a family of both lossless and lossy audio compression algorithms and technologies."}),"\n",(0,n.jsx)(i.h2,{id:"format-overview",children:"Format Overview"}),"\n",(0,n.jsx)(i.h3,{id:"ac-3",children:"AC-3"}),"\n",(0,n.jsx)(i.p,{children:"Originally known as Dolby Digital, AC-3 was first released in 1991 to provide digital 5.1 sound in cinemas from 35mm film reels. AC-3 is notable for being the first audio codec to make use of the \u201cModified Discrete Cosine Transform\u201d algorithm. The codec has seen widespread use an adoption, due to its prevalence in DVDs, TV, and Blu-rays as a surround codec."}),"\n",(0,n.jsx)(i.h4,{id:"dolby-digital-surround-ex",children:"Dolby Digital Surround EX"}),"\n",(0,n.jsx)(i.p,{children:"Like Dolby\u2019s earlier Pro Logic technology, Dolby Digital Surround EX matrixes a sixth, centre back surround channel into the left and right surround channels of a 5.1 stream, allowing for a 6.1 mix to be unfolded when played on a 6.1 or 7.1 system with EX decoding. This technology is fully backwards compatible with existing AC-3 decoders, producing the standard 5.1 stream. Surround EX was first introduced in 1999 with the release of \u201cStar Wars: Episode I \u2013 The Phantom Menace\u201d."}),"\n",(0,n.jsx)(i.h3,{id:"e-ac-3",children:"E-AC-3"}),"\n",(0,n.jsx)(i.p,{children:"Often referred to as \u201cDolby Digital Plus\u201d, E-AC-3 is the successor to Dolby\u2019s earlier AC-3 codec, featuring support for higher bitrates (6,144kbps vs 640kbps), more channels (15 vs 5), and additional coding tools allowing for more efficient encoding. E-AC-3 can be found in the short-lived HD-DVD format, Blu-ray discs, and as the main surround codec for most streaming services, particularly if Dolby Atmos is used. Contrary to popular belief, E-AC-3 is not backwards compatible with AC-3, rather Dolby mandates that all E-AC-3 decoders can also decode standard AC-3 content. As E-AC-3 is an optional codec on Blu-ray, all discs encoded with E-AC-3 encode the first 5.1 channels as AC-3, with the additional rear channels/Atmos content being encoded as E-AC-3."}),"\n",(0,n.jsx)(i.h3,{id:"truehd",children:"TrueHD"}),"\n",(0,n.jsx)(i.p,{children:"Dolby\u2019s TrueHD is a lossless multi-channel audio codec based on Meridian\u2019s Lossless Packing (MLP) codec, although the two aren\u2019t compatible with each other. TrueHD is mainly used on Blu-ray and supports Dolby Atmos\u2019s spatial audio data. The TrueHD specification supports up to 16 audio channels (although the Blu-ray specification limits this to 7.1) with a sample rate of 192KHz and a bit depth of 24 bits. As TrueHD is an optional codec on Blu-ray, each TrueHD steam includes a backup AC-3 stream encoded alongside it for compatibility purposes. Since 2010, Dolby TrueHD has seen a decline in usage in favour of DTS-HD Master Audio on Blu-ray discs, but has seen a slight resurgence as the codec used for Dolby Atmos audio, but DTS-HD MA is still more common on non-Atmos titles."}),"\n",(0,n.jsx)(i.h3,{id:"ac-4",children:"AC-4"}),"\n",(0,n.jsx)(i.p,{children:"To be added."}),"\n",(0,n.jsx)(i.h3,{id:"atmos",children:"Atmos"}),"\n",(0,n.jsx)(i.p,{children:"To be added."})]})}function u(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>a,x:()=>r});var t=o(6540);const n={},s=t.createContext(n);function a(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/09a8bfdb.0ac1b2f1.js b/assets/js/09a8bfdb.0ac1b2f1.js new file mode 100644 index 000000000..6893c163d --- /dev/null +++ b/assets/js/09a8bfdb.0ac1b2f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5579],{1689:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var s=t(7558),n=t(4848),o=t(8453);const r={title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},a=void 0,d={authorsImageUrls:[void 0]},l=[{value:"A Scenario",id:"a-scenario",level:2},{value:"But First, a Quick Disclosure",id:"but-first-a-quick-disclosure",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"The Website's End",id:"the-websites-end",level:3},{value:"Discord's End",id:"discords-end",level:3},{value:"Strengths & Limitations",id:"strengths--limitations",level:2},{value:"Strengths",id:"strengths",level:4},{value:"Limitations",id:"limitations",level:4},{value:"Differences between Sites",id:"differences-between-sites",level:2},{value:"The Lore",id:"the-lore",level:2},{value:"Dwayne",id:"dwayne",level:3},{value:"Discovery",id:"discovery",level:3},{value:"The Experiments & Interactive Site",id:"the-experiments--interactive-site",level:3},{value:"Virality",id:"virality",level:3},{value:"Closing",id:"closing",level:2}];function h(e){const i={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.img,{alt:"Feature image",src:t(3808).A+"",width:"1920",height:"1080"}),"\n",(0,n.jsx)(i.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,n.jsx)(i.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,n.jsx)(i.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."}),"\n",(0,n.jsx)(i.p,{children:"It loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"stolen.shoes",src:t(7718).A+"",width:"1088",height:"318"})}),"\n",(0,n.jsxs)(i.p,{children:["The truth is, there are ",(0,n.jsx)(i.em,{children:"multiple"})," site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["The big question is, ",(0,n.jsx)(i.strong,{children:"how do they work?"})," Let's get to dissecting."]}),"\n",(0,n.jsx)(i.h2,{id:"but-first-a-quick-disclosure",children:"But First, a Quick Disclosure"}),"\n",(0,n.jsx)(i.p,{children:"The Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately."}),"\n",(0,n.jsx)(i.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,n.jsx)(i.p,{children:"The entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park)."}),"\n",(0,n.jsx)(i.p,{children:"The technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end."}),"\n",(0,n.jsx)(i.h3,{id:"the-websites-end",children:"The Website's End"}),"\n",(0,n.jsx)(i.p,{children:"If you view each website's source, you will find this specific line in each one but they may have a different order:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-html",children:'\n\n\n\n\n'})}),"\n",(0,n.jsxs)(i.p,{children:["These are the ",(0,n.jsx)(i.code,{children:"head"})," parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the ",(0,n.jsx)(i.code,{children:""})," and ",(0,n.jsx)(i.code,{children:""})," tags. Here's an example of a static HTML site serving one specific video:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-html",children:'\n\n\n \n \n some embed site\n \n \n \n \n \n\n\n

Hi

\n

Just your friendly neighborhood video embed site

\n \n\n'})}),"\n",(0,n.jsx)(i.p,{children:"< br />\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms)."}),"\n",(0,n.jsx)(i.h3,{id:"discords-end",children:"Discord's End"}),"\n",(0,n.jsx)(i.p,{children:'Traditionally, Discord\'s media embedder will impose it\'s own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link "tricks" Discord by showing a "false face" first.'}),"\n",(0,n.jsx)(i.h2,{id:"strengths--limitations",children:"Strengths & Limitations"}),"\n",(0,n.jsx)(i.p,{children:"After a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below."}),"\n",(0,n.jsx)(i.h4,{id:"strengths",children:"Strengths"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["You can embed non-web compatible codecs such as ",(0,n.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/HEVC",children:"HEVC"})," in ",(0,n.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v",children:"MP4/MOV"}),", but the user must be using a compatible browser. ",(0,n.jsx)(i.a,{href:"https://thorium.rocks",children:"Thorium"})," or Safari version 13 or greater will work for HEVC playback."]}),"\n",(0,n.jsx)(i.li,{children:"There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them."}),"\n"]}),"\n",(0,n.jsx)(i.h4,{id:"limitations",children:"Limitations"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["You can only use ",(0,n.jsx)(i.a,{href:"https://simple.wikipedia.org/wiki/Hotlinking",children:"hotlinks"}),", which means direct linking to the video itself ending in the appropriate file extension such as ",(0,n.jsx)(i.code,{children:".mp4"}),". Cloud services like Google Drive or OneDrive will not work for storage."]}),"\n",(0,n.jsxs)(i.li,{children:["You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but ",(0,n.jsx)(i.strong,{children:"only discord.nfp.is can do this"}),", as it ",(0,n.jsx)(i.strong,{children:"proxies cdn.discordapp.com"})," itself."]}),"\n",(0,n.jsx)(i.li,{children:"You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord."}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"differences-between-sites",children:"Differences between Sites"}),"\n",(0,n.jsx)(i.p,{children:"As mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality."}),"\n",(0,n.jsx)(i.p,{children:"Here are the sites, each with one noteworthy special benefit:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})," - Recognition, as it is the OG."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})," - You can use Discord CDN as video source."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})," - Immediately input video source into the URL (",(0,n.jsx)(i.code,{children:"https://embeds.video/https://example.com/v/video.mp4"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})," - Attractive domain, simple layout."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})," - Lots of info dump, pretty advanced features."]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"That concludes the technical overview! Next, let's cover the history of this exploit."}),"\n",(0,n.jsx)(i.h2,{id:"the-lore",children:"The Lore"}),"\n",(0,n.jsx)(i.h3,{id:"dwayne",children:"Dwayne"}),"\n",(0,n.jsxs)(i.p,{children:["In around April of 2022, a Reddit user going by the name of u/CreativeGamer03 ",(0,n.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh",children:"posted a video on r/discordapp"}),' of a link where a GIF of Dwayne "The Rock" Johnson plays caption with "Is this a GIF or is it a video?" When played, a low-quality music video of Rick Astley\'s "Never Gonna Give You Up" plays.']}),"\n",(0,n.jsxs)(i.p,{children:["The link used is now unfortunately ",(0,n.jsx)(i.a,{href:"https://archuser.de/the-rock",children:"removed"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:"discovery",children:"Discovery"}),"\n",(0,n.jsxs)(i.p,{children:["On 23rd June 2022, a Discord user ",(0,n.jsx)(i.em,{children:"Clybius"})," on the AV1 Community server asked people for ",(0,n.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/VP9",children:"VP9"})," or ",(0,n.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AVC",children:"H.264"})," videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked."]}),"\n",(0,n.jsxs)(i.p,{children:["He tried shortly afterward with ",(0,n.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AV1",children:"AV1"}),". Eureka, it also worked:"]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"AV1",src:t(5101).A+"",width:"497",height:"421"})}),"\n",(0,n.jsx)(i.p,{children:"Clybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Dwayne",src:t(8111).A+"",width:"1108",height:"98"})}),"\n",(0,n.jsx)(i.h3,{id:"the-experiments--interactive-site",children:"The Experiments & Interactive Site"}),"\n",(0,n.jsxs)(i.p,{children:["After the discovery of AV1 embedding, experimentation brought about the discovery that ",(0,n.jsx)(i.em,{children:"any"})," video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the ",(0,n.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#container",children:"Containers"})," section on the ",(0,n.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology",children:"Terminology"})," page."]}),"\n",(0,n.jsxs)(i.p,{children:["This applies to HEVC, ProRes, ",(0,n.jsx)(i.a,{href:"https://wiki.x266.mov/docs/audio/AAC#xhe-aac",children:"xHE-AAC"}),", and other bizarre codecs that are rarely seen on the Web."]}),"\n",(0,n.jsxs)(i.p,{children:["While experimentating, Clybius converted one their idle domains ",(0,n.jsx)(i.code,{children:"stolen.shoes"})," into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding."]}),"\n",(0,n.jsx)(i.h3,{id:"virality",children:"Virality"}),"\n",(0,n.jsxs)(i.p,{children:["It's not long before people outside of the AV1 Community discovered ",(0,n.jsx)(i.code,{children:"stolen.shoes"}),", and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time."]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:['The first instance featured the DreamWorks sequel of "Puss in Boots (2011)", "Puss in Boots: The Last Wish (2022)". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used ',(0,n.jsx)(i.code,{children:"stolen.shoes"}),"."]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"puss",src:t(7718).A+"",width:"1088",height:"318"})}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:['The second instance was when highly-anticipated animated film "The Super Mario Bros. Movie (2023)" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used ',(0,n.jsx)(i.code,{children:"stolen.shoes"})," as the embed site."]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"mario",src:t(6873).A+"",width:"1307",height:"335"})}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:['The third instance is very recent as of the day this was posted. A streaming-service sourced "Five Nights at Freddy\'s (2023)" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining ',(0,n.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/",children:"hundreds of upvotes within the r/discordapp subreddit"}),". The copy seems to be a compressed 720p encode. This example used ",(0,n.jsx)(i.code,{children:"discord.nfp.is"}),"."]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"fnaf",src:t(8869).A+"",width:"1044",height:"409"})}),"\n",(0,n.jsx)(i.p,{children:"Note the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Top Gun Maverick (2022)"}),"\n",(0,n.jsx)(i.li,{children:"The SpongeBob trilogy (2005/2015/2020)"}),"\n",(0,n.jsx)(i.li,{children:"Spider-Man: Across the Spider-Verse (2023)"}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"closing",children:"Closing"}),"\n",(0,n.jsx)(i.p,{children:"The ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies."}),"\n",(0,n.jsx)(i.p,{children:"While this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms."}),"\n",(0,n.jsx)(i.p,{children:"It is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform."}),"\n",(0,n.jsx)(i.p,{children:"Thank you for reading this blog post, I hope you learned something!"})]})}function c(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},5101:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/clybius-av1-28dcfefe8d58784301332b8119d2e926.webp"},8111:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/clybius-dwayne-15341f187cb8e7dbfd5c4ee00451eabd.webp"},3808:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},8869:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/discordnfpis-fnaf-dab5b24a63605605e7c7882d20a992a3.webp"},6873:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/stolenshoes-mario-6de3b4071d4c09064d7323fec40530f4.webp"},7718:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/stolenshoes-puss-842a1f9165b7571d293a74be89da25c2.webp"},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var s=t(6540);const n={},o=s.createContext(n);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(o.Provider,{value:i},e.children)}},7558:e=>{e.exports=JSON.parse('{"permalink":"/blog/embedding-the-un-embeddable","source":"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx","title":"Embedding the Un-Embeddable","description":"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.","date":"2023-10-29T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"discord","permalink":"/blog/tags/discord"}],"readingTime":8.92,"hasTruncateMarker":true,"authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Embedding the Un-Embeddable","description":"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.","slug":"embedding-the-un-embeddable","authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"}],"tags":["video","discord"],"image":"/img/discord-embed-blog-image.webp","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Encoding Animation with SVT-AV1: A Deep Dive","permalink":"/blog/svt-av1-deep-dive"},"nextItem":{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies"}}')}}]); \ No newline at end of file diff --git a/assets/js/09a8bfdb.8aa625b6.js b/assets/js/09a8bfdb.8aa625b6.js deleted file mode 100644 index c5163b726..000000000 --- a/assets/js/09a8bfdb.8aa625b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5579],{4070:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var s=t(4848),n=t(8453);const o={title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},r=void 0,a={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.92,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4",key:null,page:null}],frontMatter:{title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"},nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},d={authorsImageUrls:[void 0]},l=[{value:"A Scenario",id:"a-scenario",level:2},{value:"But First, a Quick Disclosure",id:"but-first-a-quick-disclosure",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"The Website's End",id:"the-websites-end",level:3},{value:"Discord's End",id:"discords-end",level:3},{value:"Strengths & Limitations",id:"strengths--limitations",level:2},{value:"Strengths",id:"strengths",level:4},{value:"Limitations",id:"limitations",level:4},{value:"Differences between Sites",id:"differences-between-sites",level:2},{value:"The Lore",id:"the-lore",level:2},{value:"Dwayne",id:"dwayne",level:3},{value:"Discovery",id:"discovery",level:3},{value:"The Experiments & Interactive Site",id:"the-experiments--interactive-site",level:3},{value:"Virality",id:"virality",level:3},{value:"Closing",id:"closing",level:2}];function h(e){const i={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.img,{alt:"Feature image",src:t(9395).A+"",width:"1920",height:"1080"}),"\n",(0,s.jsx)(i.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,s.jsx)(i.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,s.jsx)(i.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."}),"\n",(0,s.jsx)(i.p,{children:"It loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"stolen.shoes",src:t(6689).A+"",width:"1088",height:"318"})}),"\n",(0,s.jsxs)(i.p,{children:["The truth is, there are ",(0,s.jsx)(i.em,{children:"multiple"})," site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["The big question is, ",(0,s.jsx)(i.strong,{children:"how do they work?"})," Let's get to dissecting."]}),"\n",(0,s.jsx)(i.h2,{id:"but-first-a-quick-disclosure",children:"But First, a Quick Disclosure"}),"\n",(0,s.jsx)(i.p,{children:"The Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately."}),"\n",(0,s.jsx)(i.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,s.jsx)(i.p,{children:"The entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park)."}),"\n",(0,s.jsx)(i.p,{children:"The technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end."}),"\n",(0,s.jsx)(i.h3,{id:"the-websites-end",children:"The Website's End"}),"\n",(0,s.jsx)(i.p,{children:"If you view each website's source, you will find this specific line in each one but they may have a different order:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n\n\n\n\n'})}),"\n",(0,s.jsxs)(i.p,{children:["These are the ",(0,s.jsx)(i.code,{children:"head"})," parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the ",(0,s.jsx)(i.code,{children:""})," and ",(0,s.jsx)(i.code,{children:""})," tags. Here's an example of a static HTML site serving one specific video:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n\n\n \n \n some embed site\n \n \n \n \n \n\n\n

Hi

\n

Just your friendly neighborhood video embed site

\n \n\n'})}),"\n",(0,s.jsx)(i.p,{children:"< br />\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms)."}),"\n",(0,s.jsx)(i.h3,{id:"discords-end",children:"Discord's End"}),"\n",(0,s.jsx)(i.p,{children:'Traditionally, Discord\'s media embedder will impose it\'s own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link "tricks" Discord by showing a "false face" first.'}),"\n",(0,s.jsx)(i.h2,{id:"strengths--limitations",children:"Strengths & Limitations"}),"\n",(0,s.jsx)(i.p,{children:"After a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below."}),"\n",(0,s.jsx)(i.h4,{id:"strengths",children:"Strengths"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["You can embed non-web compatible codecs such as ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/HEVC",children:"HEVC"})," in ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v",children:"MP4/MOV"}),", but the user must be using a compatible browser. ",(0,s.jsx)(i.a,{href:"https://thorium.rocks",children:"Thorium"})," or Safari version 13 or greater will work for HEVC playback."]}),"\n",(0,s.jsx)(i.li,{children:"There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"limitations",children:"Limitations"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["You can only use ",(0,s.jsx)(i.a,{href:"https://simple.wikipedia.org/wiki/Hotlinking",children:"hotlinks"}),", which means direct linking to the video itself ending in the appropriate file extension such as ",(0,s.jsx)(i.code,{children:".mp4"}),". Cloud services like Google Drive or OneDrive will not work for storage."]}),"\n",(0,s.jsxs)(i.li,{children:["You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but ",(0,s.jsx)(i.strong,{children:"only discord.nfp.is can do this"}),", as it ",(0,s.jsx)(i.strong,{children:"proxies cdn.discordapp.com"})," itself."]}),"\n",(0,s.jsx)(i.li,{children:"You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"differences-between-sites",children:"Differences between Sites"}),"\n",(0,s.jsx)(i.p,{children:"As mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality."}),"\n",(0,s.jsx)(i.p,{children:"Here are the sites, each with one noteworthy special benefit:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})," - Recognition, as it is the OG."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})," - You can use Discord CDN as video source."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})," - Immediately input video source into the URL (",(0,s.jsx)(i.code,{children:"https://embeds.video/https://example.com/v/video.mp4"}),")"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})," - Attractive domain, simple layout."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})," - Lots of info dump, pretty advanced features."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"That concludes the technical overview! Next, let's cover the history of this exploit."}),"\n",(0,s.jsx)(i.h2,{id:"the-lore",children:"The Lore"}),"\n",(0,s.jsx)(i.h3,{id:"dwayne",children:"Dwayne"}),"\n",(0,s.jsxs)(i.p,{children:["In around April of 2022, a Reddit user going by the name of u/CreativeGamer03 ",(0,s.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh",children:"posted a video on r/discordapp"}),' of a link where a GIF of Dwayne "The Rock" Johnson plays caption with "Is this a GIF or is it a video?" When played, a low-quality music video of Rick Astley\'s "Never Gonna Give You Up" plays.']}),"\n",(0,s.jsxs)(i.p,{children:["The link used is now unfortunately ",(0,s.jsx)(i.a,{href:"https://archuser.de/the-rock",children:"removed"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"discovery",children:"Discovery"}),"\n",(0,s.jsxs)(i.p,{children:["On 23rd June 2022, a Discord user ",(0,s.jsx)(i.em,{children:"Clybius"})," on the AV1 Community server asked people for ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/VP9",children:"VP9"})," or ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AVC",children:"H.264"})," videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked."]}),"\n",(0,s.jsxs)(i.p,{children:["He tried shortly afterward with ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AV1",children:"AV1"}),". Eureka, it also worked:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"AV1",src:t(6364).A+"",width:"497",height:"421"})}),"\n",(0,s.jsx)(i.p,{children:"Clybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Dwayne",src:t(3312).A+"",width:"1108",height:"98"})}),"\n",(0,s.jsx)(i.h3,{id:"the-experiments--interactive-site",children:"The Experiments & Interactive Site"}),"\n",(0,s.jsxs)(i.p,{children:["After the discovery of AV1 embedding, experimentation brought about the discovery that ",(0,s.jsx)(i.em,{children:"any"})," video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#container",children:"Containers"})," section on the ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology",children:"Terminology"})," page."]}),"\n",(0,s.jsxs)(i.p,{children:["This applies to HEVC, ProRes, ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/audio/AAC#xhe-aac",children:"xHE-AAC"}),", and other bizarre codecs that are rarely seen on the Web."]}),"\n",(0,s.jsxs)(i.p,{children:["While experimentating, Clybius converted one their idle domains ",(0,s.jsx)(i.code,{children:"stolen.shoes"})," into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding."]}),"\n",(0,s.jsx)(i.h3,{id:"virality",children:"Virality"}),"\n",(0,s.jsxs)(i.p,{children:["It's not long before people outside of the AV1 Community discovered ",(0,s.jsx)(i.code,{children:"stolen.shoes"}),", and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The first instance featured the DreamWorks sequel of "Puss in Boots (2011)", "Puss in Boots: The Last Wish (2022)". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used ',(0,s.jsx)(i.code,{children:"stolen.shoes"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"puss",src:t(6689).A+"",width:"1088",height:"318"})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The second instance was when highly-anticipated animated film "The Super Mario Bros. Movie (2023)" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used ',(0,s.jsx)(i.code,{children:"stolen.shoes"})," as the embed site."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"mario",src:t(5716).A+"",width:"1307",height:"335"})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The third instance is very recent as of the day this was posted. A streaming-service sourced "Five Nights at Freddy\'s (2023)" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining ',(0,s.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/",children:"hundreds of upvotes within the r/discordapp subreddit"}),". The copy seems to be a compressed 720p encode. This example used ",(0,s.jsx)(i.code,{children:"discord.nfp.is"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"fnaf",src:t(3536).A+"",width:"1044",height:"409"})}),"\n",(0,s.jsx)(i.p,{children:"Note the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Top Gun Maverick (2022)"}),"\n",(0,s.jsx)(i.li,{children:"The SpongeBob trilogy (2005/2015/2020)"}),"\n",(0,s.jsx)(i.li,{children:"Spider-Man: Across the Spider-Verse (2023)"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"closing",children:"Closing"}),"\n",(0,s.jsx)(i.p,{children:"The ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies."}),"\n",(0,s.jsx)(i.p,{children:"While this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms."}),"\n",(0,s.jsx)(i.p,{children:"It is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform."}),"\n",(0,s.jsx)(i.p,{children:"Thank you for reading this blog post, I hope you learned something!"})]})}function c(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},6364:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/clybius-av1-28dcfefe8d58784301332b8119d2e926.webp"},3312:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/clybius-dwayne-15341f187cb8e7dbfd5c4ee00451eabd.webp"},9395:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},3536:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/discordnfpis-fnaf-dab5b24a63605605e7c7882d20a992a3.webp"},5716:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/stolenshoes-mario-6de3b4071d4c09064d7323fec40530f4.webp"},6689:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/stolenshoes-puss-842a1f9165b7571d293a74be89da25c2.webp"},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var s=t(6540);const n={},o=s.createContext(n);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/09bc817a.5dc095ed.js b/assets/js/09bc817a.5dc095ed.js deleted file mode 100644 index 9da6cd808..000000000 --- a/assets/js/09bc817a.5dc095ed.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1554],{5811:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>c});var s=i(4848),o=i(8453);const t={title:"Opus",sidebar_position:2},a="Opus",r={id:"audio/Opus",title:"Opus",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/audio/Opus.mdx",sourceDirName:"audio",slug:"/audio/Opus",permalink:"/docs/audio/Opus",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Opus.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Opus",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"AAC",permalink:"/docs/audio/AAC"},next:{title:"Dolby Digital",permalink:"/docs/audio/Dolby"}},d={},c=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"SILK",id:"silk",level:3},{value:"CELT",id:"celt",level:3},{value:"Encoders",id:"encoders",level:2},{value:"Opusenc",id:"opusenc",level:3},{value:"FFopus",id:"ffopus",level:3},{value:"vac-enc",id:"vac-enc",level:3}];function l(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"opus",children:"Opus"})}),"\n",(0,s.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsxs)(n.p,{children:["Opus is an open-source audio codec that has largely replaced ",(0,s.jsx)(n.a,{href:"/docs/audio/Vorbis",children:"Vorbis"})," as the standard open audio codec. It is the recommended codec for usage in WebM video containers in tandem with the ",(0,s.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"})," or ",(0,s.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"})," video codecs."]}),"\n",(0,s.jsxs)(n.p,{children:["Opus is known for its incredible coding efficiency and unique multi-channel optimizations. Stereo Opus audio reaches ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Transparency_(data_compression)",children:"transparency"})," (psychoacoustically lossless audio quality) at 128kb/s, compared to ",(0,s.jsx)(n.a,{href:"/docs/audio/AAC",children:"AAC"}),"'s generally agreed upon 256kb/s and ",(0,s.jsx)(n.a,{href:"/docs/audio/MP3",children:"MP3"}),"'s 320kb/s. Transparency varies based on the type of content & the encoding implementation used, especially for codecs other than Opus, and the values provided above may be debated to a degree."]}),"\n",(0,s.jsxs)(n.p,{children:["Opus is described on ",(0,s.jsx)(n.a,{href:"https://opus-codec.org/",children:"opus-codec.org"}),' as a "totally open, royalty-free, highly versatile audio codec. Opus is unmatched for interactive speech and music transmission over the Internet, but is also intended for storage and streaming applications. It is standardized by the Internet Engineering Task Force (IETF) as ',(0,s.jsx)(n.a,{href:"https://datatracker.ietf.org/doc/html/rfc6716",children:"RFC 6716"}),' which incorporated technology from Skype\u2019s SILK codec and Xiph.Org\u2019s CELT codec."']}),"\n",(0,s.jsx)(n.p,{children:"Opus supports the following features:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Bitrates from 6 kb/s to 510 kb/s (with a maximum of around 255 kb/s per channel on non stereo layouts)"}),"\n",(0,s.jsx)(n.li,{children:"Sampling rates from 8 kHz (narrowband) to 48 kHz (fullband)"}),"\n",(0,s.jsx)(n.li,{children:"Frame sizes from 2.5 ms to 60 ms"}),"\n",(0,s.jsx)(n.li,{children:"Support for both constant bitrate (CBR) and variable bitrate (VBR)"}),"\n",(0,s.jsx)(n.li,{children:"Audio bandwidth from narrowband to fullband"}),"\n",(0,s.jsx)(n.li,{children:"Support for speech and music"}),"\n",(0,s.jsx)(n.li,{children:"Support for mono and stereo"}),"\n",(0,s.jsx)(n.li,{children:"Support for up to 255 channels (multistream frames)"}),"\n",(0,s.jsx)(n.li,{children:"Dynamically adjustable bitrate, audio bandwidth, and frame size"}),"\n",(0,s.jsx)(n.li,{children:"Good loss robustness and packet loss concealment (PLC)"}),"\n",(0,s.jsx)(n.li,{children:"Floating point and fixed-point implementation"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"via opus-codec.org and wiki.hydrogenaud.io"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,s.jsx)(n.p,{children:"Opus is a hybrid audio codec, composed of two codecs as mentioned above. These are Skype's SILK codec for voice & Xiph.Org's CELT codec. Opus's initial name, Harmony, may have been because of the \"harmony\" of these two codecs and the musical connotation of harmony."}),"\n",(0,s.jsx)(n.h3,{id:"silk",children:"SILK"}),"\n",(0,s.jsx)(n.p,{children:"SILK, initially from Skype, was designed to be used for voice calls on Microsoft products like Skype. The first stable release of the codec was in 2009, and since then it has been freely licensed under the BSD 2-Clause license which has allowed for its adoption into Opus. The version of SILK used in Opus is substantially modified from - and not compatible with - the standalone SILK codec previously described here."}),"\n",(0,s.jsx)(n.p,{children:"SILK is optimized for speech, and so has limited sample rates as follows:"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Narrowband: 3-4000hz\nMediumband: 3-6000hz\nWideband: 3-8000hz"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"SILK's latency is 10 to 60ms based on the desired framesize + 5ms lookahead to estimate noise shaping + (potentially) 1.5ms sampling rate conversion overhead if the input audio needs to be resampled."}),"\n",(0,s.jsx)(n.h3,{id:"celt",children:"CELT"}),"\n",(0,s.jsx)(n.p,{children:'Much like SILK, CELT is under the BSD 2-Clause license. The preview release came out in 2011. CELT stands for "Code-Excited Lapped Transform" and was designed to be the true successor to Vorbis, even being dubbed as "Vorbis II" during its initial development as part og Xiph.Org\'s "Ghost" project in 2005.'}),"\n",(0,s.jsxs)(n.p,{children:["CELT was designed to be a full-band general purpose codec without a particular specialization for a certain kind of audio, making it distinctly different from Xiph's ",(0,s.jsx)(n.a,{href:"/docs/audio/Speex",children:"Speex"})," codec & more similar to Vorbis. It is computationally simple relative to competing codec technologies like ",(0,s.jsx)(n.a,{href:"/docs/audio/AAC",children:"AAC"})," & even Vorbis, enabling extremely low latency that is competitive with ",(0,s.jsx)(n.a,{href:"/docs/audio/AAC#aac-ld--aac-eld",children:"AAC-LD"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"CELT can work with the following sample rates:"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Narrowband: 3-4000hz\nMediumband: 3-6000hz\nWideband: 3-8000hz\nSuperWideband: 3-12000hz\nFullband: 3-20000hz"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"encoders",children:"Encoders"}),"\n",(0,s.jsx)(n.h3,{id:"opusenc",children:"Opusenc"}),"\n",(0,s.jsxs)(n.p,{children:["Opus's reference encoder is ",(0,s.jsx)(n.a,{href:"https://github.com/xiph/opus",children:"opusenc"}),", which is known for its fantastic performance and versatility. It is licensed under the BSD 3-clause license as part of the reference libopus library. There are a myriad of options that may be used to encode with opusenc, but the utility is considered to have sane encoding defaults for local storage & playback. The best options will be outlined below."]}),"\n",(0,s.jsxs)(n.p,{children:["Usage: ",(0,s.jsx)(n.code,{children:"opusenc [options] input_file output_file.opus"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bitrate #.###"})," Sets the overall target bitrate in kbit/s. Most encoders use ",(0,s.jsx)(n.em,{children:"bits"}),' per second, meaning you have to specify "128K" for 128kbit/s for example. Opus doesn\'t follow this, so you\'d just have to type "128" though keep in mind using efficient VBR encoding means the final bitrate may be different than the target. Opus supports bitrates from 6 kb/s to 510 kb/s.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--vbr"})," Tells the encoder to encode using a variable bit rate, allocating more or less bits when necessary to preserve overall fidelity per bit. This is the best option for local storage & playback, and is ",(0,s.jsx)(n.em,{children:"enabled by default."})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cvbr"})," Tells the encoder that it is allowed to vary the bitrate like with VBR, but it must constrain the maximum bitrate at any given moment to the value provided."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--hard-cbr"})," Tells the encoder to use a constant bitrate the whole time."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--music"})," & ",(0,s.jsx)(n.code,{children:"--speech"})," Forces the AI content-detector built into opusenc to treat the input as either speech or music. The bitrate range where this is relevant is around 12-40kb/s."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--comp #"})," Sets the encoder complexity to a value from 0 to 10, 0 being the least complex & 10 being the most. ",(0,s.jsx)(n.em,{children:"The default is 10."})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--framesize #"})," Sets the maximum encoder frame size in milliseconds. Lowering this is useful for improving latency at the expense of audio quality per bit. It is worth noting that 40 & 60ms framesizes are just multiple 20ms frames stitched together via opusenc's default behavior, and are not considered useful as they just lower the encoder's adaptability which can worsen both latency & coding efficiency. ",(0,s.jsx)(n.em,{children:"The default value is 20."})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--expect-loss #"})," Percentage value for expected packet loss. Not useful for local encoding & playback, but useful for real-time applications. ",(0,s.jsx)(n.em,{children:"Default value is 0."})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--downmix-mono"})," Downmixes multiple channels into a single channel."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--downmix-stereo"})," Downmixes multiple channels into two channels, left & right, given more than two channels are provided to the encoder."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--no-phase-inv"})," Disables phase inversion. Helpful when downmixing stereo to mono, although this is the default behavior in that scenario since libopus 1.3. Slightly decreases stereo audio quality."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--max-delay #"})," Sets maximum container delay in milliseconds, from 0-1000. ",(0,s.jsx)(n.em,{children:"Default is 1000."})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Looking at the default values for the encoder flags, opusenc almost always follows the best practices for every default value. This makes it very easy to use, and it is as simple as plugging in a source of some kind and using only the most basic commands to encode with opus."}),"\n",(0,s.jsx)(n.p,{children:"An example opusenc command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'opusenc "input.wav" "output.opus" --bitrate 96\n'})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," using libopus:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'ffmpeg -i "input.flac" -c:a libopus -b:a 128K "output.ogg"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["If you'd like to learn more about opusenc & its recommended default behavior, read this article on ",(0,s.jsx)(n.a,{href:"https://wiki.xiph.org/Opus_Recommended_Settings#Bandwidth_Transition_Thresholds",children:"Opus Recommended Settings"}),"."]}),"\n",(0,s.jsxs)(n.admonition,{title:"Existing bug in ffmpeg",type:"info",children:[(0,s.jsxs)(n.p,{children:["Due to a bug in ffmpeg ",(0,s.jsx)(n.a,{href:"https://trac.ffmpeg.org/ticket/5718",children:"(#5718)"}),", ffmpeg won't automatically remap ",(0,s.jsx)(n.code,{children:"5.1(side)"})," to ",(0,s.jsx)(n.code,{children:"5.1"})," when using libopus.",(0,s.jsx)(n.br,{}),"\n","To remap the channel layout explicitly, try this:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'ffmpeg -i "input.flac" -c:a libopus -af aformat=channel_layouts=5.1 "output.ogg"\n'})}),(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsx)(n.p,{children:"You can handle arbitrary audio stream mappings with this:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"-af aformat=channel_layouts=7.1|5.1|stereo -mapping_family 1\n"})})]})]}),"\n",(0,s.jsx)(n.h3,{id:"ffopus",children:"FFopus"}),"\n",(0,s.jsx)(n.p,{children:"FFopus is an experimental native opus encoder from FFmpeg. It is not widely regarded as providing any decent uplift in coding efficiency compared to libopus, and is usually considered worse; its only merit is being able to handle 5.1(side) streams while libopus in FFmpeg cannot. It only implements the CELT part of the Opus codec."}),"\n",(0,s.jsx)(n.p,{children:"FFopus usage:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'ffmpeg -i "input.wma" -c:a opus -b:a 128K -strict -2 "output.opus"\n'})}),"\n",(0,s.jsx)(n.h3,{id:"vac-enc",children:"vac-enc"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/vac-enc",children:"VAC"}),", or Value Added Codec, is a libopus encoder that uses SoX to resample inputs & supports output to ",(0,s.jsx)(n.code,{children:".ogg"})," rather than exclusively ",(0,s.jsx)(n.code,{children:".opus"}),". Better resampling theoretically leads to better coding efficiency, but vac-enc hasn't been thoroughly tested."]}),"\n",(0,s.jsxs)(n.p,{children:["Encoding a 16-bit signed little endian ",(0,s.jsx)(n.code,{children:"pcm_s16le"})," WAV to 128kbit/s Opus in an OGG container:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"vac-enc input.wav output.ogg 128\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var s=i(6540);const o={},t=s.createContext(o);function a(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/09bc817a.aa76edbd.js b/assets/js/09bc817a.aa76edbd.js new file mode 100644 index 000000000..b55a00ee1 --- /dev/null +++ b/assets/js/09bc817a.aa76edbd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1554],{3668:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"audio/Opus","title":"Opus","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/audio/Opus.mdx","sourceDirName":"audio","slug":"/audio/Opus","permalink":"/docs/audio/Opus","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Opus.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Opus","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"AAC","permalink":"/docs/audio/AAC"},"next":{"title":"Dolby Digital","permalink":"/docs/audio/Dolby"}}');var o=i(4848),t=i(8453);const a={title:"Opus",sidebar_position:2},r="Opus",d={},c=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"SILK",id:"silk",level:3},{value:"CELT",id:"celt",level:3},{value:"Encoders",id:"encoders",level:2},{value:"Opusenc",id:"opusenc",level:3},{value:"FFopus",id:"ffopus",level:3},{value:"vac-enc",id:"vac-enc",level:3}];function l(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"opus",children:"Opus"})}),"\n",(0,o.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,o.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,o.jsxs)(n.p,{children:["Opus is an open-source audio codec that has largely replaced ",(0,o.jsx)(n.a,{href:"/docs/audio/Vorbis",children:"Vorbis"})," as the standard open audio codec. It is the recommended codec for usage in WebM video containers in tandem with the ",(0,o.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"})," or ",(0,o.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"})," video codecs."]}),"\n",(0,o.jsxs)(n.p,{children:["Opus is known for its incredible coding efficiency and unique multi-channel optimizations. Stereo Opus audio reaches ",(0,o.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Transparency_(data_compression)",children:"transparency"})," (psychoacoustically lossless audio quality) at 128kb/s, compared to ",(0,o.jsx)(n.a,{href:"/docs/audio/AAC",children:"AAC"}),"'s generally agreed upon 256kb/s and ",(0,o.jsx)(n.a,{href:"/docs/audio/MP3",children:"MP3"}),"'s 320kb/s. Transparency varies based on the type of content & the encoding implementation used, especially for codecs other than Opus, and the values provided above may be debated to a degree."]}),"\n",(0,o.jsxs)(n.p,{children:["Opus is described on ",(0,o.jsx)(n.a,{href:"https://opus-codec.org/",children:"opus-codec.org"}),' as a "totally open, royalty-free, highly versatile audio codec. Opus is unmatched for interactive speech and music transmission over the Internet, but is also intended for storage and streaming applications. It is standardized by the Internet Engineering Task Force (IETF) as ',(0,o.jsx)(n.a,{href:"https://datatracker.ietf.org/doc/html/rfc6716",children:"RFC 6716"}),' which incorporated technology from Skype\u2019s SILK codec and Xiph.Org\u2019s CELT codec."']}),"\n",(0,o.jsx)(n.p,{children:"Opus supports the following features:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Bitrates from 6 kb/s to 510 kb/s (with a maximum of around 255 kb/s per channel on non stereo layouts)"}),"\n",(0,o.jsx)(n.li,{children:"Sampling rates from 8 kHz (narrowband) to 48 kHz (fullband)"}),"\n",(0,o.jsx)(n.li,{children:"Frame sizes from 2.5 ms to 60 ms"}),"\n",(0,o.jsx)(n.li,{children:"Support for both constant bitrate (CBR) and variable bitrate (VBR)"}),"\n",(0,o.jsx)(n.li,{children:"Audio bandwidth from narrowband to fullband"}),"\n",(0,o.jsx)(n.li,{children:"Support for speech and music"}),"\n",(0,o.jsx)(n.li,{children:"Support for mono and stereo"}),"\n",(0,o.jsx)(n.li,{children:"Support for up to 255 channels (multistream frames)"}),"\n",(0,o.jsx)(n.li,{children:"Dynamically adjustable bitrate, audio bandwidth, and frame size"}),"\n",(0,o.jsx)(n.li,{children:"Good loss robustness and packet loss concealment (PLC)"}),"\n",(0,o.jsx)(n.li,{children:"Floating point and fixed-point implementation"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.em,{children:"via opus-codec.org and wiki.hydrogenaud.io"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,o.jsx)(n.p,{children:"Opus is a hybrid audio codec, composed of two codecs as mentioned above. These are Skype's SILK codec for voice & Xiph.Org's CELT codec. Opus's initial name, Harmony, may have been because of the \"harmony\" of these two codecs and the musical connotation of harmony."}),"\n",(0,o.jsx)(n.h3,{id:"silk",children:"SILK"}),"\n",(0,o.jsx)(n.p,{children:"SILK, initially from Skype, was designed to be used for voice calls on Microsoft products like Skype. The first stable release of the codec was in 2009, and since then it has been freely licensed under the BSD 2-Clause license which has allowed for its adoption into Opus. The version of SILK used in Opus is substantially modified from - and not compatible with - the standalone SILK codec previously described here."}),"\n",(0,o.jsx)(n.p,{children:"SILK is optimized for speech, and so has limited sample rates as follows:"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Narrowband: 3-4000hz\nMediumband: 3-6000hz\nWideband: 3-8000hz"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"SILK's latency is 10 to 60ms based on the desired framesize + 5ms lookahead to estimate noise shaping + (potentially) 1.5ms sampling rate conversion overhead if the input audio needs to be resampled."}),"\n",(0,o.jsx)(n.h3,{id:"celt",children:"CELT"}),"\n",(0,o.jsx)(n.p,{children:'Much like SILK, CELT is under the BSD 2-Clause license. The preview release came out in 2011. CELT stands for "Code-Excited Lapped Transform" and was designed to be the true successor to Vorbis, even being dubbed as "Vorbis II" during its initial development as part og Xiph.Org\'s "Ghost" project in 2005.'}),"\n",(0,o.jsxs)(n.p,{children:["CELT was designed to be a full-band general purpose codec without a particular specialization for a certain kind of audio, making it distinctly different from Xiph's ",(0,o.jsx)(n.a,{href:"/docs/audio/Speex",children:"Speex"})," codec & more similar to Vorbis. It is computationally simple relative to competing codec technologies like ",(0,o.jsx)(n.a,{href:"/docs/audio/AAC",children:"AAC"})," & even Vorbis, enabling extremely low latency that is competitive with ",(0,o.jsx)(n.a,{href:"/docs/audio/AAC#aac-ld--aac-eld",children:"AAC-LD"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"CELT can work with the following sample rates:"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Narrowband: 3-4000hz\nMediumband: 3-6000hz\nWideband: 3-8000hz\nSuperWideband: 3-12000hz\nFullband: 3-20000hz"}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"encoders",children:"Encoders"}),"\n",(0,o.jsx)(n.h3,{id:"opusenc",children:"Opusenc"}),"\n",(0,o.jsxs)(n.p,{children:["Opus's reference encoder is ",(0,o.jsx)(n.a,{href:"https://github.com/xiph/opus",children:"opusenc"}),", which is known for its fantastic performance and versatility. It is licensed under the BSD 3-clause license as part of the reference libopus library. There are a myriad of options that may be used to encode with opusenc, but the utility is considered to have sane encoding defaults for local storage & playback. The best options will be outlined below."]}),"\n",(0,o.jsxs)(n.p,{children:["Usage: ",(0,o.jsx)(n.code,{children:"opusenc [options] input_file output_file.opus"})]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--bitrate #.###"})," Sets the overall target bitrate in kbit/s. Most encoders use ",(0,o.jsx)(n.em,{children:"bits"}),' per second, meaning you have to specify "128K" for 128kbit/s for example. Opus doesn\'t follow this, so you\'d just have to type "128" though keep in mind using efficient VBR encoding means the final bitrate may be different than the target. Opus supports bitrates from 6 kb/s to 510 kb/s.']}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--vbr"})," Tells the encoder to encode using a variable bit rate, allocating more or less bits when necessary to preserve overall fidelity per bit. This is the best option for local storage & playback, and is ",(0,o.jsx)(n.em,{children:"enabled by default."})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--cvbr"})," Tells the encoder that it is allowed to vary the bitrate like with VBR, but it must constrain the maximum bitrate at any given moment to the value provided."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--hard-cbr"})," Tells the encoder to use a constant bitrate the whole time."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--music"})," & ",(0,o.jsx)(n.code,{children:"--speech"})," Forces the AI content-detector built into opusenc to treat the input as either speech or music. The bitrate range where this is relevant is around 12-40kb/s."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--comp #"})," Sets the encoder complexity to a value from 0 to 10, 0 being the least complex & 10 being the most. ",(0,o.jsx)(n.em,{children:"The default is 10."})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--framesize #"})," Sets the maximum encoder frame size in milliseconds. Lowering this is useful for improving latency at the expense of audio quality per bit. It is worth noting that 40 & 60ms framesizes are just multiple 20ms frames stitched together via opusenc's default behavior, and are not considered useful as they just lower the encoder's adaptability which can worsen both latency & coding efficiency. ",(0,o.jsx)(n.em,{children:"The default value is 20."})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--expect-loss #"})," Percentage value for expected packet loss. Not useful for local encoding & playback, but useful for real-time applications. ",(0,o.jsx)(n.em,{children:"Default value is 0."})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--downmix-mono"})," Downmixes multiple channels into a single channel."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--downmix-stereo"})," Downmixes multiple channels into two channels, left & right, given more than two channels are provided to the encoder."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--no-phase-inv"})," Disables phase inversion. Helpful when downmixing stereo to mono, although this is the default behavior in that scenario since libopus 1.3. Slightly decreases stereo audio quality."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"--max-delay #"})," Sets maximum container delay in milliseconds, from 0-1000. ",(0,o.jsx)(n.em,{children:"Default is 1000."})]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Looking at the default values for the encoder flags, opusenc almost always follows the best practices for every default value. This makes it very easy to use, and it is as simple as plugging in a source of some kind and using only the most basic commands to encode with opus."}),"\n",(0,o.jsx)(n.p,{children:"An example opusenc command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'opusenc "input.wav" "output.opus" --bitrate 96\n'})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," using libopus:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'ffmpeg -i "input.flac" -c:a libopus -b:a 128K "output.ogg"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If you'd like to learn more about opusenc & its recommended default behavior, read this article on ",(0,o.jsx)(n.a,{href:"https://wiki.xiph.org/Opus_Recommended_Settings#Bandwidth_Transition_Thresholds",children:"Opus Recommended Settings"}),"."]}),"\n",(0,o.jsxs)(n.admonition,{title:"Existing bug in ffmpeg",type:"info",children:[(0,o.jsxs)(n.p,{children:["Due to a bug in ffmpeg ",(0,o.jsx)(n.a,{href:"https://trac.ffmpeg.org/ticket/5718",children:"(#5718)"}),", ffmpeg won't automatically remap ",(0,o.jsx)(n.code,{children:"5.1(side)"})," to ",(0,o.jsx)(n.code,{children:"5.1"})," when using libopus.",(0,o.jsx)(n.br,{}),"\n","To remap the channel layout explicitly, try this:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'ffmpeg -i "input.flac" -c:a libopus -af aformat=channel_layouts=5.1 "output.ogg"\n'})}),(0,o.jsxs)(n.admonition,{type:"tip",children:[(0,o.jsx)(n.p,{children:"You can handle arbitrary audio stream mappings with this:"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"-af aformat=channel_layouts=7.1|5.1|stereo -mapping_family 1\n"})})]})]}),"\n",(0,o.jsx)(n.h3,{id:"ffopus",children:"FFopus"}),"\n",(0,o.jsx)(n.p,{children:"FFopus is an experimental native opus encoder from FFmpeg. It is not widely regarded as providing any decent uplift in coding efficiency compared to libopus, and is usually considered worse; its only merit is being able to handle 5.1(side) streams while libopus in FFmpeg cannot. It only implements the CELT part of the Opus codec."}),"\n",(0,o.jsx)(n.p,{children:"FFopus usage:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'ffmpeg -i "input.wma" -c:a opus -b:a 128K -strict -2 "output.opus"\n'})}),"\n",(0,o.jsx)(n.h3,{id:"vac-enc",children:"vac-enc"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://github.com/gianni-rosato/vac-enc",children:"VAC"}),", or Value Added Codec, is a libopus encoder that uses SoX to resample inputs & supports output to ",(0,o.jsx)(n.code,{children:".ogg"})," rather than exclusively ",(0,o.jsx)(n.code,{children:".opus"}),". Better resampling theoretically leads to better coding efficiency, but vac-enc hasn't been thoroughly tested."]}),"\n",(0,o.jsxs)(n.p,{children:["Encoding a 16-bit signed little endian ",(0,o.jsx)(n.code,{children:"pcm_s16le"})," WAV to 128kbit/s Opus in an OGG container:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"vac-enc input.wav output.ogg 128\n"})})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var s=i(6540);const o={},t=s.createContext(o);function a(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0b185270.32f1c719.js b/assets/js/0b185270.32f1c719.js deleted file mode 100644 index 694d6f53a..000000000 --- a/assets/js/0b185270.32f1c719.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3482],{455:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var n=i(4848),o=i(8453);const s={title:"FAQ",sidebar_label:"\u2753 FAQ",position:14},r="FAQ",a={id:"FAQ",title:"FAQ",description:"Why are you doing this?",source:"@site/docs/FAQ.mdx",sourceDirName:".",slug:"/FAQ",permalink:"/docs/FAQ",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/FAQ.mdx",tags:[],version:"current",frontMatter:{title:"FAQ",sidebar_label:"\u2753 FAQ",position:14},sidebar:"tutorialSidebar",previous:{title:"\u2712\ufe0f Contribution Guide",permalink:"/docs/contribution-guide"},next:{title:"\ud83d\udd0f Privacy Policy",permalink:"/docs/privacy-policy"}},d={},c=[{value:"Why are you doing this?",id:"why-are-you-doing-this",level:2},{value:"But alternatives exist. Why not contribute there?",id:"but-alternatives-exist-why-not-contribute-there",level:3},{value:"How do I get started as a contributor?",id:"how-do-i-get-started-as-a-contributor",level:3},{value:"Why "Codec Wiki"?",id:"why-codec-wiki",level:3}];function l(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"faq",children:"FAQ"})}),"\n",(0,n.jsx)(t.h2,{id:"why-are-you-doing-this",children:"Why are you doing this?"}),"\n",(0,n.jsx)(t.p,{children:"Multimedia encoding & the digital compression space is an incredible field that many tech enthusiasts, professionals, & laymen have no easy entry point to. Wikipedia has a vast amount of information on many of the individual topics covered here but doesn't offer a cohesive way to engage with the entire sphere of knowledge as a whole. While this site started as a lighthearted guide (you'll see the remnants of this strewn about the various wiki entries), it has quickly become an endeavor to unite digital compression aficionados to make the knowledge more accessible for all."}),"\n",(0,n.jsx)(t.h3,{id:"but-alternatives-exist-why-not-contribute-there",children:"But alternatives exist. Why not contribute there?"}),"\n",(0,n.jsx)(t.p,{children:"While this is true, this is easier said than done."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Multimedia Wiki is not as active as it used to be, & a new effort makes sense to carry past efforts forward."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://guide.encode.moe/",children:"guide.encode.moe"})," is stagnant and mostly focused on fansub, docs & personal experiences that are scattered around the Internet."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"There are sources littered about that explain pieces of the larger puzzle, but these serve as small drops in a bucket of vast incoherency & don't meaningfully remedy the steep learning curve for understanding multimedia compression without background knowledge."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"how-do-i-get-started-as-a-contributor",children:"How do I get started as a contributor?"}),"\n",(0,n.jsx)(t.p,{children:"See our Contribution Guide page in the sidebar."}),"\n",(0,n.jsx)(t.h3,{id:"why-codec-wiki",children:'Why "Codec Wiki"?'}),"\n",(0,n.jsx)(t.p,{children:'This wiki is mostly going to be focused on multimedia compression, & the term "Codec" is already widely recognized & understood. While other topics like video filtering & general compression algorithms may be covered, the main focus remains multimedia compression.'})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var n=i(6540);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0b185270.a6fb6998.js b/assets/js/0b185270.a6fb6998.js new file mode 100644 index 000000000..b50d5d18c --- /dev/null +++ b/assets/js/0b185270.a6fb6998.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3482],{9885:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"FAQ","title":"FAQ","description":"Why are you doing this?","source":"@site/docs/FAQ.mdx","sourceDirName":".","slug":"/FAQ","permalink":"/docs/FAQ","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/FAQ.mdx","tags":[],"version":"current","frontMatter":{"title":"FAQ","sidebar_label":"\u2753 FAQ","position":14},"sidebar":"tutorialSidebar","previous":{"title":"\u2712\ufe0f Contribution Guide","permalink":"/docs/contribution-guide"},"next":{"title":"\ud83d\udd0f Privacy Policy","permalink":"/docs/privacy-policy"}}');var o=i(4848),s=i(8453);const r={title:"FAQ",sidebar_label:"\u2753 FAQ",position:14},a="FAQ",d={},c=[{value:"Why are you doing this?",id:"why-are-you-doing-this",level:2},{value:"But alternatives exist. Why not contribute there?",id:"but-alternatives-exist-why-not-contribute-there",level:3},{value:"How do I get started as a contributor?",id:"how-do-i-get-started-as-a-contributor",level:3},{value:"Why "Codec Wiki"?",id:"why-codec-wiki",level:3}];function l(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"faq",children:"FAQ"})}),"\n",(0,o.jsx)(t.h2,{id:"why-are-you-doing-this",children:"Why are you doing this?"}),"\n",(0,o.jsx)(t.p,{children:"Multimedia encoding & the digital compression space is an incredible field that many tech enthusiasts, professionals, & laymen have no easy entry point to. Wikipedia has a vast amount of information on many of the individual topics covered here but doesn't offer a cohesive way to engage with the entire sphere of knowledge as a whole. While this site started as a lighthearted guide (you'll see the remnants of this strewn about the various wiki entries), it has quickly become an endeavor to unite digital compression aficionados to make the knowledge more accessible for all."}),"\n",(0,o.jsx)(t.h3,{id:"but-alternatives-exist-why-not-contribute-there",children:"But alternatives exist. Why not contribute there?"}),"\n",(0,o.jsx)(t.p,{children:"While this is true, this is easier said than done."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsx)(t.p,{children:"Multimedia Wiki is not as active as it used to be, & a new effort makes sense to carry past efforts forward."}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://guide.encode.moe/",children:"guide.encode.moe"})," is stagnant and mostly focused on fansub, docs & personal experiences that are scattered around the Internet."]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsx)(t.p,{children:"There are sources littered about that explain pieces of the larger puzzle, but these serve as small drops in a bucket of vast incoherency & don't meaningfully remedy the steep learning curve for understanding multimedia compression without background knowledge."}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"how-do-i-get-started-as-a-contributor",children:"How do I get started as a contributor?"}),"\n",(0,o.jsx)(t.p,{children:"See our Contribution Guide page in the sidebar."}),"\n",(0,o.jsx)(t.h3,{id:"why-codec-wiki",children:'Why "Codec Wiki"?'}),"\n",(0,o.jsx)(t.p,{children:'This wiki is mostly going to be focused on multimedia compression, & the term "Codec" is already widely recognized & understood. While other topics like video filtering & general compression algorithms may be covered, the main focus remains multimedia compression.'})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var n=i(6540);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c06159a.64876cab.js b/assets/js/0c06159a.64876cab.js new file mode 100644 index 000000000..13ad67af1 --- /dev/null +++ b/assets/js/0c06159a.64876cab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8258],{6533:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"data/tar","title":"tar","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/data/tar.mdx","sourceDirName":"data","slug":"/data/tar","permalink":"/docs/data/tar","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/tar.mdx","tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"title":"tar","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"zstd","permalink":"/docs/data/zstd"},"next":{"title":"JPEG","permalink":"/docs/images/JPEG"}}');var i=a(4848),n=a(8453);const s={title:"tar",sidebar_position:8},o="tar",c={},d=[{value:"Usage",id:"usage",level:2},{value:"Create a tar archive",id:"create-a-tar-archive",level:3},{value:"Extract a tar archive",id:"extract-a-tar-archive",level:3}];function l(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"tar",children:"tar"})}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"tar"}),', or Tape ARchive, is a archiving format and utility first developed for Version 7 Unix in 1977. It\'s original purpose was to collate files into one that can be stored on tape. Similarly, today it is used to bring many files together into a "tarball", which can be compressed with any general data compression algorithm.']}),"\n",(0,i.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsx)(t.p,{children:"This guide has been written for GNU tar on linux, however it should be applicable to BSD tar, macOS tar, and the tar command in powershell on Windows."})}),"\n",(0,i.jsx)(t.h3,{id:"create-a-tar-archive",children:"Create a tar archive"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"tar -cf {archive name} {files listed here}\n"})}),"\n",(0,i.jsxs)(t.p,{children:["You can use ",(0,i.jsx)(t.code,{children:"tar"})," to compress your archive, for example into a ",(0,i.jsx)(t.code,{children:".tar.gz"})," or ",(0,i.jsx)(t.code,{children:".tar.xz"})," archive. To do this, you either can either use a flag such as ",(0,i.jsx)(t.code,{children:"-z"}),", ",(0,i.jsx)(t.code,{children:"-j"}),", or ",(0,i.jsx)(t.code,{children:"-J"})," (",(0,i.jsx)(t.a,{href:"/docs/data/gzip",children:"gzip"}),", ",(0,i.jsx)(t.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,i.jsx)(t.a,{href:"/docs/data/xz",children:"xz"}),"), or you can use ",(0,i.jsx)(t.code,{children:"-a"})," ('automatic'), which allows it to intuit what algorithm you want from the file extension, such as ",(0,i.jsx)(t.code,{children:"archive.tar.xz"})," for an xz compressed tarball."]}),"\n",(0,i.jsx)(t.p,{children:"GNU tar can use these compression algorithms"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"gzip (.gz)"}),"\n",(0,i.jsx)(t.li,{children:"bzip2 (.bz)"}),"\n",(0,i.jsx)(t.li,{children:"xz (.xz)"}),"\n",(0,i.jsx)(t.li,{children:"lzip (.lz)"}),"\n",(0,i.jsx)(t.li,{children:"lzma (.lzma)"}),"\n",(0,i.jsx)(t.li,{children:"lzop (.lzo)"}),"\n",(0,i.jsx)(t.li,{children:"zstd (.zstd)"}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"extract-a-tar-archive",children:"Extract a tar archive"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"tar -xf {tarball}.tar -C {directory to extract to}\n"})}),"\n",(0,i.jsxs)(t.p,{children:["tar can extract from it's supported compressed formats, such as ",(0,i.jsx)(t.code,{children:"archive.tar.xz"})," automatically, with no extra flags."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>o});var r=a(6540);const i={},n=r.createContext(i);function s(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c06159a.b22e0c76.js b/assets/js/0c06159a.b22e0c76.js deleted file mode 100644 index 04cec4921..000000000 --- a/assets/js/0c06159a.b22e0c76.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8258],{1339:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>d});var r=a(4848),i=a(8453);const n={title:"tar",sidebar_position:8},o="tar",s={id:"data/tar",title:"tar",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/tar.mdx",sourceDirName:"data",slug:"/data/tar",permalink:"/docs/data/tar",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/tar.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"tar",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"zstd",permalink:"/docs/data/zstd"},next:{title:"JPEG",permalink:"/docs/images/JPEG"}},c={},d=[{value:"Usage",id:"usage",level:2},{value:"Create a tar archive",id:"create-a-tar-archive",level:3},{value:"Extract a tar archive",id:"extract-a-tar-archive",level:3}];function l(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tar",children:"tar"})}),"\n",(0,r.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,r.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,r.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,r.jsx)(t.p,{children:'tar, or Tape ARchive, is a archiving format and utility first developed for Version 7 Unix in 1977. It\'s original purpose was to collate files into one that can be stored on tape. Similarly, today it is used to bring many files together into a "tarball", which can be compressed with any general data compression algorithm.'}),"\n",(0,r.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsx)(t.p,{children:"This guide has been written for GNU tar on linux, however it should be applicable to BSD tar, macOS tar, and the tar command in powershell on Windows."})}),"\n",(0,r.jsx)(t.h3,{id:"create-a-tar-archive",children:"Create a tar archive"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"tar -cf {archive name} {files listed here}\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can use ",(0,r.jsx)(t.code,{children:"tar"})," to compress your archive, for example into a ",(0,r.jsx)(t.code,{children:".tar.gz"})," or ",(0,r.jsx)(t.code,{children:".tar.xz"})," archive. To do this, you either can either use a flag such as ",(0,r.jsx)(t.code,{children:"-z"}),", ",(0,r.jsx)(t.code,{children:"-j"}),", or ",(0,r.jsx)(t.code,{children:"-J"})," (",(0,r.jsx)(t.a,{href:"/docs/data/gzip",children:"gzip"}),", ",(0,r.jsx)(t.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,r.jsx)(t.a,{href:"/docs/data/xz",children:"xz"}),"), or you can use ",(0,r.jsx)(t.code,{children:"-a"})," ('automatic'), which allows it to intuit what algorithm you want from the file extension, such as ",(0,r.jsx)(t.code,{children:"archive.tar.xz"})," for an xz compressed tarball."]}),"\n",(0,r.jsx)(t.p,{children:"GNU tar can use these compression algorithms"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"gzip (.gz)"}),"\n",(0,r.jsx)(t.li,{children:"bzip2 (.bz)"}),"\n",(0,r.jsx)(t.li,{children:"xz (.xz)"}),"\n",(0,r.jsx)(t.li,{children:"lzip (.lz)"}),"\n",(0,r.jsx)(t.li,{children:"lzma (.lzma)"}),"\n",(0,r.jsx)(t.li,{children:"lzop (.lzo)"}),"\n",(0,r.jsx)(t.li,{children:"zstd (.zstd)"}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"extract-a-tar-archive",children:"Extract a tar archive"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"tar -xf {tarball}.tar -C {directory to extract to}\n"})}),"\n",(0,r.jsxs)(t.p,{children:["tar can extract from it's supported compressed formats, such as ",(0,r.jsx)(t.code,{children:"archive.tar.xz"})," automatically, with no extra flags."]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>s});var r=a(6540);const i={},n=r.createContext(i);function o(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e7f53a8.b1806df5.js b/assets/js/0e7f53a8.b1806df5.js new file mode 100644 index 000000000..38ab003f6 --- /dev/null +++ b/assets/js/0e7f53a8.b1806df5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9954],{2550:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"images/PNG","title":"PNG","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/images/PNG.mdx","sourceDirName":"images","slug":"/images/PNG","permalink":"/docs/images/PNG","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/PNG.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"PNG","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"JPEG","permalink":"/docs/images/JPEG"},"next":{"title":"GIF","permalink":"/docs/images/GIF"}}');var t=i(4848),r=i(8453);const o={title:"PNG",sidebar_position:2},a="PNG",c={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2}];function l(e){const s={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"png",children:"PNG"})}),"\n",(0,t.jsx)(s.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(s.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(s.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(s.p,{children:["Portable Network Graphics (PNG) is a free lossless image file format released in 1996. It was ceated as an alternative to ",(0,t.jsx)(s.a,{href:"/docs/images/GIF",children:"GIF"}),", which was at the time a proprietary format. It gained animation support similar to GIF with the release of APNG in 2008, which is now supported by all popular web browsers."]}),"\n",(0,t.jsx)(s.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,t.jsxs)(s.p,{children:["Lossless? ",(0,t.jsx)(s.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(s.p,{children:["Lossy? ",(0,t.jsx)(s.em,{children:"No"})]}),"\n",(0,t.jsxs)(s.p,{children:["Supported Bit Depths:\n",(0,t.jsx)(s.em,{children:"8 BPC, 16 BPC"})]}),"\n",(0,t.jsxs)(s.p,{children:["HDR/Wide Gamut? ",(0,t.jsx)(s.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(s.p,{children:["Animation? ",(0,t.jsx)(s.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(s.p,{children:["Transparency? ",(0,t.jsx)(s.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(s.p,{children:["Progressive Decode? ",(0,t.jsx)(s.em,{children:"Kinda"})]}),"\n",(0,t.jsxs)(s.p,{children:["Royalty Free? ",(0,t.jsx)(s.em,{children:"Yes"})]})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,i)=>{i.d(s,{R:()=>o,x:()=>a});var n=i(6540);const t={},r=n.createContext(t);function o(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e7f53a8.cffc0ef3.js b/assets/js/0e7f53a8.cffc0ef3.js deleted file mode 100644 index 43216ceac..000000000 --- a/assets/js/0e7f53a8.cffc0ef3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9954],{929:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=n(4848),t=n(8453);const r={title:"PNG",sidebar_position:2},o="PNG",a={id:"images/PNG",title:"PNG",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/PNG.mdx",sourceDirName:"images",slug:"/images/PNG",permalink:"/docs/images/PNG",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/PNG.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"PNG",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"JPEG",permalink:"/docs/images/JPEG"},next:{title:"GIF",permalink:"/docs/images/GIF"}},c={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2}];function l(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"png",children:"PNG"})}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(i.p,{children:["Portable Network Graphics (PNG) is a free lossless image file format released in 1996. It was ceated as an alternative to ",(0,s.jsx)(i.a,{href:"/docs/images/GIF",children:"GIF"}),", which was at the time a proprietary format. It gained animation support similar to GIF with the release of APNG in 2008, which is now supported by all popular web browsers."]}),"\n",(0,s.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,s.jsxs)(i.p,{children:["Lossless? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Lossy? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,s.jsx)(i.em,{children:"8 BPC, 16 BPC"})]}),"\n",(0,s.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Animation? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Transparency? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Progressive Decode? ",(0,s.jsx)(i.em,{children:"Kinda"})]}),"\n",(0,s.jsxs)(i.p,{children:["Royalty Free? ",(0,s.jsx)(i.em,{children:"Yes"})]})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>a});var s=n(6540);const t={},r=s.createContext(t);function o(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/112763a5.7878550e.js b/assets/js/112763a5.7878550e.js new file mode 100644 index 000000000..f6ada3591 --- /dev/null +++ b/assets/js/112763a5.7878550e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1779],{9127:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"terms-of-use","title":"Terms of Use","description":"These terms & conditions outline the rules & regulations for the use of the Codec Wiki Website as a visitor, contributor, or any other party who falls under the jurisdiction of these terms.","source":"@site/docs/terms-of-use.mdx","sourceDirName":".","slug":"/terms-of-use","permalink":"/docs/terms-of-use","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/terms-of-use.mdx","tags":[],"version":"current","frontMatter":{"title":"Terms of Use","sidebar_label":"\ud83e\udd1d Terms of Use","position":16},"sidebar":"tutorialSidebar","previous":{"title":"\ud83d\udd0f Privacy Policy","permalink":"/docs/privacy-policy"}}');var s=o(4848),n=o(8453);const r={title:"Terms of Use",sidebar_label:"\ud83e\udd1d Terms of Use",position:16},a="Terms of Use",l={},c=[];function h(e){const t={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"terms-of-use",children:"Terms of Use"})}),"\n",(0,s.jsx)(t.p,{children:"These terms & conditions outline the rules & regulations for the use of the Codec Wiki Website as a visitor, contributor, or any other party who falls under the jurisdiction of these terms."}),"\n",(0,s.jsx)(t.p,{children:"By accessing this website we assume you accept these terms & conditions. Do not continue to use the site if you do not agree to all of the terms & conditions stated on this page."}),"\n",(0,s.jsx)(t.p,{children:"The following terminology applies to these Terms & Conditions & all other Agreements: \u201cClient\u201d, \u201cYou\u201d & \u201cYour\u201d refers to you, the person log on this website & compliant to these terms & conditions. \u201cOurselves\u201d, \u201cWe\u201d, \u201cOur\u201d & \u201cUs\u201d, refers to the site's owner. \u201cParty\u201d, \u201cParties\u201d, or \u201cUs\u201d, refers to both the Client & ourselves. Any use of the above terminology or other words in the singular, plural, capitalization and/or they/he/she, are taken as interchangeable & therefore as referring to the same."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Cookies"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"We may employ the use of cookies in the future. At the time of writing, we do not. If accessing the site employs the use of cookies, you will be prompted to agree to use cookies in agreement with our Privacy Policy. As of writing, our Privacy Policy does not require users' consent to the use of cookies due to the fact that we do not use cookies."}),"\n",(0,s.jsx)(t.p,{children:"Some interactive websites use cookies to let them retrieve user details for each visit. Cookies may be used by our website to enable the functionality of certain areas to make it easier for people visiting our website."}),"\n",(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsx)(t.li,{children:"Licensing"}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Unless otherwise stated, the site's contributors and/or its licensors own the intellectual property rights for all material on the Codec Wiki. All intellectual property is distributed under CC BY-SA 4.0 unless it is specified otherwise. You may assess the terms & conditions of this Creative Commons license via this link: ",(0,s.jsx)(t.a,{href:"https://creativecommons.org/licenses/by-sa/4.0/",children:"https://creativecommons.org/licenses/by-sa/4.0/"}),". Using assets and/or intellectual property from the Codec Wiki site is subject to these terms unless otherwise specified."]}),"\n",(0,s.jsx)(t.p,{children:"Under CC BY-SA 4.0, you may:"}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Share - copy and redistribute the material in any medium or format."}),"\n"]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Adapt - remix, transform, and build upon the material for any purpose, even commercially."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"No party can revoke these freedoms as long as you follow the license terms. The terms are as follows:"}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Attribution - You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use."}),"\n"]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"ShareAlike - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Contributors may not apply legal terms or technological measures that legally restrict others from doing anything the license permits."}),"\n",(0,s.jsx)(t.p,{children:"Parts of this website may offer an opportunity for users to post & exchange opinions & information in certain areas of the site. We do not filter, edit, publish or review Comments prior to their presence on the website. Comments do not reflect the views & opinions of contributors, its agents and/or affiliates. Comments reflect the views & opinions of the person who posts their views & opinions. To the extent permitted by applicable laws, the site's host & wiki contributors shall not be liable for the Comments or any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the Comments on this website."}),"\n",(0,s.jsx)(t.p,{children:"Part of the nature of a community-developed wiki is the ability for members of the community to make contributions to the contents of the site. Contributors are responsible for their own contributions to the site, & we shall not be liable for the contributions or any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the contributions to this website."}),"\n",(0,s.jsx)(t.p,{children:"We reserve the right to monitor all Comments and/or contributions & to remove any Comments and/or contributions which can be considered inappropriate, offensive or causes a breach of these Terms & Conditions."}),"\n",(0,s.jsx)(t.p,{children:"You warrant & represent that:"}),"\n",(0,s.jsx)(t.p,{children:"You are entitled to post the Comments/contributions on our website & have all necessary licenses & consents to do so;\nThe Comments/contributions do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party;\nThe Comments/contributions do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy\nThe Comments/contributions will not be used to promote unlawful activity."}),"\n",(0,s.jsx)(t.p,{children:"You hereby grant the Codec Wiki a non-exclusive license to use, reproduce, edit & authorize others to use, reproduce & edit any of your Comments/contributions in any & all forms, formats or media."}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:"iFrames"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"You may not create frames around our Webpages that alter in any way the visual presentation or appearance of our Website without proper attribution per CC BY-SA 4.0 where the license applies. Elsewhere, written permission is required if an asset is not under the CC BY-SA 4.0 license."}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsx)(t.li,{children:"Content Liability"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"We shall not be held responsible for any content that appears on your Website. You agree to protect & defend us against all claims that arise on your Website. No link(s) should appear on any Website that may be interpreted as libelous, obscene, or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights."}),"\n",(0,s.jsxs)(t.ol,{start:"5",children:["\n",(0,s.jsx)(t.li,{children:"Your Privacy"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Please read our Privacy Policy."}),"\n",(0,s.jsxs)(t.ol,{start:"6",children:["\n",(0,s.jsx)(t.li,{children:"Reservation of Rights"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"We reserve the right to request that you remove all links or any particular link to our Website. You approve to immediately remove all links to our Website upon request. We also reserve the right to amend these terms & conditions & its linking policy at any time. By continuously linking to our Website, you agree to be bound to & follow these terms & conditions."}),"\n",(0,s.jsxs)(t.ol,{start:"7",children:["\n",(0,s.jsx)(t.li,{children:"Removal of links from our website"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"If you find any link on our Website that is offensive for any reason, you are free to contact & inform us at any moment. We will consider requests to remove links but we are not obligated to or so or to respond to you directly. We do not ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we promise to ensure that the website remains available or that the material on the website is kept up-to-date."}),"\n",(0,s.jsxs)(t.ol,{start:"8",children:["\n",(0,s.jsx)(t.li,{children:"Disclaimer"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"To the maximum extent permitted by applicable law, we exclude all representations, warranties & conditions relating to our website & the use of this website. Nothing in this disclaimer will:"}),"\n",(0,s.jsx)(t.p,{children:"limit or exclude our or your liability for death or personal injury;\nlimit or exclude our or your liability for fraud or fraudulent misrepresentation;\nlimit any of our or your liabilities in any way that is not permitted under applicable law; or\nexclude any of our or your liabilities that may not be excluded under applicable law."}),"\n",(0,s.jsx)(t.p,{children:"The limitations & prohibitions of liability set in this Section & elsewhere in this disclaimer: (a) are subject to the preceding paragraph; & (b) govern all liabilities arising under the disclaimer, including liabilities arising in contract, in tort & for breach of statutory duty."}),"\n",(0,s.jsx)(t.p,{children:"As long as the website & the information on the website are provided free of charge, we will not be liable for any loss or damage of any nature."})]})}function u(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>a});var i=o(6540);const s={},n=i.createContext(s);function r(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/112763a5.ca0b41a6.js b/assets/js/112763a5.ca0b41a6.js deleted file mode 100644 index ea5a36779..000000000 --- a/assets/js/112763a5.ca0b41a6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1779],{5836:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=o(4848),n=o(8453);const s={title:"Terms of Use",sidebar_label:"\ud83e\udd1d Terms of Use",position:16},r="Terms of Use",a={id:"terms-of-use",title:"Terms of Use",description:"These terms & conditions outline the rules & regulations for the use of the Codec Wiki Website as a visitor, contributor, or any other party who falls under the jurisdiction of these terms.",source:"@site/docs/terms-of-use.mdx",sourceDirName:".",slug:"/terms-of-use",permalink:"/docs/terms-of-use",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/terms-of-use.mdx",tags:[],version:"current",frontMatter:{title:"Terms of Use",sidebar_label:"\ud83e\udd1d Terms of Use",position:16},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udd0f Privacy Policy",permalink:"/docs/privacy-policy"}},l={},c=[];function h(e){const t={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"terms-of-use",children:"Terms of Use"})}),"\n",(0,i.jsx)(t.p,{children:"These terms & conditions outline the rules & regulations for the use of the Codec Wiki Website as a visitor, contributor, or any other party who falls under the jurisdiction of these terms."}),"\n",(0,i.jsx)(t.p,{children:"By accessing this website we assume you accept these terms & conditions. Do not continue to use the site if you do not agree to all of the terms & conditions stated on this page."}),"\n",(0,i.jsx)(t.p,{children:"The following terminology applies to these Terms & Conditions & all other Agreements: \u201cClient\u201d, \u201cYou\u201d & \u201cYour\u201d refers to you, the person log on this website & compliant to these terms & conditions. \u201cOurselves\u201d, \u201cWe\u201d, \u201cOur\u201d & \u201cUs\u201d, refers to the site's owner. \u201cParty\u201d, \u201cParties\u201d, or \u201cUs\u201d, refers to both the Client & ourselves. Any use of the above terminology or other words in the singular, plural, capitalization and/or they/he/she, are taken as interchangeable & therefore as referring to the same."}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Cookies"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"We may employ the use of cookies in the future. At the time of writing, we do not. If accessing the site employs the use of cookies, you will be prompted to agree to use cookies in agreement with our Privacy Policy. As of writing, our Privacy Policy does not require users' consent to the use of cookies due to the fact that we do not use cookies."}),"\n",(0,i.jsx)(t.p,{children:"Some interactive websites use cookies to let them retrieve user details for each visit. Cookies may be used by our website to enable the functionality of certain areas to make it easier for people visiting our website."}),"\n",(0,i.jsxs)(t.ol,{start:"2",children:["\n",(0,i.jsx)(t.li,{children:"Licensing"}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Unless otherwise stated, the site's contributors and/or its licensors own the intellectual property rights for all material on the Codec Wiki. All intellectual property is distributed under CC BY-SA 4.0 unless it is specified otherwise. You may assess the terms & conditions of this Creative Commons license via this link: ",(0,i.jsx)(t.a,{href:"https://creativecommons.org/licenses/by-sa/4.0/",children:"https://creativecommons.org/licenses/by-sa/4.0/"}),". Using assets and/or intellectual property from the Codec Wiki site is subject to these terms unless otherwise specified."]}),"\n",(0,i.jsx)(t.p,{children:"Under CC BY-SA 4.0, you may:"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Share - copy and redistribute the material in any medium or format."}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Adapt - remix, transform, and build upon the material for any purpose, even commercially."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"No party can revoke these freedoms as long as you follow the license terms. The terms are as follows:"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Attribution - You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use."}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"ShareAlike - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Contributors may not apply legal terms or technological measures that legally restrict others from doing anything the license permits."}),"\n",(0,i.jsx)(t.p,{children:"Parts of this website may offer an opportunity for users to post & exchange opinions & information in certain areas of the site. We do not filter, edit, publish or review Comments prior to their presence on the website. Comments do not reflect the views & opinions of contributors, its agents and/or affiliates. Comments reflect the views & opinions of the person who posts their views & opinions. To the extent permitted by applicable laws, the site's host & wiki contributors shall not be liable for the Comments or any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the Comments on this website."}),"\n",(0,i.jsx)(t.p,{children:"Part of the nature of a community-developed wiki is the ability for members of the community to make contributions to the contents of the site. Contributors are responsible for their own contributions to the site, & we shall not be liable for the contributions or any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the contributions to this website."}),"\n",(0,i.jsx)(t.p,{children:"We reserve the right to monitor all Comments and/or contributions & to remove any Comments and/or contributions which can be considered inappropriate, offensive or causes a breach of these Terms & Conditions."}),"\n",(0,i.jsx)(t.p,{children:"You warrant & represent that:"}),"\n",(0,i.jsx)(t.p,{children:"You are entitled to post the Comments/contributions on our website & have all necessary licenses & consents to do so;\nThe Comments/contributions do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party;\nThe Comments/contributions do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy\nThe Comments/contributions will not be used to promote unlawful activity."}),"\n",(0,i.jsx)(t.p,{children:"You hereby grant the Codec Wiki a non-exclusive license to use, reproduce, edit & authorize others to use, reproduce & edit any of your Comments/contributions in any & all forms, formats or media."}),"\n",(0,i.jsxs)(t.ol,{start:"3",children:["\n",(0,i.jsx)(t.li,{children:"iFrames"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"You may not create frames around our Webpages that alter in any way the visual presentation or appearance of our Website without proper attribution per CC BY-SA 4.0 where the license applies. Elsewhere, written permission is required if an asset is not under the CC BY-SA 4.0 license."}),"\n",(0,i.jsxs)(t.ol,{start:"4",children:["\n",(0,i.jsx)(t.li,{children:"Content Liability"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"We shall not be held responsible for any content that appears on your Website. You agree to protect & defend us against all claims that arise on your Website. No link(s) should appear on any Website that may be interpreted as libelous, obscene, or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights."}),"\n",(0,i.jsxs)(t.ol,{start:"5",children:["\n",(0,i.jsx)(t.li,{children:"Your Privacy"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Please read our Privacy Policy."}),"\n",(0,i.jsxs)(t.ol,{start:"6",children:["\n",(0,i.jsx)(t.li,{children:"Reservation of Rights"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"We reserve the right to request that you remove all links or any particular link to our Website. You approve to immediately remove all links to our Website upon request. We also reserve the right to amend these terms & conditions & its linking policy at any time. By continuously linking to our Website, you agree to be bound to & follow these terms & conditions."}),"\n",(0,i.jsxs)(t.ol,{start:"7",children:["\n",(0,i.jsx)(t.li,{children:"Removal of links from our website"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"If you find any link on our Website that is offensive for any reason, you are free to contact & inform us at any moment. We will consider requests to remove links but we are not obligated to or so or to respond to you directly. We do not ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we promise to ensure that the website remains available or that the material on the website is kept up-to-date."}),"\n",(0,i.jsxs)(t.ol,{start:"8",children:["\n",(0,i.jsx)(t.li,{children:"Disclaimer"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"To the maximum extent permitted by applicable law, we exclude all representations, warranties & conditions relating to our website & the use of this website. Nothing in this disclaimer will:"}),"\n",(0,i.jsx)(t.p,{children:"limit or exclude our or your liability for death or personal injury;\nlimit or exclude our or your liability for fraud or fraudulent misrepresentation;\nlimit any of our or your liabilities in any way that is not permitted under applicable law; or\nexclude any of our or your liabilities that may not be excluded under applicable law."}),"\n",(0,i.jsx)(t.p,{children:"The limitations & prohibitions of liability set in this Section & elsewhere in this disclaimer: (a) are subject to the preceding paragraph; & (b) govern all liabilities arising under the disclaimer, including liabilities arising in contract, in tort & for breach of statutory duty."}),"\n",(0,i.jsx)(t.p,{children:"As long as the website & the information on the website are provided free of charge, we will not be liable for any loss or damage of any nature."})]})}function u(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>a});var i=o(6540);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12b076f3.9eb621f4.js b/assets/js/12b076f3.9eb621f4.js deleted file mode 100644 index 15138cc35..000000000 --- a/assets/js/12b076f3.9eb621f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7222],{9905:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>l});var i=t(4848),a=t(8453);const o={title:"zstd",sidebar_position:7},r="Zstandard",n={id:"data/zstd",title:"zstd",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/zstd.mdx",sourceDirName:"data",slug:"/data/zstd",permalink:"/docs/data/zstd",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zstd.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"zstd",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"zpaq",permalink:"/docs/data/zpaq"},next:{title:"tar",permalink:"/docs/data/tar"}},d={},l=[{value:"Usage",id:"usage",level:2},{value:"Compress a file",id:"compress-a-file",level:2},{value:"Decompress a file",id:"decompress-a-file",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"zstandard",children:"Zstandard"})}),"\n",(0,i.jsx)(s.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(s.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(s.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(s.p,{children:["Zstandard is a compression algorithm developed by Facebook known for its extremely fast decompression speeds. It was released in early 2015 and is used in a variety of different contexts. It was designed to perform similarly to older Deflate-based compression algorithms like ",(0,i.jsx)(s.a,{href:"/docs/data/zip",children:"ZIP"})," or ",(0,i.jsx)(s.a,{href:"/docs/data/gzip",children:"gzip"})," while being faster overall. In practice, it is said to compress similarly to pure LZMA (part of ",(0,i.jsx)(s.a,{href:"/docs/data/xz",children:"XZ"})," & ",(0,i.jsx)(s.a,{href:"/docs/data/7z",children:"7-zip"}),") while being much faster."]}),"\n",(0,i.jsxs)(s.p,{children:["While ",(0,i.jsx)(s.code,{children:".tar.zstd"})," archives aren't as popular as ",(0,i.jsx)(s.code,{children:".tar.xz"})," or ",(0,i.jsx)(s.code,{children:".tar.gz"}),", Zstandard is already a very popular tool for compression in the world of open-source software. It has been integrated into both the FreeBSD kernel & the Linux kernel and is available as a filesystem compression method for the btrfs, squashfs, bcachefs, & OpenZFS filesystems. Filesystem compression refers to a compression scheme that transparently compresses files stored on a filesystem at all times, leading to an overall reduction in storage used across the filesystem."]}),"\n",(0,i.jsxs)(s.p,{children:["The command line ",(0,i.jsx)(s.code,{children:"zstd"})," utility can compress to Zstandard at compression levels 1 through 19 by default. The upper bound is raised to 22 when passing the ",(0,i.jsx)(s.code,{children:"--ultra"})," flag. All Arch Linux packages are compressed at zstd level 20, allowing Arch packages to be decompressed 14 times faster compared to XZ at the cost of an average 0.8% filesize increase across all packages. It is popular in the game emulation scene as well, as many game file formats for emulating console games support zstd compression. The ZIP file format standard actually supports Zstandard in compression level 93 since version 6.3.8, published in 2020. Content encoding using zstd is supported in chromium since Chromium 118 behind an experimental flag, meaning it might compete with ",(0,i.jsx)(s.a,{href:"/docs/data/brotli",children:"Brotli"})," on the web in the future. Apple's LZFSE algorithm is purportedly similar to Zstandard compression level 6."]}),"\n",(0,i.jsxs)(s.p,{children:["Zstandard has the potential to effectively compete with nearly every modern compression method available across most modern use cases. In certain scenarios, if it takes off as a content delivery format, it could replace Brotli if the benefits of super-fast & super-light decode improve the responsiveness of web pages & are worth sacrificing a bit of compression ratio. When using the much higher effort settings, it often outcompetes Brotli for the archive size as well. In the future, ",(0,i.jsx)(s.code,{children:".tar.zst"})," could replace 7-zip, ZIP, or other archiving formats, making speedy decode a reality on systems featuring varying levels of compute horsepower."]}),"\n",(0,i.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsxs)(s.p,{children:["This guide has been written for the ",(0,i.jsx)(s.code,{children:"zstd"})," command-line utility, however GUI archivers such as peazip and 7zip have growing support for zstd."]})}),"\n",(0,i.jsx)(s.h2,{id:"compress-a-file",children:"Compress a file"}),"\n",(0,i.jsxs)(s.p,{children:["Like many other compressing utilities, in order to compress mutliple files, one should probably archive them with ",(0,i.jsx)(s.a,{href:"/docs/data/tar",children:"tar"}),"."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"zstd -# {file} -o {file}.zstd\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"-#"})," is actually a number that represents the desired compression level, for example ",(0,i.jsx)(s.code,{children:"-3"}),", ",(0,i.jsx)(s.code,{children:"-6"}),". By default you can specify 1-19. By also passing ",(0,i.jsx)(s.code,{children:"-ultra"}),", you can go up to compression level 22."]}),"\n",(0,i.jsx)(s.h2,{id:"decompress-a-file",children:"Decompress a file"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"zstd -d {file}.zstd -o file\n"})})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>n});var i=t(6540);const a={},o=i.createContext(a);function r(e){const s=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function n(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12b076f3.dfbfac79.js b/assets/js/12b076f3.dfbfac79.js new file mode 100644 index 000000000..55e8829aa --- /dev/null +++ b/assets/js/12b076f3.dfbfac79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7222],{4326:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>n,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"data/zstd","title":"zstd","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/data/zstd.mdx","sourceDirName":"data","slug":"/data/zstd","permalink":"/docs/data/zstd","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zstd.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"zstd","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"zpaq","permalink":"/docs/data/zpaq"},"next":{"title":"tar","permalink":"/docs/data/tar"}}');var a=t(4848),o=t(8453);const r={title:"zstd",sidebar_position:7},n="Zstandard",d={},l=[{value:"Usage",id:"usage",level:2},{value:"Compress a file",id:"compress-a-file",level:2},{value:"Decompress a file",id:"decompress-a-file",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"zstandard",children:"Zstandard"})}),"\n",(0,a.jsx)(s.admonition,{title:"Help Wanted",type:"danger",children:(0,a.jsxs)(s.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,a.jsx)(s.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,a.jsxs)(s.p,{children:["Zstandard is a compression algorithm developed by Facebook known for its extremely fast decompression speeds. It was released in early 2015 and is used in a variety of different contexts. It was designed to perform similarly to older Deflate-based compression algorithms like ",(0,a.jsx)(s.a,{href:"/docs/data/zip",children:"ZIP"})," or ",(0,a.jsx)(s.a,{href:"/docs/data/gzip",children:"gzip"})," while being faster overall. In practice, it is said to compress similarly to pure LZMA (part of ",(0,a.jsx)(s.a,{href:"/docs/data/xz",children:"XZ"})," & ",(0,a.jsx)(s.a,{href:"/docs/data/7z",children:"7-zip"}),") while being much faster."]}),"\n",(0,a.jsxs)(s.p,{children:["While ",(0,a.jsx)(s.code,{children:".tar.zstd"})," archives aren't as popular as ",(0,a.jsx)(s.code,{children:".tar.xz"})," or ",(0,a.jsx)(s.code,{children:".tar.gz"}),", Zstandard is already a very popular tool for compression in the world of open-source software. It has been integrated into both the FreeBSD kernel & the Linux kernel and is available as a filesystem compression method for the btrfs, squashfs, bcachefs, & OpenZFS filesystems. Filesystem compression refers to a compression scheme that transparently compresses files stored on a filesystem at all times, leading to an overall reduction in storage used across the filesystem."]}),"\n",(0,a.jsxs)(s.p,{children:["The command line ",(0,a.jsx)(s.code,{children:"zstd"})," utility can compress to Zstandard at compression levels 1 through 19 by default. The upper bound is raised to 22 when passing the ",(0,a.jsx)(s.code,{children:"--ultra"})," flag. All Arch Linux packages are compressed at zstd level 20, allowing Arch packages to be decompressed 14 times faster compared to XZ at the cost of an average 0.8% filesize increase across all packages. It is popular in the game emulation scene as well, as many game file formats for emulating console games support zstd compression. The ZIP file format standard actually supports Zstandard in compression level 93 since version 6.3.8, published in 2020. Content encoding using zstd is supported in chromium since Chromium 118 behind an experimental flag, meaning it might compete with ",(0,a.jsx)(s.a,{href:"/docs/data/brotli",children:"Brotli"})," on the web in the future. Apple's LZFSE algorithm is purportedly similar to Zstandard compression level 6."]}),"\n",(0,a.jsxs)(s.p,{children:["Zstandard has the potential to effectively compete with nearly every modern compression method available across most modern use cases. In certain scenarios, if it takes off as a content delivery format, it could replace Brotli if the benefits of super-fast & super-light decode improve the responsiveness of web pages & are worth sacrificing a bit of compression ratio. When using the much higher effort settings, it often outcompetes Brotli for the archive size as well. In the future, ",(0,a.jsx)(s.code,{children:".tar.zst"})," could replace 7-zip, ZIP, or other archiving formats, making speedy decode a reality on systems featuring varying levels of compute horsepower."]}),"\n",(0,a.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsx)(s.admonition,{type:"note",children:(0,a.jsxs)(s.p,{children:["This guide has been written for the ",(0,a.jsx)(s.code,{children:"zstd"})," command-line utility, however GUI archivers such as peazip and 7zip have growing support for zstd."]})}),"\n",(0,a.jsx)(s.h2,{id:"compress-a-file",children:"Compress a file"}),"\n",(0,a.jsxs)(s.p,{children:["Like many other compressing utilities, in order to compress mutliple files, one should probably archive them with ",(0,a.jsx)(s.a,{href:"/docs/data/tar",children:"tar"}),"."]}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"zstd -# {file} -o {file}.zstd\n"})}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.code,{children:"-#"})," is actually a number that represents the desired compression level, for example ",(0,a.jsx)(s.code,{children:"-3"}),", ",(0,a.jsx)(s.code,{children:"-6"}),". By default you can specify 1-19. By also passing ",(0,a.jsx)(s.code,{children:"-ultra"}),", you can go up to compression level 22."]}),"\n",(0,a.jsx)(s.h2,{id:"decompress-a-file",children:"Decompress a file"}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"zstd -d {file}.zstd -o file\n"})})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>n});var i=t(6540);const a={},o=i.createContext(a);function r(e){const s=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function n(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12df3b9e.1600344c.js b/assets/js/12df3b9e.1600344c.js deleted file mode 100644 index cd10da33b..000000000 --- a/assets/js/12df3b9e.1600344c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9993],{1793:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=s(4848),t=s(8453);const r={title:"QOI",sidebar_position:8},a="QOI",o={id:"images/QOI",title:"QOI",description:"QOI (Quite OK Image Format) is an image compression format that aims to provide a simple, fast, and efficient way to compress and decompress images losslessly. It was designed to be easy to implement while offering better compression ratios than the widely used but more complex PNG format while achieving much faster encoding & decoding speeds.",source:"@site/docs/images/QOI.mdx",sourceDirName:"images",slug:"/images/QOI",permalink:"/docs/images/QOI",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/QOI.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"QOI",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"JPEG XL",permalink:"/docs/images/JXL"},next:{title:"x264",permalink:"/docs/encoders/x264"}},l={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Benchmarks",id:"benchmarks",level:3},{value:"Advantages",id:"advantages",level:3},{value:"Limitations",id:"limitations",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"qoi",children:"QOI"})}),"\n",(0,i.jsxs)(n.p,{children:["QOI (Quite OK Image Format) is an image compression format that aims to provide a simple, fast, and efficient way to compress and decompress images losslessly. It was designed to be easy to implement while offering better compression ratios than the widely used but more complex ",(0,i.jsx)(n.a,{href:"/docs/images/PNG",children:"PNG"})," format while achieving much faster encoding & decoding speeds."]}),"\n",(0,i.jsx)(n.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,i.jsxs)(n.p,{children:["Lossless? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Lossy? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Supported Bit Depths:\n",(0,i.jsx)(n.em,{children:"8 BPC"})]}),"\n",(0,i.jsxs)(n.p,{children:["HDR/Wide Gamut? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Animation? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Transparency? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Progressive Decode? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Royalty Free? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsx)(n.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,i.jsx)(n.p,{children:"QOI compression is based on a simple and fast algorithm that exploits spatial redundancy in images. The algorithm uses a combination of run-length encoding (RLE), a small lookup table, delta encoding, and full-color pixel storage to achieve efficient compression. Depending on the algorithm's decision, a chunk (pixel) can take up one to five bytes."}),"\n",(0,i.jsx)(n.p,{children:"The QOI format supports images with 3 or 4 channels (RGB or RGBA) and 8 bits per channel. The format supports two colorspaces: Linear RGB & sRGB with linear alpha. These do not affect the way pixels are encoded."}),"\n",(0,i.jsx)(n.p,{children:"Here is a breakdown of the various chunk types in QOI:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_RGB"})}),": Full RGB pixel value using 8 bits (1 byte) for each of the red, green, and blue channels. The alpha channel is 255 in RGB images, and always remains unchanged."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_RGBA"})}),": Full RGBA pixel value using 8 bits for each of the red, green, blue, & alpha channels."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_DIFF"})}),": The difference between the current pixel and the previous pixel for the red, green, and blue channels are stored using 2 bits for each channel. The differences are stored with a bias of 2 and wrap (so 1 minus 2 would be 255). The alpha channel remains unchanged."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_LUMA"})}),": These pixels encode the green channel difference from the previous pixel using 6 bits, and then encode the red and blue channel differences relative to the green channel difference using 4 bits each. This allows for more efficient encoding of small color changes. The alpha channel remains unchanged."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_RUN"})}),": These are the simplest, encoding a run-length of pixels that are identical to the previous pixel. The run length is stored using 6 bits with a bias of -1, allowing for runs of 1 to 62 pixels."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_INDEX"})}),": These are stored by referencing a previously seen pixel value from a rolling array of 64 recent pixel values by using a simple hash on each pixel as it is identified. If another pixel matches a previously seen hash value in the array, the index of the referenced pixel is stored."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The QOI format also includes a simple 14-byte header that stores the image dimensions, color space, and channel depth information. The end of file is signaled by an 8-byte end marker."}),"\n",(0,i.jsx)(n.h3,{id:"benchmarks",children:"Benchmarks"}),"\n",(0,i.jsxs)(n.p,{children:["The creator of QOI benchmarked the format against libpng & ",(0,i.jsx)(n.code,{children:"stbi_image_write"})," using the C implementation in QOI via ",(0,i.jsx)(n.a,{href:"https://github.com/phoboslab/qoi/blob/master/qoibench.c",children:(0,i.jsx)(n.code,{children:"qoibench.c"})})," on a collection of 2,879 screenshots, icons, photos, & textures (",(0,i.jsx)(n.a,{href:"https://qoiformat.org/benchmark/qoi_benchmark_suite.tar",children:"source"}),"). The results are as follows:"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Library"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Decode (ms)"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Encode (ms)"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Decode MP/s"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Encode MP/s"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Size (kb)"})}),(0,i.jsx)(n.th,{style:{textAlign:"right"},children:(0,i.jsx)(n.strong,{children:"Compression Rate"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"libpng"})}),(0,i.jsx)(n.td,{children:"7.0"}),(0,i.jsx)(n.td,{children:"83.8"}),(0,i.jsx)(n.td,{children:"66.56"}),(0,i.jsx)(n.td,{children:"5.54"}),(0,i.jsx)(n.td,{children:"398"}),(0,i.jsx)(n.td,{style:{textAlign:"right"},children:"24.2%"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"stbi"})}),(0,i.jsx)(n.td,{children:"7.0"}),(0,i.jsx)(n.td,{children:"60.5"}),(0,i.jsx)(n.td,{children:"66.63"}),(0,i.jsx)(n.td,{children:"7.67"}),(0,i.jsx)(n.td,{children:"561"}),(0,i.jsx)(n.td,{style:{textAlign:"right"},children:"34.2%"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"qoi"})}),(0,i.jsx)(n.td,{children:"2.1"}),(0,i.jsx)(n.td,{children:"2.9"}),(0,i.jsx)(n.td,{children:"226.03"}),(0,i.jsx)(n.td,{children:"161.99"}),(0,i.jsx)(n.td,{children:"463"}),(0,i.jsx)(n.td,{style:{textAlign:"right"},children:"28.2%"})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["The results show that QOI is significantly faster than libpng and ",(0,i.jsx)(n.code,{children:"stb_image_write"}),", and it also achieves better compression ratios than libpng on average."]}),"\n",(0,i.jsx)(n.h3,{id:"advantages",children:"Advantages"}),"\n",(0,i.jsx)(n.p,{children:"Some of the key advantages of QOI include:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Super simple: ",(0,i.jsx)(n.a,{href:"https://qoiformat.org/qoi-specification.pdf",children:"the spec"})," is only one page"]}),"\n",(0,i.jsx)(n.li,{children:"Extremely fast encoding & decoding speeds"}),"\n",(0,i.jsx)(n.li,{children:"Data chunks are byte-aligned, so data can be streamed to a decoder one byte at a time"}),"\n",(0,i.jsx)(n.li,{children:"Better compression ratios compared to PNG for many types of images"}),"\n",(0,i.jsx)(n.li,{children:"Supports transparency"}),"\n",(0,i.jsx)(n.li,{children:"Royalty-free, open-source (CC0), & easy to integrate into any application"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Limited to 8 bits per channel (no support for higher bit depths)"}),"\n",(0,i.jsx)(n.li,{children:"Not suitable for images with high-frequency noise or very little spatial redundancy"}),"\n",(0,i.jsx)(n.li,{children:"Lacks advanced features like progressive loading, interlacing, or custom metadata"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Despite its limitations, QOI provides a compelling alternative to PNG for many use cases where simplicity, speed, and good compression ratios are desired. QOI is not especially well supported at present, but adoption is rapidly growing as developers can easily integrate support into their applications due to the format's simplicity."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>o});var i=s(6540);const t={},r=i.createContext(t);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12df3b9e.e4979bf4.js b/assets/js/12df3b9e.e4979bf4.js new file mode 100644 index 000000000..28d943244 --- /dev/null +++ b/assets/js/12df3b9e.e4979bf4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9993],{9627:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"images/QOI","title":"QOI","description":"QOI (Quite OK Image Format) is an image compression format that aims to provide a simple, fast, and efficient way to compress and decompress images losslessly. It was designed to be easy to implement while offering better compression ratios than the widely used but more complex PNG format while achieving much faster encoding & decoding speeds.","source":"@site/docs/images/QOI.mdx","sourceDirName":"images","slug":"/images/QOI","permalink":"/docs/images/QOI","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/QOI.mdx","tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"title":"QOI","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"JPEG XL","permalink":"/docs/images/JXL"},"next":{"title":"x264","permalink":"/docs/encoders/x264"}}');var t=s(4848),r=s(8453);const a={title:"QOI",sidebar_position:8},o="QOI",l={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Benchmarks",id:"benchmarks",level:3},{value:"Advantages",id:"advantages",level:3},{value:"Limitations",id:"limitations",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"qoi",children:"QOI"})}),"\n",(0,t.jsxs)(n.p,{children:["QOI (Quite OK Image Format) is an image compression format that aims to provide a simple, fast, and efficient way to compress and decompress images losslessly. It was designed to be easy to implement while offering better compression ratios than the widely used but more complex ",(0,t.jsx)(n.a,{href:"/docs/images/PNG",children:"PNG"})," format while achieving much faster encoding & decoding speeds."]}),"\n",(0,t.jsx)(n.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,t.jsxs)(n.p,{children:["Lossless? ",(0,t.jsx)(n.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(n.p,{children:["Lossy? ",(0,t.jsx)(n.em,{children:"No"})]}),"\n",(0,t.jsxs)(n.p,{children:["Supported Bit Depths:\n",(0,t.jsx)(n.em,{children:"8 BPC"})]}),"\n",(0,t.jsxs)(n.p,{children:["HDR/Wide Gamut? ",(0,t.jsx)(n.em,{children:"No"})]}),"\n",(0,t.jsxs)(n.p,{children:["Animation? ",(0,t.jsx)(n.em,{children:"No"})]}),"\n",(0,t.jsxs)(n.p,{children:["Transparency? ",(0,t.jsx)(n.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(n.p,{children:["Progressive Decode? ",(0,t.jsx)(n.em,{children:"No"})]}),"\n",(0,t.jsxs)(n.p,{children:["Royalty Free? ",(0,t.jsx)(n.em,{children:"Yes"})]}),"\n",(0,t.jsx)(n.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,t.jsx)(n.p,{children:"QOI compression is based on a simple and fast algorithm that exploits spatial redundancy in images. The algorithm uses a combination of run-length encoding (RLE), a small lookup table, delta encoding, and full-color pixel storage to achieve efficient compression. Depending on the algorithm's decision, a chunk (pixel) can take up one to five bytes."}),"\n",(0,t.jsx)(n.p,{children:"The QOI format supports images with 3 or 4 channels (RGB or RGBA) and 8 bits per channel. The format supports two colorspaces: Linear RGB & sRGB with linear alpha. These do not affect the way pixels are encoded."}),"\n",(0,t.jsx)(n.p,{children:"Here is a breakdown of the various chunk types in QOI:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"QOI_OP_RGB"})}),": Full RGB pixel value using 8 bits (1 byte) for each of the red, green, and blue channels. The alpha channel is 255 in RGB images, and always remains unchanged."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"QOI_OP_RGBA"})}),": Full RGBA pixel value using 8 bits for each of the red, green, blue, & alpha channels."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"QOI_OP_DIFF"})}),": The difference between the current pixel and the previous pixel for the red, green, and blue channels are stored using 2 bits for each channel. The differences are stored with a bias of 2 and wrap (so 1 minus 2 would be 255). The alpha channel remains unchanged."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"QOI_OP_LUMA"})}),": These pixels encode the green channel difference from the previous pixel using 6 bits, and then encode the red and blue channel differences relative to the green channel difference using 4 bits each. This allows for more efficient encoding of small color changes. The alpha channel remains unchanged."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"QOI_OP_RUN"})}),": These are the simplest, encoding a run-length of pixels that are identical to the previous pixel. The run length is stored using 6 bits with a bias of -1, allowing for runs of 1 to 62 pixels."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"QOI_OP_INDEX"})}),": These are stored by referencing a previously seen pixel value from a rolling array of 64 recent pixel values by using a simple hash on each pixel as it is identified. If another pixel matches a previously seen hash value in the array, the index of the referenced pixel is stored."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The QOI format also includes a simple 14-byte header that stores the image dimensions, color space, and channel depth information. The end of file is signaled by an 8-byte end marker."}),"\n",(0,t.jsx)(n.h3,{id:"benchmarks",children:"Benchmarks"}),"\n",(0,t.jsxs)(n.p,{children:["The creator of QOI benchmarked the format against libpng & ",(0,t.jsx)(n.code,{children:"stbi_image_write"})," using the C implementation in QOI via ",(0,t.jsx)(n.a,{href:"https://github.com/phoboslab/qoi/blob/master/qoibench.c",children:(0,t.jsx)(n.code,{children:"qoibench.c"})})," on a collection of 2,879 screenshots, icons, photos, & textures (",(0,t.jsx)(n.a,{href:"https://qoiformat.org/benchmark/qoi_benchmark_suite.tar",children:"source"}),"). The results are as follows:"]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Library"})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Decode (ms)"})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Encode (ms)"})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Decode MP/s"})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Encode MP/s"})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Size (kb)"})}),(0,t.jsx)(n.th,{style:{textAlign:"right"},children:(0,t.jsx)(n.strong,{children:"Compression Rate"})})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"libpng"})}),(0,t.jsx)(n.td,{children:"7.0"}),(0,t.jsx)(n.td,{children:"83.8"}),(0,t.jsx)(n.td,{children:"66.56"}),(0,t.jsx)(n.td,{children:"5.54"}),(0,t.jsx)(n.td,{children:"398"}),(0,t.jsx)(n.td,{style:{textAlign:"right"},children:"24.2%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"stbi"})}),(0,t.jsx)(n.td,{children:"7.0"}),(0,t.jsx)(n.td,{children:"60.5"}),(0,t.jsx)(n.td,{children:"66.63"}),(0,t.jsx)(n.td,{children:"7.67"}),(0,t.jsx)(n.td,{children:"561"}),(0,t.jsx)(n.td,{style:{textAlign:"right"},children:"34.2%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"qoi"})}),(0,t.jsx)(n.td,{children:"2.1"}),(0,t.jsx)(n.td,{children:"2.9"}),(0,t.jsx)(n.td,{children:"226.03"}),(0,t.jsx)(n.td,{children:"161.99"}),(0,t.jsx)(n.td,{children:"463"}),(0,t.jsx)(n.td,{style:{textAlign:"right"},children:"28.2%"})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["The results show that QOI is significantly faster than libpng and ",(0,t.jsx)(n.code,{children:"stb_image_write"}),", and it also achieves better compression ratios than libpng on average."]}),"\n",(0,t.jsx)(n.h3,{id:"advantages",children:"Advantages"}),"\n",(0,t.jsx)(n.p,{children:"Some of the key advantages of QOI include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Super simple: ",(0,t.jsx)(n.a,{href:"https://qoiformat.org/qoi-specification.pdf",children:"the spec"})," is only one page"]}),"\n",(0,t.jsx)(n.li,{children:"Extremely fast encoding & decoding speeds"}),"\n",(0,t.jsx)(n.li,{children:"Data chunks are byte-aligned, so data can be streamed to a decoder one byte at a time"}),"\n",(0,t.jsx)(n.li,{children:"Better compression ratios compared to PNG for many types of images"}),"\n",(0,t.jsx)(n.li,{children:"Supports transparency"}),"\n",(0,t.jsx)(n.li,{children:"Royalty-free, open-source (CC0), & easy to integrate into any application"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Limited to 8 bits per channel (no support for higher bit depths)"}),"\n",(0,t.jsx)(n.li,{children:"Not suitable for images with high-frequency noise or very little spatial redundancy"}),"\n",(0,t.jsx)(n.li,{children:"Lacks advanced features like progressive loading, interlacing, or custom metadata"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Despite its limitations, QOI provides a compelling alternative to PNG for many use cases where simplicity, speed, and good compression ratios are desired. QOI is not especially well supported at present, but adoption is rapidly growing as developers can easily integrate support into their applications due to the format's simplicity."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>o});var i=s(6540);const t={},r=i.createContext(t);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17896441.bdec4053.js b/assets/js/17896441.bf78c8e6.js similarity index 98% rename from assets/js/17896441.bdec4053.js rename to assets/js/17896441.bf78c8e6.js index c55fce9eb..0221eaf12 100644 --- a/assets/js/17896441.bdec4053.js +++ b/assets/js/17896441.bf78c8e6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8401],{2234:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(4084),i=n(7559),l=n(7293),o=n(4848);function r(e){let{className:t}=e;return(0,o.jsx)(l.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,s.A)(t,i.G.common.unlistedBanner),children:(0,o.jsx)(a.Uh,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.AE,{}),(0,o.jsx)(r,{...e})]})}},1689:(e,t,n)=>{n.d(t,{A:()=>d});n(6540);var s=n(4164),a=n(4084),i=n(7559),l=n(7293),o=n(4848);function r(e){let{className:t}=e;return(0,o.jsx)(l.A,{type:"caution",title:(0,o.jsx)(a.Yh,{}),className:(0,s.A)(t,i.G.common.draftBanner),children:(0,o.jsx)(a.TT,{})})}var c=n(2234);function d(e){let{metadata:t}=e;const{unlisted:n,frontMatter:s}=t;return(0,o.jsxs)(o.Fragment,{children:[(n||s.unlisted)&&(0,o.jsx)(c.A,{}),s.draft&&(0,o.jsx)(r,{})]})}},575:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ae});var s=n(6540),a=n(1213),i=n(9532),l=n(4848);const o=s.createContext(null);function r(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,l.jsx)(o.Provider,{value:a,children:t})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=c();return(0,l.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(4164),m=n(4581),h=n(1312),v=n(9022);function b(e){const{previous:t,next:n}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,l.jsx)(v.A,{...t,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,l.jsx)(v.A,{...n,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function x(){const{metadata:e}=c();return(0,l.jsx)(b,{previous:e.previous,next:e.next})}var g=n(4586),f=n(8774),p=n(8295),j=n(7559),A=n(3886),N=n(3025);const L={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function C(e){const t=L[e.versionMetadata.banner];return(0,l.jsx)(t,{...e})}function _(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(f.A,{to:n,onClick:s,children:(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function T(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,p.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,A.g1)(a),{latestDocSuggestion:o,latestVersionSuggestion:r}=(0,p.HW)(a),c=o??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,l.jsxs)("div",{className:(0,u.A)(t,j.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(C,{siteTitle:s,versionMetadata:n})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(_,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function k(e){let{className:t}=e;const n=(0,N.r)();return n.banner?(0,l.jsx)(T,{className:t,versionMetadata:n}):null}function H(e){let{className:t}=e;const n=(0,N.r)();return n.badge?(0,l.jsx)("span",{className:(0,u.A)(t,j.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}var M=n(2053),y=n(4336);function w(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,i=a.length>0,o=!!(t||n||s);return i||o?(0,l.jsxs)("footer",{className:(0,u.A)(j.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",j.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(M.A,{tags:a})})}),o&&(0,l.jsx)(y.A,{className:(0,u.A)("margin-top--sm",j.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var B=n(1422),I=n(5195);const E={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function V(e){let{collapsed:t,...n}=e;return(0,l.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",E.tocCollapsibleButton,!t&&E.tocCollapsibleButtonExpanded,n.className),children:(0,l.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const O={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function R(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:o}=(0,B.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(O.tocCollapsible,!i&&O.tocCollapsibleExpanded,n),children:[(0,l.jsx)(V,{collapsed:i,onClick:o}),(0,l.jsx)(B.N,{lazy:!0,className:O.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(I.A,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const G={tocMobile:"tocMobile_ITEo"};function S(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(R,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(j.G.docs.docTocMobile,G.tocMobile)})}var F=n(7763);function P(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(F.A,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:j.G.docs.docTocDesktop})}var U=n(1107),D=n(8509);function z(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(j.G.docs.docMarkdown,"markdown"),children:[n&&(0,l.jsx)("header",{children:(0,l.jsx)(U.A,{as:"h1",children:n})}),(0,l.jsx)(D.A,{children:t})]})}var W=n(6972),q=n(9169),Y=n(6025);function $(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const Q={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function X(){const e=(0,Y.Ay)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(f.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,l.jsx)($,{className:Q.breadcrumbHomeIcon})})})}const Z={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function J(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,l.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,l.jsx)(f.A,{className:a,href:n,itemProp:"item",children:(0,l.jsx)("span",{itemProp:"name",children:t})}):(0,l.jsx)("span",{className:a,children:t})}function K(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,l.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,l.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function ee(){const e=(0,W.OF)(),t=(0,q.Dt)();return e?(0,l.jsx)("nav",{className:(0,u.A)(j.G.docs.docBreadcrumbs,Z.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,l.jsx)(X,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,l.jsx)(K,{active:s,index:n,addMicrodata:!!a,children:(0,l.jsx)(J,{href:a,isLast:s,children:t.label})},n)}))]})}):null}var te=n(1689);const ne={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function se(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,l.jsx)(S,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,l.jsx)(P,{})}}(),{metadata:s}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&ne.docItemCol),children:[(0,l.jsx)(te.A,{metadata:s}),(0,l.jsx)(k,{}),(0,l.jsxs)("div",{className:ne.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(ee,{}),(0,l.jsx)(H,{}),n.mobile,(0,l.jsx)(z,{children:t}),(0,l.jsx)(w,{})]}),(0,l.jsx)(x,{})]})]}),n.desktop&&(0,l.jsx)("div",{className:"col col--3",children:n.desktop})]})}function ae(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(a.e3,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(se,{children:(0,l.jsx)(n,{})})]})})}},9022:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(4164),a=n(8774),i=n(4848);function l(e){const{permalink:t,title:n,subLabel:l,isNext:o}=e;return(0,i.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=n(4848);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,l.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",t),children:(0,l.jsx)(a.A,{...n,linkClassName:o,linkActiveClassName:r})})}},5195:(e,t,n)=>{n.d(t,{A:()=>b});var s=n(6540),a=n(6342);function i(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function o(e){const t=e.getBoundingClientRect();return t.top===t.bottom?o(e.parentNode):t}function r(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>o(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:l}),c=r(o,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}var u=n(8774),m=n(4848);function h(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const b=(0,a.p)(),x=c??b.tableOfContents.minHeadingLevel,g=u??b.tableOfContents.maxHeadingLevel,f=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>l({toc:i(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:x,maxHeadingLevel:g});return d((0,s.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:g}}),[o,r,x,g])),(0,m.jsx)(v,{toc:f,className:n,linkClassName:o,...h})}},6133:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(4164),a=n(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=n(4848);function o(e){let{permalink:t,label:n,count:o,description:r}=e;return(0,l.jsxs)(a.A,{href:t,title:r,className:(0,s.A)(i.tag,o?i.tagWithCount:i.tagRegular),children:[n,o&&(0,l.jsx)("span",{children:o})]})}},2053:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(4164),a=n(1312),i=n(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var o=n(4848);function r(e){let{tags:t}=e;return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("b",{children:(0,o.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,o.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,o.jsx)("li",{className:l.tag,children:(0,o.jsx)(i.A,{...e})},e.permalink)))})]})}},4084:(e,t,n)=>{n.d(t,{AE:()=>r,Rc:()=>l,TT:()=>d,Uh:()=>o,Yh:()=>c});n(6540);var s=n(1312),a=n(5260),i=n(4848);function l(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function r(){return(0,i.jsx)(a.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8401],{2234:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(4084),i=n(7559),l=n(7293),o=n(4848);function r(e){let{className:t}=e;return(0,o.jsx)(l.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,s.A)(t,i.G.common.unlistedBanner),children:(0,o.jsx)(a.Uh,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.AE,{}),(0,o.jsx)(r,{...e})]})}},6451:(e,t,n)=>{n.d(t,{A:()=>d});n(6540);var s=n(4164),a=n(4084),i=n(7559),l=n(7293),o=n(4848);function r(e){let{className:t}=e;return(0,o.jsx)(l.A,{type:"caution",title:(0,o.jsx)(a.Yh,{}),className:(0,s.A)(t,i.G.common.draftBanner),children:(0,o.jsx)(a.TT,{})})}var c=n(2234);function d(e){let{metadata:t}=e;const{unlisted:n,frontMatter:s}=t;return(0,o.jsxs)(o.Fragment,{children:[(n||s.unlisted)&&(0,o.jsx)(c.A,{}),s.draft&&(0,o.jsx)(r,{})]})}},575:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ae});var s=n(6540),a=n(1213),i=n(9532),l=n(4848);const o=s.createContext(null);function r(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,l.jsx)(o.Provider,{value:a,children:t})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=c();return(0,l.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(4164),m=n(4581),h=n(1312),v=n(9022);function b(e){const{previous:t,next:n}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,l.jsx)(v.A,{...t,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,l.jsx)(v.A,{...n,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function x(){const{metadata:e}=c();return(0,l.jsx)(b,{previous:e.previous,next:e.next})}var g=n(4586),f=n(8774),p=n(4070),j=n(7559),A=n(3886),N=n(3025);const L={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function C(e){const t=L[e.versionMetadata.banner];return(0,l.jsx)(t,{...e})}function _(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(f.A,{to:n,onClick:s,children:(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function T(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,p.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,A.g1)(a),{latestDocSuggestion:o,latestVersionSuggestion:r}=(0,p.HW)(a),c=o??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,l.jsxs)("div",{className:(0,u.A)(t,j.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(C,{siteTitle:s,versionMetadata:n})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(_,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function k(e){let{className:t}=e;const n=(0,N.r)();return n.banner?(0,l.jsx)(T,{className:t,versionMetadata:n}):null}function H(e){let{className:t}=e;const n=(0,N.r)();return n.badge?(0,l.jsx)("span",{className:(0,u.A)(t,j.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}var M=n(2053),y=n(4336);function w(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,i=a.length>0,o=!!(t||n||s);return i||o?(0,l.jsxs)("footer",{className:(0,u.A)(j.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",j.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(M.A,{tags:a})})}),o&&(0,l.jsx)(y.A,{className:(0,u.A)("margin-top--sm",j.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var B=n(1422),I=n(5195);const E={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function V(e){let{collapsed:t,...n}=e;return(0,l.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",E.tocCollapsibleButton,!t&&E.tocCollapsibleButtonExpanded,n.className),children:(0,l.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const O={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function R(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:o}=(0,B.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(O.tocCollapsible,!i&&O.tocCollapsibleExpanded,n),children:[(0,l.jsx)(V,{collapsed:i,onClick:o}),(0,l.jsx)(B.N,{lazy:!0,className:O.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(I.A,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const G={tocMobile:"tocMobile_ITEo"};function S(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(R,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(j.G.docs.docTocMobile,G.tocMobile)})}var F=n(7763);function P(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(F.A,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:j.G.docs.docTocDesktop})}var U=n(1107),D=n(8509);function z(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(j.G.docs.docMarkdown,"markdown"),children:[n&&(0,l.jsx)("header",{children:(0,l.jsx)(U.A,{as:"h1",children:n})}),(0,l.jsx)(D.A,{children:t})]})}var W=n(6972),q=n(9169),Y=n(6025);function $(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const Q={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function X(){const e=(0,Y.Ay)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(f.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,l.jsx)($,{className:Q.breadcrumbHomeIcon})})})}const Z={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function J(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,l.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,l.jsx)(f.A,{className:a,href:n,itemProp:"item",children:(0,l.jsx)("span",{itemProp:"name",children:t})}):(0,l.jsx)("span",{className:a,children:t})}function K(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,l.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,l.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function ee(){const e=(0,W.OF)(),t=(0,q.Dt)();return e?(0,l.jsx)("nav",{className:(0,u.A)(j.G.docs.docBreadcrumbs,Z.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,l.jsx)(X,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,l.jsx)(K,{active:s,index:n,addMicrodata:!!a,children:(0,l.jsx)(J,{href:a,isLast:s,children:t.label})},n)}))]})}):null}var te=n(6451);const ne={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function se(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,l.jsx)(S,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,l.jsx)(P,{})}}(),{metadata:s}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&ne.docItemCol),children:[(0,l.jsx)(te.A,{metadata:s}),(0,l.jsx)(k,{}),(0,l.jsxs)("div",{className:ne.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(ee,{}),(0,l.jsx)(H,{}),n.mobile,(0,l.jsx)(z,{children:t}),(0,l.jsx)(w,{})]}),(0,l.jsx)(x,{})]})]}),n.desktop&&(0,l.jsx)("div",{className:"col col--3",children:n.desktop})]})}function ae(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(a.e3,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(se,{children:(0,l.jsx)(n,{})})]})})}},9022:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(4164),a=n(8774),i=n(4848);function l(e){const{permalink:t,title:n,subLabel:l,isNext:o}=e;return(0,i.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=n(4848);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,l.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",t),children:(0,l.jsx)(a.A,{...n,linkClassName:o,linkActiveClassName:r})})}},5195:(e,t,n)=>{n.d(t,{A:()=>b});var s=n(6540),a=n(6342);function i(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function o(e){const t=e.getBoundingClientRect();return t.top===t.bottom?o(e.parentNode):t}function r(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>o(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:l}),c=r(o,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}var u=n(8774),m=n(4848);function h(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const b=(0,a.p)(),x=c??b.tableOfContents.minHeadingLevel,g=u??b.tableOfContents.maxHeadingLevel,f=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>l({toc:i(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:x,maxHeadingLevel:g});return d((0,s.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:g}}),[o,r,x,g])),(0,m.jsx)(v,{toc:f,className:n,linkClassName:o,...h})}},6133:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(4164),a=n(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=n(4848);function o(e){let{permalink:t,label:n,count:o,description:r}=e;return(0,l.jsxs)(a.A,{href:t,title:r,className:(0,s.A)(i.tag,o?i.tagWithCount:i.tagRegular),children:[n,o&&(0,l.jsx)("span",{children:o})]})}},2053:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(4164),a=n(1312),i=n(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var o=n(4848);function r(e){let{tags:t}=e;return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("b",{children:(0,o.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,o.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,o.jsx)("li",{className:l.tag,children:(0,o.jsx)(i.A,{...e})},e.permalink)))})]})}},4084:(e,t,n)=>{n.d(t,{AE:()=>r,Rc:()=>l,TT:()=>d,Uh:()=>o,Yh:()=>c});n(6540);var s=n(1312),a=n(5260),i=n(4848);function l(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function r(){return(0,i.jsx)(a.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/1817a557.1b2310b8.js b/assets/js/1817a557.1b2310b8.js new file mode 100644 index 000000000..0486721bd --- /dev/null +++ b/assets/js/1817a557.1b2310b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6738],{6442:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"introduction/lossless","title":"Lossless Compression","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/introduction/lossless.mdx","sourceDirName":"introduction","slug":"/introduction/lossless","permalink":"/docs/introduction/lossless","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/lossless.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Lossless Compression","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Terminology","permalink":"/docs/introduction/terminology"},"next":{"title":"Lossy Compression","permalink":"/docs/introduction/lossy"}}');var o=i(4848),t=i(8453);const r={title:"Lossless Compression",sidebar_position:3},l="Lossless Compression",c={},d=[{value:"Redundancy & Entropy",id:"redundancy--entropy",level:3},{value:"Techniques in Lossless Compression",id:"techniques-in-lossless-compression",level:3}];function a(e){const n={admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"lossless-compression",children:"Lossless Compression"})}),"\n",(0,o.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,o.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,o.jsx)(n.p,{children:"Lossless compression is a method of data compression that allows the original data to be perfectly reconstructed from the compressed data. This is particularly important in applications where perfectly preserving the original fidelity of a medium is critical, such as in archiving, generic data compression, & professional media editing. To understand how lossless compression works, we will first delve into the concepts of redundancy, entropy, and specific compression techniques oft used in lossless compression."}),"\n",(0,o.jsx)(n.h3,{id:"redundancy--entropy",children:"Redundancy & Entropy"}),"\n",(0,o.jsx)(n.p,{children:"The concepts of redundancy & entropy are important to understand as you continue reading."}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Redundancy"})," refers to the repetitive or predictable elements in data. These elements do not add new information and can be efficiently encoded to reduce the overall data size without losing any information."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Entropy"}),", in the context of information theory, is a measure of the unpredictability or randomness of data. Lower entropy implies higher redundancy, implying that the data is theoretically more compressible."]}),"\n",(0,o.jsx)(n.p,{children:"In lossless compression, the goal is to reduce redundancy and encode data as efficiently as possible based on its entropy."}),"\n",(0,o.jsx)(n.h3,{id:"techniques-in-lossless-compression",children:"Techniques in Lossless Compression"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Run-Length Encoding (RLE)"}),":\nRLE is a simple form of lossless compression where sequences of the same data value (runs) are stored as a single data value and a count. This technique is effective for compressing data with long runs of identical samples, such as silence or constant tones. For example, the sequence ",(0,o.jsx)(n.code,{children:"AAAAABBBCC"})," could be encoded as ",(0,o.jsx)(n.code,{children:"5A3B2C"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Huffman Coding"}),":\nHuffman coding is an entropy encoding algorithm used for lossless data compression that works by separating an input into component symbols and replacing each symbol with a code. The algorithm builds a binary tree, with each leaf node representing a symbol separated from the input data, and the path from the root to the leaf representing the binary code for that symbol."]}),"\n",(0,o.jsxs)(n.p,{children:["Huffman coding is effective when the probability distribution of the input characters is known and can be exploited. Imagine you are storing the state of a traffic light; it is either green, yellow, red, or off for maintenance. As the operator, you have determined that it is green 50% of the time, red 40% of the time, yellow 9% of the time, and disabled 1% of the time. Because there are four options, you can accurately represent all of the possible symbols in our example using two bits. Green could be ",(0,o.jsx)(n.code,{children:"00"}),", red ",(0,o.jsx)(n.code,{children:"01"}),", yellow ",(0,o.jsx)(n.code,{children:"10"}),", and off ",(0,o.jsx)(n.code,{children:"11"}),". While assigning two-bit codes accurately conveys the information, we're storing an average of two bits per symbol; we can reduce the average number of bits per symbol by taking the probabilities into account here. We'll assign green to ",(0,o.jsx)(n.code,{children:"0"})," since it appears the most frequently; this is the first leaf on our binary tree. Next, we have the leaves that stem from the ",(0,o.jsx)(n.code,{children:"1"})," code; red can simply be ",(0,o.jsx)(n.code,{children:"11"}),", while yellow can be ",(0,o.jsx)(n.code,{children:"100"})," and the disabled symbol can be represented by ",(0,o.jsx)(n.code,{children:"101"}),". This gives us the following Huffman codes:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Green (50%): ",(0,o.jsx)(n.code,{children:"0"})]}),"\n",(0,o.jsxs)(n.li,{children:["Red (40%): ",(0,o.jsx)(n.code,{children:"11"})]}),"\n",(0,o.jsxs)(n.li,{children:["Yellow ( 9%): ",(0,o.jsx)(n.code,{children:"100"})]}),"\n",(0,o.jsxs)(n.li,{children:["Disabled ( 1%): ",(0,o.jsx)(n.code,{children:"101"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Represented by the following tree:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/color-huffman-tree-svg.svg",alt:"Traffic light Huffman tree"})}),"\n",(0,o.jsxs)(n.p,{children:["Now, if we do the math by multiplying the probability by the length of each code and taking the weighted sum:\n(50% \u2022 1) + (40% \u2022 2) + (9% \u2022 3) + (1% \u2022 3) = ",(0,o.jsx)(n.strong,{children:"1.6"})]}),"\n",(0,o.jsxs)(n.p,{children:["We end up with an average of ",(0,o.jsx)(n.strong,{children:"1.6 bits per symbol"}),". Even in our relatively simple example, this shows how Huffman coding can save space quite effectively while still losslessly representing the same information."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Arithmetic Coding"}),"\nArithmetic coding is another entropy encoding technique that represents an entire message as a single number in the interval ",(0,o.jsx)(n.code,{children:"[0, 1)"}),". Unlike Huffman coding, which assigns fixed binary codes to component symbols separated from an input, arithmetic coding represents multiple symbols with a single floating-point number ",(0,o.jsx)(n.em,{children:"q"})," which must be within the range ",(0,o.jsx)(n.code,{children:"0.0 \u2264 q < 1.0"}),". Arithmetic coding is particularly effective when the probability distribution of the symbols is skewed, as it can produce a more compact representation than Huffman coding. It is usually slower than Huffman coding."]}),"\n",(0,o.jsxs)(n.p,{children:["Let's return to our traffic light example. Let's say you aren't satisfied with our previous Huffman coding result, which has produced an average of 1.6 bits per symbol, and you'd like to use arithmetic coding instead. In arithmetic coding, each of our symbols should first be placed on a range within the interval ",(0,o.jsx)(n.code,{children:"[0, 1)"})," based on its probability. Then, we can narrow down this range as we encode more symbols, eventually arriving at a single number that represents the entire sequence. The steps follow below."]}),"\n",(0,o.jsx)(n.p,{children:"Let's use the same probabilities from before:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Green (50%)"}),"\n",(0,o.jsx)(n.li,{children:"Red (40%)"}),"\n",(0,o.jsx)(n.li,{children:"Yellow ( 9%)"}),"\n",(0,o.jsx)(n.li,{children:"Disabled ( 1%)"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"We'll assign ranges to each symbol as follows:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Green: ",(0,o.jsx)(n.code,{children:"[0.00, 0.50)"})]}),"\n",(0,o.jsxs)(n.li,{children:["Red: ",(0,o.jsx)(n.code,{children:"[0.50, 0.90)"})]}),"\n",(0,o.jsxs)(n.li,{children:["Yellow: ",(0,o.jsx)(n.code,{children:"[0.90, 0.99)"})]}),"\n",(0,o.jsxs)(n.li,{children:["Disabled: ",(0,o.jsx)(n.code,{children:"[0.99, 1.00)"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:'Now, let\'s encode a sequence of traffic light states: "Green, Red, Yellow, Green"'}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start with the interval ",(0,o.jsx)(n.code,{children:"[0, 1)"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"First symbol (Green):"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_low = low + (high - low) \u2022 cumulative(s) / total"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_high = low + (high - low) \u2022 (cumulative(s) + prob(s)) / total"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_low = 0 + (0.5 - 0) \u2022 0 / 1.0"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_high = 0 + (0.5 - 0) \u2022 (0 + 0.5) / 1.0"})}),"\n",(0,o.jsxs)(n.li,{children:["Narrow range to ",(0,o.jsx)(n.code,{children:"[0.00, 0.50)"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Second symbol (Red):"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["From previous range: ",(0,o.jsx)(n.code,{children:"[0.00, 0.50)"})]}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_low = 0 + (0.50 - 0) * 0.50 / 1"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_high = 0 + (0.50 - 0) * (0.50 + 0.40) / 1"})}),"\n",(0,o.jsxs)(n.li,{children:["Red is in the range ",(0,o.jsx)(n.code,{children:"[0.25, 0.45)"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Third symbol (Yellow):"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["From previous range: ",(0,o.jsx)(n.code,{children:"[0.25, 0.45)"})]}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_low = 0.25 + (0.45 - 0.25) * (0.50 + 0.40) / 1"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_high = 0.25 + (0.45 - 0.25) * (0.50 + 0.40 + 0.09) / 1"})}),"\n",(0,o.jsxs)(n.li,{children:["Yellow is in the range ",(0,o.jsx)(n.code,{children:"[0.43, 0.448)"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Fourth symbol (Disabled):"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["From previous range: ",(0,o.jsx)(n.code,{children:"[0.43, 0.448)"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_low = 0.43 + (0.448 - 0.43) * (0.50 + 0.40 + 0.09) / 1"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"new_low = 0.43 + (0.448 - 0.43) * (0.50 + 0.40 + 0.09 + 0.01) / 1"})}),"\n",(0,o.jsxs)(n.li,{children:["Green is in the range ",(0,o.jsx)(n.code,{children:"[0.44782, 0.448)"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The final interval is ",(0,o.jsx)(n.code,{children:"[0.44782, 0.448)"}),'. Any number in this range (we\'ll pick the lower bound, which is inclusive of 0.44782) can represent our entire sequence "Green, Red, Yellow, Disabled".']}),"\n",(0,o.jsx)(n.p,{children:"To decode, we would start with 0.44782 and use our original probability ranges to determine which symbol it corresponds to, then update the value and repeat the process."}),"\n",(0,o.jsxs)(n.p,{children:["In this example, we aren't saving any space by using arithmetic coding because our sample is too short to have any pattern to effectively exploit. With longer sequences, arithmetic coding approaches the theoretical entropy limit of ",(0,o.jsx)(n.strong,{children:"1.408 bits per symbol"}),": ",(0,o.jsx)(n.code,{children:"-(0.50 * log2(0.50) + 0.40 * log2(0.40) + 0.09 * log2(0.09) + 0.01 * log2(0.01)) \u2248 1.408"})]}),"\n",(0,o.jsx)(n.p,{children:"It is important to note that in practice, there often are additional considerations not present in this simplified example with regard to managing precision."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Prediction and Residual Encoding"}),":\nPrediction involves using previous data to predict future data. The difference between the predicted and actual data (residual) is encoded instead of the actual data. Linear Predictive Coding (LPC) is a common method where a linear function of previous samples is used to predict the current sample. The residuals typically have lower entropy and can be encoded more efficiently."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var s=i(6540);const o={},t=s.createContext(o);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1817a557.3a6bc166.js b/assets/js/1817a557.3a6bc166.js deleted file mode 100644 index 949507ada..000000000 --- a/assets/js/1817a557.3a6bc166.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6738],{6118:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>d});var s=i(4848),o=i(8453);const t={title:"Lossless Compression",sidebar_position:3},r="Lossless Compression",l={id:"introduction/lossless",title:"Lossless Compression",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/introduction/lossless.mdx",sourceDirName:"introduction",slug:"/introduction/lossless",permalink:"/docs/introduction/lossless",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/lossless.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Lossless Compression",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Terminology",permalink:"/docs/introduction/terminology"},next:{title:"Lossy Compression",permalink:"/docs/introduction/lossy"}},c={},d=[{value:"Redundancy & Entropy",id:"redundancy--entropy",level:3},{value:"Techniques in Lossless Compression",id:"techniques-in-lossless-compression",level:3}];function a(e){const n={admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"lossless-compression",children:"Lossless Compression"})}),"\n",(0,s.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsx)(n.p,{children:"Lossless compression is a method of data compression that allows the original data to be perfectly reconstructed from the compressed data. This is particularly important in applications where perfectly preserving the original fidelity of a medium is critical, such as in archiving, generic data compression, & professional media editing. To understand how lossless compression works, we will first delve into the concepts of redundancy, entropy, and specific compression techniques oft used in lossless compression."}),"\n",(0,s.jsx)(n.h3,{id:"redundancy--entropy",children:"Redundancy & Entropy"}),"\n",(0,s.jsx)(n.p,{children:"The concepts of redundancy & entropy are important to understand as you continue reading."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Redundancy"})," refers to the repetitive or predictable elements in data. These elements do not add new information and can be efficiently encoded to reduce the overall data size without losing any information."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Entropy"}),", in the context of information theory, is a measure of the unpredictability or randomness of data. Lower entropy implies higher redundancy, implying that the data is theoretically more compressible."]}),"\n",(0,s.jsx)(n.p,{children:"In lossless compression, the goal is to reduce redundancy and encode data as efficiently as possible based on its entropy."}),"\n",(0,s.jsx)(n.h3,{id:"techniques-in-lossless-compression",children:"Techniques in Lossless Compression"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Run-Length Encoding (RLE)"}),":\nRLE is a simple form of lossless compression where sequences of the same data value (runs) are stored as a single data value and a count. This technique is effective for compressing data with long runs of identical samples, such as silence or constant tones. For example, the sequence ",(0,s.jsx)(n.code,{children:"AAAAABBBCC"})," could be encoded as ",(0,s.jsx)(n.code,{children:"5A3B2C"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Huffman Coding"}),":\nHuffman coding is an entropy encoding algorithm used for lossless data compression that works by separating an input into component symbols and replacing each symbol with a code. The algorithm builds a binary tree, with each leaf node representing a symbol separated from the input data, and the path from the root to the leaf representing the binary code for that symbol."]}),"\n",(0,s.jsxs)(n.p,{children:["Huffman coding is effective when the probability distribution of the input characters is known and can be exploited. Imagine you are storing the state of a traffic light; it is either green, yellow, red, or off for maintenance. As the operator, you have determined that it is green 50% of the time, red 40% of the time, yellow 9% of the time, and disabled 1% of the time. Because there are four options, you can accurately represent all of the possible symbols in our example using two bits. Green could be ",(0,s.jsx)(n.code,{children:"00"}),", red ",(0,s.jsx)(n.code,{children:"01"}),", yellow ",(0,s.jsx)(n.code,{children:"10"}),", and off ",(0,s.jsx)(n.code,{children:"11"}),". While assigning two-bit codes accurately conveys the information, we're storing an average of two bits per symbol; we can reduce the average number of bits per symbol by taking the probabilities into account here. We'll assign green to ",(0,s.jsx)(n.code,{children:"0"})," since it appears the most frequently; this is the first leaf on our binary tree. Next, we have the leaves that stem from the ",(0,s.jsx)(n.code,{children:"1"})," code; red can simply be ",(0,s.jsx)(n.code,{children:"11"}),", while yellow can be ",(0,s.jsx)(n.code,{children:"100"})," and the disabled symbol can be represented by ",(0,s.jsx)(n.code,{children:"101"}),". This gives us the following Huffman codes:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Green (50%): ",(0,s.jsx)(n.code,{children:"0"})]}),"\n",(0,s.jsxs)(n.li,{children:["Red (40%): ",(0,s.jsx)(n.code,{children:"11"})]}),"\n",(0,s.jsxs)(n.li,{children:["Yellow ( 9%): ",(0,s.jsx)(n.code,{children:"100"})]}),"\n",(0,s.jsxs)(n.li,{children:["Disabled ( 1%): ",(0,s.jsx)(n.code,{children:"101"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Represented by the following tree:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/color-huffman-tree-svg.svg",alt:"Traffic light Huffman tree"})}),"\n",(0,s.jsxs)(n.p,{children:["Now, if we do the math by multiplying the probability by the length of each code and taking the weighted sum:\n(50% \u2022 1) + (40% \u2022 2) + (9% \u2022 3) + (1% \u2022 3) = ",(0,s.jsx)(n.strong,{children:"1.6"})]}),"\n",(0,s.jsxs)(n.p,{children:["We end up with an average of ",(0,s.jsx)(n.strong,{children:"1.6 bits per symbol"}),". Even in our relatively simple example, this shows how Huffman coding can save space quite effectively while still losslessly representing the same information."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Arithmetic Coding"}),"\nArithmetic coding is another entropy encoding technique that represents an entire message as a single number in the interval ",(0,s.jsx)(n.code,{children:"[0, 1)"}),". Unlike Huffman coding, which assigns fixed binary codes to component symbols separated from an input, arithmetic coding represents multiple symbols with a single floating-point number ",(0,s.jsx)(n.em,{children:"q"})," which must be within the range ",(0,s.jsx)(n.code,{children:"0.0 \u2264 q < 1.0"}),". Arithmetic coding is particularly effective when the probability distribution of the symbols is skewed, as it can produce a more compact representation than Huffman coding. It is usually slower than Huffman coding."]}),"\n",(0,s.jsxs)(n.p,{children:["Let's return to our traffic light example. Let's say you aren't satisfied with our previous Huffman coding result, which has produced an average of 1.6 bits per symbol, and you'd like to use arithmetic coding instead. In arithmetic coding, each of our symbols should first be placed on a range within the interval ",(0,s.jsx)(n.code,{children:"[0, 1)"})," based on its probability. Then, we can narrow down this range as we encode more symbols, eventually arriving at a single number that represents the entire sequence. The steps follow below."]}),"\n",(0,s.jsx)(n.p,{children:"Let's use the same probabilities from before:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Green (50%)"}),"\n",(0,s.jsx)(n.li,{children:"Red (40%)"}),"\n",(0,s.jsx)(n.li,{children:"Yellow ( 9%)"}),"\n",(0,s.jsx)(n.li,{children:"Disabled ( 1%)"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"We'll assign ranges to each symbol as follows:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Green: ",(0,s.jsx)(n.code,{children:"[0.00, 0.50)"})]}),"\n",(0,s.jsxs)(n.li,{children:["Red: ",(0,s.jsx)(n.code,{children:"[0.50, 0.90)"})]}),"\n",(0,s.jsxs)(n.li,{children:["Yellow: ",(0,s.jsx)(n.code,{children:"[0.90, 0.99)"})]}),"\n",(0,s.jsxs)(n.li,{children:["Disabled: ",(0,s.jsx)(n.code,{children:"[0.99, 1.00)"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'Now, let\'s encode a sequence of traffic light states: "Green, Red, Yellow, Green"'}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Start with the interval ",(0,s.jsx)(n.code,{children:"[0, 1)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"First symbol (Green):"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_low = low + (high - low) \u2022 cumulative(s) / total"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_high = low + (high - low) \u2022 (cumulative(s) + prob(s)) / total"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_low = 0 + (0.5 - 0) \u2022 0 / 1.0"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_high = 0 + (0.5 - 0) \u2022 (0 + 0.5) / 1.0"})}),"\n",(0,s.jsxs)(n.li,{children:["Narrow range to ",(0,s.jsx)(n.code,{children:"[0.00, 0.50)"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Second symbol (Red):"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["From previous range: ",(0,s.jsx)(n.code,{children:"[0.00, 0.50)"})]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_low = 0 + (0.50 - 0) * 0.50 / 1"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_high = 0 + (0.50 - 0) * (0.50 + 0.40) / 1"})}),"\n",(0,s.jsxs)(n.li,{children:["Red is in the range ",(0,s.jsx)(n.code,{children:"[0.25, 0.45)"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Third symbol (Yellow):"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["From previous range: ",(0,s.jsx)(n.code,{children:"[0.25, 0.45)"})]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_low = 0.25 + (0.45 - 0.25) * (0.50 + 0.40) / 1"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_high = 0.25 + (0.45 - 0.25) * (0.50 + 0.40 + 0.09) / 1"})}),"\n",(0,s.jsxs)(n.li,{children:["Yellow is in the range ",(0,s.jsx)(n.code,{children:"[0.43, 0.448)"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Fourth symbol (Disabled):"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["From previous range: ",(0,s.jsx)(n.code,{children:"[0.43, 0.448)"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_low = 0.43 + (0.448 - 0.43) * (0.50 + 0.40 + 0.09) / 1"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"new_low = 0.43 + (0.448 - 0.43) * (0.50 + 0.40 + 0.09 + 0.01) / 1"})}),"\n",(0,s.jsxs)(n.li,{children:["Green is in the range ",(0,s.jsx)(n.code,{children:"[0.44782, 0.448)"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The final interval is ",(0,s.jsx)(n.code,{children:"[0.44782, 0.448)"}),'. Any number in this range (we\'ll pick the lower bound, which is inclusive of 0.44782) can represent our entire sequence "Green, Red, Yellow, Disabled".']}),"\n",(0,s.jsx)(n.p,{children:"To decode, we would start with 0.44782 and use our original probability ranges to determine which symbol it corresponds to, then update the value and repeat the process."}),"\n",(0,s.jsxs)(n.p,{children:["In this example, we aren't saving any space by using arithmetic coding because our sample is too short to have any pattern to effectively exploit. With longer sequences, arithmetic coding approaches the theoretical entropy limit of ",(0,s.jsx)(n.strong,{children:"1.408 bits per symbol"}),": ",(0,s.jsx)(n.code,{children:"-(0.50 * log2(0.50) + 0.40 * log2(0.40) + 0.09 * log2(0.09) + 0.01 * log2(0.01)) \u2248 1.408"})]}),"\n",(0,s.jsx)(n.p,{children:"It is important to note that in practice, there often are additional considerations not present in this simplified example with regard to managing precision."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Prediction and Residual Encoding"}),":\nPrediction involves using previous data to predict future data. The difference between the predicted and actual data (residual) is encoded instead of the actual data. Linear Predictive Coding (LPC) is a common method where a linear function of previous samples is used to predict the current sample. The residuals typically have lower entropy and can be encoded more efficiently."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var s=i(6540);const o={},t=s.createContext(o);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.cda3983d.js b/assets/js/1a4e3797.cda3983d.js deleted file mode 100644 index 8fa04dd93..000000000 --- a/assets/js/1a4e3797.cda3983d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2138],{5846:(e,t,r)=>{r.d(t,{W:()=>u});var s=r(6540),a=r(4586);const n=["zero","one","two","few","many","other"];function c(e){return n.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:c(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,a.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:c(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function u(){const e=o();return{selectMessage:(t,r)=>function(e,t,r){const s=e.split("|");if(1===s.length)return s[0];s.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const a=r.select(t),n=r.pluralForms.indexOf(a);return s[Math.min(n,s.length-1)]}(r,t,e)}}},1283:(e,t,r)=>{r.r(t),r.d(t,{default:()=>P});var s=r(6540),a=r(4586),n=r(263),c=r(5260),l=r(8774),o=r(1312),u=r(5846),h=r(5391),i=r(6347),m=r(2303),d=r(1088);const p=function(){const e=(0,m.A)(),t=(0,i.W6)(),r=(0,i.zy)(),{siteConfig:{baseUrl:s}}=(0,a.A)(),n=e?new URLSearchParams(r.search):null,c=n?.get("q")||"",l=n?.get("ctx")||"",o=n?.get("version")||"",u=e=>{const t=new URLSearchParams(r.search);return e?t.set("q",e):t.delete("q"),t};return{searchValue:c,searchContext:l&&Array.isArray(d.Hg)&&d.Hg.some((e=>"string"==typeof e?e===l:e.path===l))?l:"",searchVersion:o,updateSearchPath:e=>{const r=u(e);t.replace({search:r.toString()})},updateSearchContext:e=>{const s=new URLSearchParams(r.search);s.set("ctx",e),t.replace({search:s.toString()})},generateSearchPageLink:e=>{const t=u(e);return`${s}search?${t.toString()}`}}};var g=r(5891),x=r(2384),f=r(6841),y=r(3810),C=r(7674),S=r(2849),j=r(4471);const w={searchContextInput:"searchContextInput_mXoe",searchQueryInput:"searchQueryInput_CFBF",searchResultItem:"searchResultItem_U687",searchResultItemPath:"searchResultItemPath_uIbk",searchResultItemSummary:"searchResultItemSummary_oZHr",searchQueryColumn:"searchQueryColumn_q7nx",searchContextColumn:"searchContextColumn_oWAF"};var A=r(3385),I=r(4848);function v(){const{siteConfig:{baseUrl:e},i18n:{currentLocale:t}}=(0,a.A)(),{selectMessage:r}=(0,u.W)(),{searchValue:n,searchContext:l,searchVersion:i,updateSearchPath:m,updateSearchContext:f}=p(),[y,C]=(0,s.useState)(n),[j,v]=(0,s.useState)(),[P,_]=(0,s.useState)(),b=`${e}${i}`,F=(0,s.useMemo)((()=>y?(0,o.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:y}):(0,o.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})),[y]);(0,s.useEffect)((()=>{m(y),j&&(y?j(y,(e=>{_(e)})):_(void 0))}),[y,j]);const T=(0,s.useCallback)((e=>{C(e.target.value)}),[]);return(0,s.useEffect)((()=>{n&&n!==y&&C(n)}),[n]),(0,s.useEffect)((()=>{!async function(){const{wrappedIndexes:e,zhDictionary:t}=!Array.isArray(d.Hg)||l||d.dz?await(0,g.Z)(b,l):{wrappedIndexes:[],zhDictionary:[]};v((()=>(0,x.m)(e,t,100)))}()}),[l,b]),(0,I.jsxs)(s.Fragment,{children:[(0,I.jsxs)(c.A,{children:[(0,I.jsx)("meta",{property:"robots",content:"noindex, follow"}),(0,I.jsx)("title",{children:F})]}),(0,I.jsxs)("div",{className:"container margin-vert--lg",children:[(0,I.jsx)("h1",{children:F}),(0,I.jsxs)("div",{className:"row",children:[(0,I.jsx)("div",{className:(0,h.A)("col",{[w.searchQueryColumn]:Array.isArray(d.Hg),"col--9":Array.isArray(d.Hg),"col--12":!Array.isArray(d.Hg)}),children:(0,I.jsx)("input",{type:"search",name:"q",className:w.searchQueryInput,"aria-label":"Search",onChange:T,value:y,autoComplete:"off",autoFocus:!0})}),Array.isArray(d.Hg)?(0,I.jsx)("div",{className:(0,h.A)("col","col--3","padding-left--none",w.searchContextColumn),children:(0,I.jsxs)("select",{name:"search-context",className:w.searchContextInput,id:"context-selector",value:l,onChange:e=>f(e.target.value),children:[d.dz&&(0,I.jsx)("option",{value:"",children:(0,o.T)({id:"theme.SearchPage.searchContext.everywhere",message:"everywhere"})}),d.Hg.map((e=>{const{label:r,path:s}=(0,A.p)(e,t);return(0,I.jsx)("option",{value:s,children:r},s)}))]})}):null]}),!j&&y&&(0,I.jsx)("div",{children:(0,I.jsx)(S.A,{})}),P&&(P.length>0?(0,I.jsx)("p",{children:r(P.length,(0,o.T)({id:"theme.SearchPage.documentsFound.plurals",message:"1 document found|{count} documents found",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)'},{count:P.length}))}):(0,I.jsx)("p",{children:(0,o.T)({id:"theme.SearchPage.noResultsText",message:"No documents were found",description:"The paragraph for empty search result"})})),(0,I.jsx)("section",{children:P&&P.map((e=>(0,I.jsx)(R,{searchResult:e},e.document.i)))})]})]})}function R(e){let{searchResult:{document:t,type:r,page:s,tokens:a,metadata:n}}=e;const c=0===r,o=2===r,u=(c?t.b:s.b).slice(),h=o?t.s:t.t;c||u.push(s.t);let i="";if(d.CU&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append("_highlight",t);i=`?${e.toString()}`}return(0,I.jsxs)("article",{className:w.searchResultItem,children:[(0,I.jsx)("h2",{children:(0,I.jsx)(l.A,{to:t.u+i+(t.h||""),dangerouslySetInnerHTML:{__html:o?(0,f.Z)(h,a):(0,y.C)(h,(0,C.g)(n,"t"),a,100)}})}),u.length>0&&(0,I.jsx)("p",{className:w.searchResultItemPath,children:(0,j.$)(u)}),o&&(0,I.jsx)("p",{className:w.searchResultItemSummary,dangerouslySetInnerHTML:{__html:(0,y.C)(t.t,(0,C.g)(n,"t"),a,100)}})]})}const P=function(){return(0,I.jsx)(n.A,{children:(0,I.jsx)(v,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.d404ecd5.js b/assets/js/1a4e3797.d404ecd5.js new file mode 100644 index 000000000..01a0d5373 --- /dev/null +++ b/assets/js/1a4e3797.d404ecd5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2138],{5846:(e,t,r)=>{r.d(t,{W:()=>u});var s=r(6540),a=r(4586);const n=["zero","one","two","few","many","other"];function c(e){return n.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:c(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,a.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:c(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function u(){const e=o();return{selectMessage:(t,r)=>function(e,t,r){const s=e.split("|");if(1===s.length)return s[0];s.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const a=r.select(t),n=r.pluralForms.indexOf(a);return s[Math.min(n,s.length-1)]}(r,t,e)}}},1283:(e,t,r)=>{r.r(t),r.d(t,{default:()=>P});var s=r(6540),a=r(4586),n=r(7823),c=r(5260),l=r(8774),o=r(1312),u=r(5846),h=r(5391),i=r(6347),m=r(2303),d=r(1088);const p=function(){const e=(0,m.A)(),t=(0,i.W6)(),r=(0,i.zy)(),{siteConfig:{baseUrl:s}}=(0,a.A)(),n=e?new URLSearchParams(r.search):null,c=n?.get("q")||"",l=n?.get("ctx")||"",o=n?.get("version")||"",u=e=>{const t=new URLSearchParams(r.search);return e?t.set("q",e):t.delete("q"),t};return{searchValue:c,searchContext:l&&Array.isArray(d.Hg)&&d.Hg.some((e=>"string"==typeof e?e===l:e.path===l))?l:"",searchVersion:o,updateSearchPath:e=>{const r=u(e);t.replace({search:r.toString()})},updateSearchContext:e=>{const s=new URLSearchParams(r.search);s.set("ctx",e),t.replace({search:s.toString()})},generateSearchPageLink:e=>{const t=u(e);return`${s}search?${t.toString()}`}}};var g=r(5891),x=r(2384),f=r(6841),y=r(3810),C=r(7674),S=r(2849),j=r(4471);const w={searchContextInput:"searchContextInput_mXoe",searchQueryInput:"searchQueryInput_CFBF",searchResultItem:"searchResultItem_U687",searchResultItemPath:"searchResultItemPath_uIbk",searchResultItemSummary:"searchResultItemSummary_oZHr",searchQueryColumn:"searchQueryColumn_q7nx",searchContextColumn:"searchContextColumn_oWAF"};var A=r(3385),I=r(4848);function v(){const{siteConfig:{baseUrl:e},i18n:{currentLocale:t}}=(0,a.A)(),{selectMessage:r}=(0,u.W)(),{searchValue:n,searchContext:l,searchVersion:i,updateSearchPath:m,updateSearchContext:f}=p(),[y,C]=(0,s.useState)(n),[j,v]=(0,s.useState)(),[P,_]=(0,s.useState)(),b=`${e}${i}`,F=(0,s.useMemo)((()=>y?(0,o.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:y}):(0,o.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})),[y]);(0,s.useEffect)((()=>{m(y),j&&(y?j(y,(e=>{_(e)})):_(void 0))}),[y,j]);const T=(0,s.useCallback)((e=>{C(e.target.value)}),[]);return(0,s.useEffect)((()=>{n&&n!==y&&C(n)}),[n]),(0,s.useEffect)((()=>{!async function(){const{wrappedIndexes:e,zhDictionary:t}=!Array.isArray(d.Hg)||l||d.dz?await(0,g.Z)(b,l):{wrappedIndexes:[],zhDictionary:[]};v((()=>(0,x.m)(e,t,100)))}()}),[l,b]),(0,I.jsxs)(s.Fragment,{children:[(0,I.jsxs)(c.A,{children:[(0,I.jsx)("meta",{property:"robots",content:"noindex, follow"}),(0,I.jsx)("title",{children:F})]}),(0,I.jsxs)("div",{className:"container margin-vert--lg",children:[(0,I.jsx)("h1",{children:F}),(0,I.jsxs)("div",{className:"row",children:[(0,I.jsx)("div",{className:(0,h.A)("col",{[w.searchQueryColumn]:Array.isArray(d.Hg),"col--9":Array.isArray(d.Hg),"col--12":!Array.isArray(d.Hg)}),children:(0,I.jsx)("input",{type:"search",name:"q",className:w.searchQueryInput,"aria-label":"Search",onChange:T,value:y,autoComplete:"off",autoFocus:!0})}),Array.isArray(d.Hg)?(0,I.jsx)("div",{className:(0,h.A)("col","col--3","padding-left--none",w.searchContextColumn),children:(0,I.jsxs)("select",{name:"search-context",className:w.searchContextInput,id:"context-selector",value:l,onChange:e=>f(e.target.value),children:[d.dz&&(0,I.jsx)("option",{value:"",children:(0,o.T)({id:"theme.SearchPage.searchContext.everywhere",message:"everywhere"})}),d.Hg.map((e=>{const{label:r,path:s}=(0,A.p)(e,t);return(0,I.jsx)("option",{value:s,children:r},s)}))]})}):null]}),!j&&y&&(0,I.jsx)("div",{children:(0,I.jsx)(S.A,{})}),P&&(P.length>0?(0,I.jsx)("p",{children:r(P.length,(0,o.T)({id:"theme.SearchPage.documentsFound.plurals",message:"1 document found|{count} documents found",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)'},{count:P.length}))}):(0,I.jsx)("p",{children:(0,o.T)({id:"theme.SearchPage.noResultsText",message:"No documents were found",description:"The paragraph for empty search result"})})),(0,I.jsx)("section",{children:P&&P.map((e=>(0,I.jsx)(R,{searchResult:e},e.document.i)))})]})]})}function R(e){let{searchResult:{document:t,type:r,page:s,tokens:a,metadata:n}}=e;const c=0===r,o=2===r,u=(c?t.b:s.b).slice(),h=o?t.s:t.t;c||u.push(s.t);let i="";if(d.CU&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append("_highlight",t);i=`?${e.toString()}`}return(0,I.jsxs)("article",{className:w.searchResultItem,children:[(0,I.jsx)("h2",{children:(0,I.jsx)(l.A,{to:t.u+i+(t.h||""),dangerouslySetInnerHTML:{__html:o?(0,f.Z)(h,a):(0,y.C)(h,(0,C.g)(n,"t"),a,100)}})}),u.length>0&&(0,I.jsx)("p",{className:w.searchResultItemPath,children:(0,j.$)(u)}),o&&(0,I.jsx)("p",{className:w.searchResultItemSummary,dangerouslySetInnerHTML:{__html:(0,y.C)(t.t,(0,C.g)(n,"t"),a,100)}})]})}const P=function(){return(0,I.jsx)(n.A,{children:(0,I.jsx)(v,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1b67d0f3.0ca1c00b.js b/assets/js/1b67d0f3.0ca1c00b.js deleted file mode 100644 index 845d7ac58..000000000 --- a/assets/js/1b67d0f3.0ca1c00b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[842],{4476:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=s(4848),n=s(8453);const o={title:"gzip",sidebar_position:2},r="gzip",a={id:"data/gzip",title:"gzip",description:"Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with tar to create .tar.gz archives. Formats like ZIP & PNG also use Deflate to different effects.",source:"@site/docs/data/gzip.mdx",sourceDirName:"data",slug:"/data/gzip",permalink:"/docs/data/gzip",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/gzip.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"gzip",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"ZIP",permalink:"/docs/data/zip"},next:{title:"bzip2",permalink:"/docs/data/bzip2"}},c={},d=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"History",id:"history",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Linux & macOS",id:"linux--macos",level:3},{value:"Windows",id:"windows",level:3}];function l(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"gzip",children:"gzip"})}),"\n",(0,t.jsxs)(i.p,{children:["Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with ",(0,t.jsx)(i.code,{children:"tar"})," to create ",(0,t.jsx)(i.code,{children:".tar.gz"})," archives. Formats like ",(0,t.jsx)(i.a,{href:"/docs/data/zip",children:"ZIP"})," & ",(0,t.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"})," also use Deflate to different effects."]}),"\n",(0,t.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,t.jsx)(i.p,{children:"While ZIP is a multi-file format that can compress multiple files into a single compressed file, Gzip is a single-file format that compresses a single file into a single compressed file. Both use DEFLATE for compression. ZIP supports encryption, while Gzip does not. ZIP also stores more extensive header information."}),"\n",(0,t.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,t.jsx)(i.p,{children:"In order to properly understand the gzip format, we must first talk about ZIP. A lot of similar or identical information is covered in our ZIP entry."}),"\n",(0,t.jsx)(i.p,{children:"The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation PKZIP was shareware."}),"\n",(0,t.jsxs)(i.p,{children:["A ",(0,t.jsx)(i.a,{href:"http://www.digitalpreservation.gov/formats/fdd/fdd000361.shtml",children:"restricted ZIP format"})," exists and is used in other filetypes such as Java .jar archives, a slew of Microsoft Office file formats, Office Document Format files (.odt, .ods, .odp), and EPUB files for e-readers."]}),"\n",(0,t.jsxs)(i.p,{children:['In around 1990, Info-ZIP came onto the scene. "Info-ZIP\'s purpose is to provide free, portable, high-quality versions of the Zip and UnZip compressor-archiver utilities that are compatible with the DOS-based PKZIP by PKWARE, Inc." (',(0,t.jsx)(i.a,{href:"https://infozip.sourceforge.net/",children:"https://infozip.sourceforge.net/"}),"). They did this successfully, leading to increased adoption of the ZIP format."]}),"\n",(0,t.jsxs)(i.p,{children:["In the early 1990s the ",(0,t.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix ",(0,t.jsx)(i.code,{children:"compress"})," utility, which used the (at the time) patented LZW compression algorithm which threatened its free use. Though some specific implementations of Deflate were patented by Phil Katz, the format was not, so a Deflate implementation that did not infringe on any patents was written."]}),"\n",(0,t.jsxs)(i.p,{children:["As a ",(0,t.jsx)(i.code,{children:"compress"})," replacement, the Unix gzip utility can decompress data that was compressed using ",(0,t.jsx)(i.code,{children:"compress"}),". Gzip compresses quite a bit better than Unix compress due to its use of DEFLATE, and it has very fast decompression. It also adds a CRC-32 checksum as an integrity check for the archived data. The header format permits the storage of more information than the compress format allowed, such as the original file name & the file modification time."]}),"\n",(0,t.jsxs)(i.p,{children:["The popular ",(0,t.jsx)(i.code,{children:"tar"})," utility, which creates an archive of files, has an option to compress directly to the ",(0,t.jsx)(i.code,{children:".tar.gz"})," format and is a very popular use caze for gzip. Since the compression of a ",(0,t.jsx)(i.code,{children:".tar"})," can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. ",(0,t.jsx)(i.code,{children:".tar.gz"})," is the most common archive format in use on Unix due to its very high portability, but there are better compression methods available. Some of these include ",(0,t.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),", ",(0,t.jsx)(i.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,t.jsx)(i.a,{href:"/docs/data/brotli",children:"brotli"}),", ",(0,t.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"}),", & ",(0,t.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsx)(i.h3,{id:"linux--macos",children:"Linux & macOS"}),"\n",(0,t.jsxs)(i.p,{children:["Chances are, you have gzip already available on your system. You can encode gzip archives using the ",(0,t.jsx)(i.code,{children:"gzip"})," command."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:"Open a terminal window."}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:"Navigate to the directory where you want to create the gzip archive."}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsxs)(i.p,{children:["Use the ",(0,t.jsx)(i.code,{children:"gzip"})," command followed by the name of the file you want to compress. For example:"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gzip -7 myfile.txt\n"})}),"\n",(0,t.jsxs)(i.p,{children:["This will create a compressed file called ",(0,t.jsx)(i.code,{children:"myfile.txt.gz"})," in the current directory using compression level 7. Compression levels span from 1 through 9 (",(0,t.jsx)(i.code,{children:"-1 .. -9"}),"; shortcuts are ",(0,t.jsx)(i.code,{children:"--fast"})," for ",(0,t.jsx)(i.code,{children:"-1"}),", ",(0,t.jsx)(i.code,{children:"--best"})," for ",(0,t.jsx)(i.code,{children:"-9"}),")."]}),"\n",(0,t.jsxs)(i.ol,{start:"4",children:["\n",(0,t.jsxs)(i.li,{children:["If you want to compress multiple files at once, you can use the ",(0,t.jsx)(i.code,{children:"-a"})," option followed by the names of the files you want to compress. For example:"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gzip -a myfile1.txt myfile2.txt\n"})}),"\n",(0,t.jsxs)(i.p,{children:["This will create compressed files called ",(0,t.jsx)(i.code,{children:"myfile1.txt.gz"})," & ",(0,t.jsx)(i.code,{children:"myfile2.txt.gz"})," in the current directory."]}),"\n",(0,t.jsxs)(i.ol,{start:"5",children:["\n",(0,t.jsxs)(i.li,{children:["If you want to compress a directory and all its contents, you can use the ",(0,t.jsx)(i.code,{children:"-r"})," option followed by the name of the directory. For example:"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gzip -r mydirectory/\n"})}),"\n",(0,t.jsx)(i.p,{children:"This will create compressed versions of each file in the specified directory."}),"\n",(0,t.jsxs)(i.ol,{start:"6",children:["\n",(0,t.jsxs)(i.li,{children:["If you want to encode the gzip archive with a different extension, you can use the ",(0,t.jsx)(i.code,{children:"-S"})," option followed by the suffix ",(0,t.jsx)(i.code,{children:".suf"}),". For example:"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gzip -S .suf myfile.txt\n"})}),"\n",(0,t.jsxs)(i.p,{children:["This will create a gzip-compressed file called ",(0,t.jsx)(i.code,{children:"myfile.txt.suf"})," in the current directory."]}),"\n",(0,t.jsxs)(i.p,{children:["Also, you can use other options like ",(0,t.jsx)(i.code,{children:"-v"})," for verbose mode, ",(0,t.jsx)(i.code,{children:"-f"})," to force overwriting & compress links, ",(0,t.jsx)(i.code,{children:"-l"})," for listing the files and ",(0,t.jsx)(i.code,{children:"-d"})," for decompressing the files."]}),"\n",(0,t.jsxs)(i.p,{children:["You can find more information about the ",(0,t.jsx)(i.code,{children:"gzip"})," command & its options by running ",(0,t.jsx)(i.code,{children:"man gzip"})," in a terminal."]}),"\n",(0,t.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,t.jsx)(i.p,{children:"To be filled."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsxs)(i.em,{children:["References: Mark Adler is an American software engineer best known for his work in the field of data compression as the author of the Adler-32 checksum function, and a co-author of the zlib compression library and gzip. He has contributed to Info-ZIP, and has participated in developing the Portable Network Graphics (PNG) image format. Much of this post is based on his writing in ",(0,t.jsx)(i.a,{href:"https://stackoverflow.com/questions/20762094/how-are-zlib-gzip-and-zip-related-what-do-they-have-in-common-and-how-are-they",children:"this StackOverflow answer"})]})})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var t=s(6540);const n={},o=t.createContext(n);function r(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b67d0f3.e7a07eba.js b/assets/js/1b67d0f3.e7a07eba.js new file mode 100644 index 000000000..969301c1d --- /dev/null +++ b/assets/js/1b67d0f3.e7a07eba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[842],{9720:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"data/gzip","title":"gzip","description":"Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with tar to create .tar.gz archives. Formats like ZIP & PNG also use Deflate to different effects.","source":"@site/docs/data/gzip.mdx","sourceDirName":"data","slug":"/data/gzip","permalink":"/docs/data/gzip","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/gzip.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"gzip","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"ZIP","permalink":"/docs/data/zip"},"next":{"title":"bzip2","permalink":"/docs/data/bzip2"}}');var n=s(4848),o=s(8453);const r={title:"gzip",sidebar_position:2},a="gzip",c={},d=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"History",id:"history",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Linux & macOS",id:"linux--macos",level:3},{value:"Windows",id:"windows",level:3}];function l(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"gzip",children:"gzip"})}),"\n",(0,n.jsxs)(i.p,{children:["Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with ",(0,n.jsx)(i.a,{href:"/docs/data/tar",children:(0,n.jsx)(i.code,{children:"tar"})})," to create ",(0,n.jsx)(i.code,{children:".tar.gz"})," archives. Formats like ",(0,n.jsx)(i.a,{href:"/docs/data/zip",children:"ZIP"})," & ",(0,n.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"})," also use Deflate to different effects."]}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsx)(i.p,{children:"While ZIP is a multi-file archiving format that can compress multiple files into a single compressed file, Gzip is a single-file format that compresses a single file into a single compressed file. Both use DEFLATE for compression. ZIP supports encryption, while Gzip does not. ZIP also stores more extensive header information."}),"\n",(0,n.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,n.jsx)(i.p,{children:"In order to properly understand the gzip format, we must first talk about ZIP. A lot of similar or identical information is covered in our ZIP entry."}),"\n",(0,n.jsx)(i.p,{children:"The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation PKZIP was shareware."}),"\n",(0,n.jsxs)(i.p,{children:["A ",(0,n.jsx)(i.a,{href:"http://www.digitalpreservation.gov/formats/fdd/fdd000361.shtml",children:"restricted ZIP format"})," exists and is used in other filetypes such as Java .jar archives, a slew of Microsoft Office file formats, Office Document Format files (.odt, .ods, .odp), and EPUB files for e-readers."]}),"\n",(0,n.jsxs)(i.p,{children:['In around 1990, Info-ZIP came onto the scene. "Info-ZIP\'s purpose is to provide free, portable, high-quality versions of the Zip and UnZip compressor-archiver utilities that are compatible with the DOS-based PKZIP by PKWARE, Inc." (',(0,n.jsx)(i.a,{href:"https://infozip.sourceforge.net/",children:"https://infozip.sourceforge.net/"}),"). They did this successfully, leading to increased adoption of the ZIP format."]}),"\n",(0,n.jsxs)(i.p,{children:["In the early 1990s the ",(0,n.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix ",(0,n.jsx)(i.code,{children:"compress"})," utility, which used the (at the time) patented LZW compression algorithm which threatened its free use. Though some specific implementations of Deflate were patented by Phil Katz, the format was not, so a Deflate implementation that did not infringe on any patents was written."]}),"\n",(0,n.jsxs)(i.p,{children:["As a ",(0,n.jsx)(i.code,{children:"compress"})," replacement, the Unix gzip utility can decompress data that was compressed using ",(0,n.jsx)(i.code,{children:"compress"}),". Gzip compresses quite a bit better than Unix compress due to its use of DEFLATE, and it has very fast decompression. It also adds a CRC-32 checksum as an integrity check for the archived data. The header format permits the storage of more information than the compress format allowed, such as the original file name & the file modification time."]}),"\n",(0,n.jsxs)(i.p,{children:["The popular ",(0,n.jsx)(i.a,{href:"/docs/data/tar",children:(0,n.jsx)(i.code,{children:"tar"})})," utility, which creates an archive of files, has an option to compress directly to the ",(0,n.jsx)(i.code,{children:".tar.gz"})," format and is a very popular use caze for gzip. Since the compression of a ",(0,n.jsx)(i.code,{children:".tar"})," can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. ",(0,n.jsx)(i.code,{children:".tar.gz"})," is the most common archive format in use on Unix due to its very high portability, but there are better compression methods available. Some of these include ",(0,n.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),", ",(0,n.jsx)(i.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,n.jsx)(i.a,{href:"/docs/data/brotli",children:"brotli"}),", ",(0,n.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"}),", & ",(0,n.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"encoding",children:"Encoding"}),"\n",(0,n.jsx)(i.h3,{id:"linux--macos",children:"Linux & macOS"}),"\n",(0,n.jsxs)(i.p,{children:["Chances are, you have gzip already available on your system. You can encode gzip archives using the ",(0,n.jsx)(i.code,{children:"gzip"})," command."]}),"\n",(0,n.jsxs)(i.ol,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:"Open a terminal window."}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:"Navigate to the directory where you want to create the gzip archive."}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:["Use the ",(0,n.jsx)(i.code,{children:"gzip"})," command followed by the name of the file you want to compress. For example:"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"gzip -7 myfile.txt\n"})}),"\n",(0,n.jsxs)(i.p,{children:["This will create a compressed file called ",(0,n.jsx)(i.code,{children:"myfile.txt.gz"})," in the current directory using compression level 7. Compression levels span from 1 through 9 (",(0,n.jsx)(i.code,{children:"-1 .. -9"}),"; shortcuts are ",(0,n.jsx)(i.code,{children:"--fast"})," for ",(0,n.jsx)(i.code,{children:"-1"}),", ",(0,n.jsx)(i.code,{children:"--best"})," for ",(0,n.jsx)(i.code,{children:"-9"}),")."]}),"\n",(0,n.jsxs)(i.ol,{start:"4",children:["\n",(0,n.jsxs)(i.li,{children:["If you want to compress multiple files at once, you can use the ",(0,n.jsx)(i.code,{children:"-a"})," option followed by the names of the files you want to compress. For example:"]}),"\n"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"gzip -a myfile1.txt myfile2.txt\n"})}),"\n",(0,n.jsxs)(i.p,{children:["This will create compressed files called ",(0,n.jsx)(i.code,{children:"myfile1.txt.gz"})," & ",(0,n.jsx)(i.code,{children:"myfile2.txt.gz"})," in the current directory."]}),"\n",(0,n.jsxs)(i.ol,{start:"5",children:["\n",(0,n.jsxs)(i.li,{children:["If you want to compress a directory and all its contents, you can use the ",(0,n.jsx)(i.code,{children:"-r"})," option followed by the name of the directory. For example:"]}),"\n"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"gzip -r mydirectory/\n"})}),"\n",(0,n.jsx)(i.p,{children:"This will create compressed versions of each file in the specified directory."}),"\n",(0,n.jsxs)(i.ol,{start:"6",children:["\n",(0,n.jsxs)(i.li,{children:["If you want to encode the gzip archive with a different extension, you can use the ",(0,n.jsx)(i.code,{children:"-S"})," option followed by the suffix ",(0,n.jsx)(i.code,{children:".suf"}),". For example:"]}),"\n"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"gzip -S .suf myfile.txt\n"})}),"\n",(0,n.jsxs)(i.p,{children:["This will create a gzip-compressed file called ",(0,n.jsx)(i.code,{children:"myfile.txt.suf"})," in the current directory."]}),"\n",(0,n.jsxs)(i.p,{children:["Also, you can use other options like ",(0,n.jsx)(i.code,{children:"-v"})," for verbose mode, ",(0,n.jsx)(i.code,{children:"-f"})," to force overwriting & compress links, ",(0,n.jsx)(i.code,{children:"-l"})," for listing the files and ",(0,n.jsx)(i.code,{children:"-d"})," for decompressing the files."]}),"\n",(0,n.jsxs)(i.p,{children:["You can find more information about the ",(0,n.jsx)(i.code,{children:"gzip"})," command & its options by running ",(0,n.jsx)(i.code,{children:"man gzip"})," in a terminal."]}),"\n",(0,n.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,n.jsx)(i.p,{children:"To be filled."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.em,{children:["References: Mark Adler is an American software engineer best known for his work in the field of data compression as the author of the Adler-32 checksum function, and a co-author of the zlib compression library and gzip. He has contributed to Info-ZIP, and has participated in developing the Portable Network Graphics (PNG) image format. Much of this post is based on his writing in ",(0,n.jsx)(i.a,{href:"https://stackoverflow.com/questions/20762094/how-are-zlib-gzip-and-zip-related-what-do-they-have-in-common-and-how-are-they",children:"this StackOverflow answer"})]})})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var t=s(6540);const n={},o=t.createContext(n);function r(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ca2b1db.4791e151.js b/assets/js/1ca2b1db.4791e151.js new file mode 100644 index 000000000..37c850ed8 --- /dev/null +++ b/assets/js/1ca2b1db.4791e151.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7855],{3145:(e,o,d)=>{d.r(o),d.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>r,metadata:()=>i,toc:()=>s});const i=JSON.parse('{"id":"encoders_hw/mediacodec","title":"Mediacodec","description":"The Android\'s MediaCodec framework is a part of Android\'s multimedia framework that provides access to low-level media encoder & decoder components. It is similar to VideoToolbox on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data.","source":"@site/docs/encoders_hw/mediacodec.mdx","sourceDirName":"encoders_hw","slug":"/encoders_hw/mediacodec","permalink":"/docs/encoders_hw/mediacodec","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/mediacodec.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"Mediacodec","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"VideoToolbox","permalink":"/docs/encoders_hw/videotoolbox"},"next":{"title":"SRT","permalink":"/docs/subtitles/SRT"}}');var n=d(4848),t=d(8453);const r={title:"Mediacodec",sidebar_position:5},a="Mediacodec",c={},s=[{value:"Usage",id:"usage",level:2},{value:"FFmpeg",id:"ffmpeg",level:3}];function l(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"mediacodec",children:"Mediacodec"})}),"\n",(0,n.jsxs)(o.p,{children:["The Android's MediaCodec framework is a part of Android's multimedia framework that provides access to low-level media encoder & decoder components. It is similar to ",(0,n.jsx)(o.a,{href:"/docs/encoders_hw/videotoolbox",children:"VideoToolbox"})," on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data."]}),"\n",(0,n.jsxs)(o.p,{children:["One of the key features of the MediaCodec framework is its support for automatic media transcoding within the operating system. Introduced in Android 12, media transcoding features of the operating system allow devices to use more modern, storage-efficient media formats for video capture while maintaining compatibility with apps. For devices with compatible media transcoding enabled, Android can automatically convert videos recorded in formats such as ",(0,n.jsx)(o.a,{href:"/docs/video/HEVC",children:"H.265"})," when the videos are opened by an app that doesn't support the format. This allows apps to function even when videos are captured in newer formats on the device."]}),"\n",(0,n.jsx)(o.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsxs)(o.p,{children:["In order to view your device's supported hardware and software encoders exposed by the MediaCodec framework, it is advised to download the open source ",(0,n.jsx)(o.a,{href:"https://play.google.com/store/apps/details?id=com.parseus.codecinfo",children:"Codec Info"})," application."]}),"\n",(0,n.jsxs)(o.p,{children:["Once you know how to properly interact with your device's hardware encoders, ",(0,n.jsx)(o.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," will help you transcode videos easily from the command line."]}),"\n",(0,n.jsx)(o.h3,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(o.p,{children:["Testing for this piece was done on the Google Pixel 8, which featurs the Tensor G3 SoC. It is Exynos-based, so ",(0,n.jsx)(o.a,{href:"/docs/video/AVC",children:"H.264"}),", H.265 (HEVC), and ",(0,n.jsx)(o.a,{href:"/docs/video/VP9",children:"VP9"})," hardware acceleration for encoding are provided by the Exynos media block. AV1 encoding and decoding are available on the Tensor G3 provided by a custom Google multimedia block."]}),"\n",(0,n.jsx)(o.p,{children:"The Exynos's hardware implementation for encoding H.264 and H.265 does not support CQ (Constant Quality) encoding, so a target bitrate must be provided for either CBR (Constant Bitrate) or VBR (Variable Bitrate) encoding. Google's AV1 implementation is in the same situation."}),"\n",(0,n.jsx)(o.p,{children:"Some example MediaCodec encoding commands with FFmpeg:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",metastring:'title="H.264 encoding (VBR, target bitrate 4000K, 250-frame GOP size)"',children:"ffmpeg -i input.mkv -c:v h264_mediacodec -codec_name c2.exynos.h264.encoder -bitrate_mode 1 -b:v 4000K -g 250 output.mp4\n"})}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",metastring:'title="H.265 encoding (VBR, target bitrate 4000K, 250-frame GOP size)"',children:"ffmpeg -i input.mkv -c:v hevc_mediacodec -codec_name c2.exynos.hevc.encoder -bitrate_mode 1 -b:v 4000K -g 250 output.mp4\n"})}),"\n",(0,n.jsx)(o.p,{children:"VP9 encoding produces video that is severely distorted relative to the bitrate, and AV1 encoding produces broken files without metadata."}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",metastring:'title="VP9 encoding (VBR, target bitrate 9000K, 250-frame GOP size)"',children:"ffmpeg -i input.mkv -c:v vp9_mediacodec -codec_name c2.exynos.vp9.encoder -bitrate_mode 1 -b:v 9000K -g 250 output.mkv\n"})}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",metastring:'title="AV1 encoding (VBR, target bitrate 8000K, 250-frame GOP size)"',children:"ffmpeg -i input.mkv -c:v av1_mediacodec -codec_name c2.google.av1.encoder -bitrate_mode 1 -b:v 8000K -g 250 output.mp4\n"})}),"\n",(0,n.jsxs)(o.p,{children:["Just run ",(0,n.jsx)(o.code,{children:"ffmpeg -help encoder=hevc_mediacodec"})," or ",(0,n.jsx)(o.code,{children:"ffmpeg -help encoder=h264_mediacodec"})," for more info on how to use your MediaCodec encoders. You can choose a value for ",(0,n.jsx)(o.code,{children:"-codec_name"})," based on what is shown in the Codec Info app."]}),"\n",(0,n.jsxs)(o.p,{children:[(0,n.jsx)(o.em,{children:"Sources"}),"\n(1) MediaCodec | Android Developers. ",(0,n.jsx)(o.a,{href:"https://developer.android.com/reference/android/media/MediaCodec",children:"https://developer.android.com/reference/android/media/MediaCodec"}),".\n(2) Media | Android Open Source Project. ",(0,n.jsx)(o.a,{href:"https://source.android.com/docs/core/media",children:"https://source.android.com/docs/core/media"}),"."]})]})}function m(e={}){const{wrapper:o}={...(0,t.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,o,d)=>{d.d(o,{R:()=>r,x:()=>a});var i=d(6540);const n={},t=i.createContext(n);function r(e){const o=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ca2b1db.db972dc4.js b/assets/js/1ca2b1db.db972dc4.js deleted file mode 100644 index a11b5b958..000000000 --- a/assets/js/1ca2b1db.db972dc4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7855],{9073:(e,o,d)=>{d.r(o),d.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>m,frontMatter:()=>t,metadata:()=>a,toc:()=>s});var i=d(4848),n=d(8453);const t={title:"Mediacodec",sidebar_position:5},r="Mediacodec",a={id:"encoders_hw/mediacodec",title:"Mediacodec",description:"The Android's MediaCodec framework is a part of Android's multimedia framework that provides access to low-level media encoder & decoder components. It is similar to VideoToolbox on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data.",source:"@site/docs/encoders_hw/mediacodec.mdx",sourceDirName:"encoders_hw",slug:"/encoders_hw/mediacodec",permalink:"/docs/encoders_hw/mediacodec",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/mediacodec.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"Mediacodec",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"VideoToolbox",permalink:"/docs/encoders_hw/videotoolbox"},next:{title:"SRT",permalink:"/docs/subtitles/SRT"}},c={},s=[{value:"Usage",id:"usage",level:2},{value:"FFmpeg",id:"ffmpeg",level:3}];function l(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"mediacodec",children:"Mediacodec"})}),"\n",(0,i.jsxs)(o.p,{children:["The Android's MediaCodec framework is a part of Android's multimedia framework that provides access to low-level media encoder & decoder components. It is similar to ",(0,i.jsx)(o.a,{href:"/docs/encoders_hw/videotoolbox",children:"VideoToolbox"})," on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data."]}),"\n",(0,i.jsxs)(o.p,{children:["One of the key features of the MediaCodec framework is its support for automatic media transcoding within the operating system. Introduced in Android 12, media transcoding features of the operating system allow devices to use more modern, storage-efficient media formats for video capture while maintaining compatibility with apps. For devices with compatible media transcoding enabled, Android can automatically convert videos recorded in formats such as ",(0,i.jsx)(o.a,{href:"/docs/video/HEVC",children:"H.265"})," when the videos are opened by an app that doesn't support the format. This allows apps to function even when videos are captured in newer formats on the device."]}),"\n",(0,i.jsx)(o.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(o.p,{children:["In order to view your device's supported hardware and software encoders exposed by the MediaCodec framework, it is advised to download the open source ",(0,i.jsx)(o.a,{href:"https://play.google.com/store/apps/details?id=com.parseus.codecinfo",children:"Codec Info"})," application."]}),"\n",(0,i.jsxs)(o.p,{children:["Once you know how to properly interact with your device's hardware encoders, ",(0,i.jsx)(o.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," will help you transcode videos easily from the command line."]}),"\n",(0,i.jsx)(o.h3,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,i.jsxs)(o.p,{children:["Testing for this piece was done on the Google Pixel 8, which featurs the Tensor G3 SoC. It is Exynos-based, so ",(0,i.jsx)(o.a,{href:"/docs/video/AVC",children:"H.264"}),", H.265 (HEVC), and ",(0,i.jsx)(o.a,{href:"/docs/video/VP9",children:"VP9"})," hardware acceleration for encoding are provided by the Exynos media block. AV1 encoding and decoding are available on the Tensor G3 provided by a custom Google multimedia block."]}),"\n",(0,i.jsx)(o.p,{children:"The Exynos's hardware implementation for encoding H.264 and H.265 does not support CQ (Constant Quality) encoding, so a target bitrate must be provided for either CBR (Constant Bitrate) or VBR (Variable Bitrate) encoding. Google's AV1 implementation is in the same situation."}),"\n",(0,i.jsx)(o.p,{children:"Some example MediaCodec encoding commands with FFmpeg:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",metastring:'title="H.264 encoding (VBR, target bitrate 4000K, 250-frame GOP size)"',children:"ffmpeg -i input.mkv -c:v h264_mediacodec -codec_name c2.exynos.h264.encoder -bitrate_mode 1 -b:v 4000K -g 250 output.mp4\n"})}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",metastring:'title="H.265 encoding (VBR, target bitrate 4000K, 250-frame GOP size)"',children:"ffmpeg -i input.mkv -c:v hevc_mediacodec -codec_name c2.exynos.hevc.encoder -bitrate_mode 1 -b:v 4000K -g 250 output.mp4\n"})}),"\n",(0,i.jsx)(o.p,{children:"VP9 encoding produces video that is severely distorted relative to the bitrate, and AV1 encoding produces broken files without metadata."}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",metastring:'title="VP9 encoding (VBR, target bitrate 9000K, 250-frame GOP size)"',children:"ffmpeg -i input.mkv -c:v vp9_mediacodec -codec_name c2.exynos.vp9.encoder -bitrate_mode 1 -b:v 9000K -g 250 output.mkv\n"})}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",metastring:'title="AV1 encoding (VBR, target bitrate 8000K, 250-frame GOP size)"',children:"ffmpeg -i input.mkv -c:v av1_mediacodec -codec_name c2.google.av1.encoder -bitrate_mode 1 -b:v 8000K -g 250 output.mp4\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Just run ",(0,i.jsx)(o.code,{children:"ffmpeg -help encoder=hevc_mediacodec"})," or ",(0,i.jsx)(o.code,{children:"ffmpeg -help encoder=h264_mediacodec"})," for more info on how to use your MediaCodec encoders. You can choose a value for ",(0,i.jsx)(o.code,{children:"-codec_name"})," based on what is shown in the Codec Info app."]}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.em,{children:"Sources"}),"\n(1) MediaCodec | Android Developers. ",(0,i.jsx)(o.a,{href:"https://developer.android.com/reference/android/media/MediaCodec",children:"https://developer.android.com/reference/android/media/MediaCodec"}),".\n(2) Media | Android Open Source Project. ",(0,i.jsx)(o.a,{href:"https://source.android.com/docs/core/media",children:"https://source.android.com/docs/core/media"}),"."]})]})}function m(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,o,d)=>{d.d(o,{R:()=>r,x:()=>a});var i=d(6540);const n={},t=i.createContext(n);function r(e){const o=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1e5c3f00.2a7a8f17.js b/assets/js/1e5c3f00.2a7a8f17.js new file mode 100644 index 000000000..e543437af --- /dev/null +++ b/assets/js/1e5c3f00.2a7a8f17.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9486],{3585:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var i=n(1229),o=n(4848),r=n(8453);const s={title:"Codec Wiki: One Year Later",description:"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.",slug:"codec-wiki-one-year-later",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["anniversary","history"],hide_table_of_contents:!1},a=void 0,l={authorsImageUrls:[void 0]},c=[{value:"Stats",id:"stats",level:2},{value:"Plausible",id:"plausible",level:3},{value:"Google Search Console",id:"google-search-console",level:3},{value:"A Brief History",id:"a-brief-history",level:2},{value:"Bumps in the Road",id:"bumps-in-the-road",level:2},{value:"Closing Statement",id:"closing-statement",level:2}];function h(e){const t={a:"a",blockquote:"blockquote",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"Around a month ago, Codec Wiki celebrates it's very first anniversary as it officially hits one year old (Wow, that's a very long time!)."}),"\n",(0,o.jsxs)(t.p,{children:["First and foremost, I apologize for this delayed celebration post, I have been very busy for the past month, y'know, real life things. Second of all, I would like to say ",(0,o.jsx)(t.strong,{children:"THANK YOU"})," for everyone who helped build this wiki from the ground up and writing down the entries, you know who you are!"]}),"\n",(0,o.jsx)(t.h2,{id:"stats",children:"Stats"}),"\n",(0,o.jsx)(t.p,{children:"Thanks to everyone's efforts, over the course of 12 months Codec Wiki has grown into the (almost) go-to documentation and guide for newcomers just starting out in the quirky and wild world of multimedia encoding. So here are some pretty graphs to look at our progress so far!"}),"\n",(0,o.jsx)(t.h3,{id:"plausible",children:"Plausible"}),"\n",(0,o.jsxs)(t.p,{children:["As you may know, we run our own Plausible Analytics instance. Which is a self-hosted, open source, and privacy-respecting analytics. Currently hosted in Singapore and available for everyone to view ",(0,o.jsx)(t.a,{href:"https://analytics.x266.mov/wiki.x266.mov",children:"here"}),"."]}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/plausible.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/plausible.webp",alt:"Plausible Analytics"})]}),"\n",(0,o.jsx)(t.p,{children:"7.7K unique total visitors for a whole year may not be much but it's a great start!"}),"\n",(0,o.jsx)(t.p,{children:"Let's not forget those who use uBlock Origin or similar to block the analytics script. So the visitor count could be two or three times more!"}),"\n",(0,o.jsx)(t.h3,{id:"google-search-console",children:"Google Search Console"}),"\n",(0,o.jsx)(t.p,{children:"For those who are unfamiliar, Google Search Console is used for viewing well.. Google search data for your website. This data is unfortunately private and only the owner and those invited can see the data, no setting available for public view. Probably for the better."}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/console.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/console.webp",alt:"Google Search Console"})]}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)(t.p,{children:"And for our top 10 search queries in the last 28 days:"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/insights.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/insights.webp",alt:"Search Queries page 1"})]}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/insights2.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/insights2.webp",alt:"Search Queries page 2"})]}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)(t.p,{children:"With pretty much zero competition in this niche of a market, it skyrocketed Codec Wiki to the top of search results for everything multimedia related \ud83d\ude05."}),"\n",(0,o.jsx)(t.h2,{id:"a-brief-history",children:"A Brief History"}),"\n",(0,o.jsx)(t.p,{children:'Around a year ago, I started work on an unofficial "wiki" for all things encoding, it initially started as a half-serious joke because I was annoyed there were no good documentation available\r\nanywhere on the internet on the real application and usage of encoders such as "Should I use tune SSIM in x encoder?". With the search results you\'ll be presented with being one or more of these:'}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Doesn't exist."}),"\n",(0,o.jsx)(t.li,{children:"Mentioned in the FFmpeg mailing list but nothing else."}),"\n",(0,o.jsx)(t.li,{children:"PDF research papers on IEEE and similar."}),"\n",(0,o.jsx)(t.li,{children:"Outdated information on Doom9 or Multimedia Wiki."}),"\n",(0,o.jsx)(t.li,{children:'"The documentation are in the code blocks".'}),"\n",(0,o.jsx)(t.li,{children:"Link rot."}),"\n",(0,o.jsx)(t.li,{children:"Abandoned, or mostly focused on other topics."}),"\n",(0,o.jsx)(t.li,{children:"Focused on a specific type of storytelling medium."}),"\n",(0,o.jsx)(t.li,{children:"Actual good explanation in an old forgotten site (rare)."}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Some or maybe even most of these results still appear up to this day."}),"\n",(0,o.jsx)(t.p,{children:"Frustrated with how scarce information is available on the open internet and combined with the fact that most, if not all of them only exist in non-search-engine-reachable private chat communities such as Discord where you'll have to join and scroll around older conversations."}),"\n",(0,o.jsx)(t.p,{children:'Prone to data erasure as Discord can nuke these servers for whatever reason they please and years of "documentation" is lost in an instant. It is simply not a good platform for a plethora of valuable information.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"That's why I took initiative."})}),"\n",(0,o.jsx)(t.h2,{id:"bumps-in-the-road",children:"Bumps in the Road"}),"\n",(0,o.jsx)(t.p,{children:"There were also generally a lot of distrust and pushbacks when this project first began, particularly from those who are more experienced with encoding. Which is understandable because everyone who attempted before burned out and never finished it."}),"\n",(0,o.jsx)(t.p,{children:"But Codec Wiki stood the test of time with constant updates through active collaboration of everyone involved, nowadays those voices have mostly subsided or even joined the project themselves. And I am grateful for that."}),"\n",(0,o.jsx)(t.h2,{id:"closing-statement",children:"Closing Statement"}),"\n",(0,o.jsxs)(t.p,{children:["Once again, ",(0,o.jsx)(t.strong,{children:"THANK YOU VERY MUCH"})," for those who are involved in this project and making the once pipe dream of a one-stop-shop user-friendly documentation for encoding into something that's possible."]}),"\n",(0,o.jsx)(t.p,{children:"Let's continue documenting the most crucial yet invisible driving force of internet traffic, pages by pages."}),"\n",(0,o.jsx)(t.p,{children:"Together we are strong, divided we burn out."}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:['"There are times when a critic truly risks something, and that is the discovery and defense of the ',(0,o.jsx)(t.em,{children:"new"}),". ",(0,o.jsx)(t.strong,{children:"The world is often unkind to new talent, new creations. The new needs friends"}),'."']}),"\n",(0,o.jsx)(t.p,{children:"\u2014 Anton Ego"}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var i=n(6540);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}},1229:e=>{e.exports=JSON.parse('{"permalink":"/blog/codec-wiki-one-year-later","source":"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx","title":"Codec Wiki: One Year Later","description":"Codec\'s Wiki turbulent one-year journey since it\'s inception to everyone\'s go-to site for encoding documentation.","date":"2024-07-20T00:00:00.000Z","tags":[{"inline":true,"label":"anniversary","permalink":"/blog/tags/anniversary"},{"inline":true,"label":"history","permalink":"/blog/tags/history"}],"readingTime":3.785,"hasTruncateMarker":true,"authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Codec Wiki: One Year Later","description":"Codec\'s Wiki turbulent one-year journey since it\'s inception to everyone\'s go-to site for encoding documentation.","slug":"codec-wiki-one-year-later","authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"}],"tags":["anniversary","history"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Better late than never: SVT-AV1 v2.2.x Deep Dive","permalink":"/blog/svt-av1-third-deep-dive"},"nextItem":{"title":"AV1 for Dummies","permalink":"/blog/av1-for-dummies"}}')}}]); \ No newline at end of file diff --git a/assets/js/1e5c3f00.e810230c.js b/assets/js/1e5c3f00.e810230c.js deleted file mode 100644 index b92a842cc..000000000 --- a/assets/js/1e5c3f00.e810230c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9486],{3585:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=n(4848),i=n(8453);const s={title:"Codec Wiki: One Year Later",description:"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.",slug:"codec-wiki-one-year-later",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["anniversary","history"],hide_table_of_contents:!1},r=void 0,a={permalink:"/blog/codec-wiki-one-year-later",source:"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx",title:"Codec Wiki: One Year Later",description:"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.",date:"2024-07-20T00:00:00.000Z",tags:[{inline:!0,label:"anniversary",permalink:"/blog/tags/anniversary"},{inline:!0,label:"history",permalink:"/blog/tags/history"}],readingTime:3.785,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4",key:null,page:null}],frontMatter:{title:"Codec Wiki: One Year Later",description:"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.",slug:"codec-wiki-one-year-later",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["anniversary","history"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"AV1 for Dummies",permalink:"/blog/av1-for-dummies"}},l={authorsImageUrls:[void 0]},c=[{value:"Stats",id:"stats",level:2},{value:"Plausible",id:"plausible",level:3},{value:"Google Search Console",id:"google-search-console",level:3},{value:"A Brief History",id:"a-brief-history",level:2},{value:"Bumps in the Road",id:"bumps-in-the-road",level:2},{value:"Closing Statement",id:"closing-statement",level:2}];function h(e){const t={a:"a",blockquote:"blockquote",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"Around a month ago, Codec Wiki celebrates it's very first anniversary as it officially hits one year old (Wow, that's a very long time!)."}),"\n",(0,o.jsxs)(t.p,{children:["First and foremost, I apologize for this delayed celebration post, I have been very busy for the past month, y'know, real life things. Second of all, I would like to say ",(0,o.jsx)(t.strong,{children:"THANK YOU"})," for everyone who helped build this wiki from the ground up and writing down the entries, you know who you are!"]}),"\n",(0,o.jsx)(t.h2,{id:"stats",children:"Stats"}),"\n",(0,o.jsx)(t.p,{children:"Thanks to everyone's efforts, over the course of 12 months Codec Wiki has grown into the (almost) go-to documentation and guide for newcomers just starting out in the quirky and wild world of multimedia encoding. So here are some pretty graphs to look at our progress so far!"}),"\n",(0,o.jsx)(t.h3,{id:"plausible",children:"Plausible"}),"\n",(0,o.jsxs)(t.p,{children:["As you may know, we run our own Plausible Analytics instance. Which is a self-hosted, open source, and privacy-respecting analytics. Currently hosted in Singapore and available for everyone to view ",(0,o.jsx)(t.a,{href:"https://analytics.x266.mov/wiki.x266.mov",children:"here"}),"."]}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/plausible.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/plausible.webp",alt:"Plausible Analytics"})]}),"\n",(0,o.jsx)(t.p,{children:"7.7K unique total visitors for a whole year may not be much but it's a great start!"}),"\n",(0,o.jsx)(t.p,{children:"Let's not forget those who use uBlock Origin or similar to block the analytics script. So the visitor count could be two or three times more!"}),"\n",(0,o.jsx)(t.h3,{id:"google-search-console",children:"Google Search Console"}),"\n",(0,o.jsx)(t.p,{children:"For those who are unfamiliar, Google Search Console is used for viewing well.. Google search data for your website. This data is unfortunately private and only the owner and those invited can see the data, no setting available for public view. Probably for the better."}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/console.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/console.webp",alt:"Google Search Console"})]}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)(t.p,{children:"And for our top 10 search queries in the last 28 days:"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/insights.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/insights.webp",alt:"Search Queries page 1"})]}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/insights2.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/one-year-anniv-blog/insights2.webp",alt:"Search Queries page 2"})]}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)(t.p,{children:"With pretty much zero competition in this niche of a market, it skyrocketed Codec Wiki to the top of search results for everything multimedia related \ud83d\ude05."}),"\n",(0,o.jsx)(t.h2,{id:"a-brief-history",children:"A Brief History"}),"\n",(0,o.jsx)(t.p,{children:'Around a year ago, I started work on an unofficial "wiki" for all things encoding, it initially started as a half-serious joke because I was annoyed there were no good documentation available\r\nanywhere on the internet on the real application and usage of encoders such as "Should I use tune SSIM in x encoder?". With the search results you\'ll be presented with being one or more of these:'}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Doesn't exist."}),"\n",(0,o.jsx)(t.li,{children:"Mentioned in the FFmpeg mailing list but nothing else."}),"\n",(0,o.jsx)(t.li,{children:"PDF research papers on IEEE and similar."}),"\n",(0,o.jsx)(t.li,{children:"Outdated information on Doom9 or Multimedia Wiki."}),"\n",(0,o.jsx)(t.li,{children:'"The documentation are in the code blocks".'}),"\n",(0,o.jsx)(t.li,{children:"Link rot."}),"\n",(0,o.jsx)(t.li,{children:"Abandoned, or mostly focused on other topics."}),"\n",(0,o.jsx)(t.li,{children:"Focused on a specific type of storytelling medium."}),"\n",(0,o.jsx)(t.li,{children:"Actual good explanation in an old forgotten site (rare)."}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Some or maybe even most of these results still appear up to this day."}),"\n",(0,o.jsx)(t.p,{children:"Frustrated with how scarce information is available on the open internet and combined with the fact that most, if not all of them only exist in non-search-engine-reachable private chat communities such as Discord where you'll have to join and scroll around older conversations."}),"\n",(0,o.jsx)(t.p,{children:'Prone to data erasure as Discord can nuke these servers for whatever reason they please and years of "documentation" is lost in an instant. It is simply not a good platform for a plethora of valuable information.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"That's why I took initiative."})}),"\n",(0,o.jsx)(t.h2,{id:"bumps-in-the-road",children:"Bumps in the Road"}),"\n",(0,o.jsx)(t.p,{children:"There were also generally a lot of distrust and pushbacks when this project first began, particularly from those who are more experienced with encoding. Which is understandable because everyone who attempted before burned out and never finished it."}),"\n",(0,o.jsx)(t.p,{children:"But Codec Wiki stood the test of time with constant updates through active collaboration of everyone involved, nowadays those voices have mostly subsided or even joined the project themselves. And I am grateful for that."}),"\n",(0,o.jsx)(t.h2,{id:"closing-statement",children:"Closing Statement"}),"\n",(0,o.jsxs)(t.p,{children:["Once again, ",(0,o.jsx)(t.strong,{children:"THANK YOU VERY MUCH"})," for those who are involved in this project and making the once pipe dream of a one-stop-shop user-friendly documentation for encoding into something that's possible."]}),"\n",(0,o.jsx)(t.p,{children:"Let's continue documenting the most crucial yet invisible driving force of internet traffic, pages by pages."}),"\n",(0,o.jsx)(t.p,{children:"Together we are strong, divided we burn out."}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:['"There are times when a critic truly risks something, and that is the discovery and defense of the ',(0,o.jsx)(t.em,{children:"new"}),". ",(0,o.jsx)(t.strong,{children:"The world is often unkind to new talent, new creations. The new needs friends"}),'."']}),"\n",(0,o.jsx)(t.p,{children:"\u2014 Anton Ego"}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var o=n(6540);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ec3ce74.4bbbc046.js b/assets/js/1ec3ce74.4bbbc046.js new file mode 100644 index 000000000..fd86b6392 --- /dev/null +++ b/assets/js/1ec3ce74.4bbbc046.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2142],{615:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>o,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"encoders/rav1e","title":"rav1e","description":"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.","source":"@site/docs/encoders/rav1e.mdx","sourceDirName":"encoders","slug":"/encoders/rav1e","permalink":"/docs/encoders/rav1e","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/rav1e.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"rav1e","keywords":["AV1","encoding","video encoding"],"sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"SVT-AV1","permalink":"/docs/encoders/SVT-AV1"},"next":{"title":"Aurora1 AV1","permalink":"/docs/encoders/Aurora1"}}');var i=r(4848),s=r(8453),a=r(1470),l=r(9365);const o={title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},c="rav1e",d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Patched Installation with HDR10+ support",id:"patched-installation-with-hdr10-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"rav1e",children:"rav1e"})}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"https://github.com/xiph/rav1e",children:"rav1e"})," is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause."]}),"\n",(0,i.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,i.jsxs)(t.p,{children:["rav1e is available in FFmpeg via ",(0,i.jsx)(t.code,{children:"librav1e"}),", to check if you have it, run ",(0,i.jsx)(t.code,{children:"ffmpeg -h encoder=librav1e"}),". You can input non-FFmpeg standard rav1e parameters via ",(0,i.jsx)(t.code,{children:"-rav1e-params"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,i.jsx)(t.p,{children:"rav1e supports the following color spaces:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Format"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,i.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV420P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,i.jsx)(t.td,{children:"8-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUVJ420P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,i.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV422P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,i.jsx)(t.td,{children:"8-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUVJ422P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,i.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV444P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,i.jsx)(t.td,{children:"8-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUVJ444P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,i.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV420P10LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,i.jsx)(t.td,{children:"10-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV422P10LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,i.jsx)(t.td,{children:"10-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV444P10LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,i.jsx)(t.td,{children:"10-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV420P12LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,i.jsx)(t.td,{children:"12-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV422P12LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,i.jsx)(t.td,{children:"12-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV444P12LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,i.jsx)(t.td,{children:"12-bit"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(a.A,{children:[(0,i.jsxs)(l.A,{value:"unixlike",label:"Linux & macOS",children:[(0,i.jsxs)(t.p,{children:["Official pre-built rav1e binaries can be found on the ",(0,i.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository. Unofficially, the ",(0,i.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," command line tool can automatically download and install rav1e to ",(0,i.jsx)(t.code,{children:"/usr/local/bin"}),". rav1e can also be installed with Cargo by running ",(0,i.jsx)(t.code,{children:"cargo install rav1e"}),"."]}),(0,i.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,i.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,i.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,i.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,i.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,i.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),(0,i.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,i.jsx)(t.code,{children:"/target/release"}),". You can then copy the binary wherever you desire it to go, like by doing ",(0,i.jsx)(t.code,{children:"cp /target/release/rav1e /usr/local/bin"})," ."]}),(0,i.jsx)(t.h3,{id:"patched-installation-with-hdr10-support",children:"Patched Installation with HDR10+ support"}),(0,i.jsxs)(t.p,{children:["rav1e currently has an ",(0,i.jsx)(t.a,{href:"https://github.com/xiph/rav1e/pull/3000",children:"unmerged pull request"})," by quietvoid, the person behind ",(0,i.jsx)(t.a,{href:"/docs/utilities/hdr10plus_tool",children:"hdr10plus_tool"})," and ",(0,i.jsx)(t.a,{href:"/docs/utilities/dovi_tool",children:"dovi_tool"}),". The PR adds a new parameter called ",(0,i.jsx)(t.code,{children:"--hdr10plus-json"})," for HDR10+ JSON dynamic metadata input. To merge it locally, do the following:"]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard [release commit]\ngit fetch origin pull/3000/head:HDR10+\n"})}),(0,i.jsx)(t.p,{children:"Now the patch should be applied, and you may build as usual."})]}),(0,i.jsxs)(l.A,{value:"windows",label:"Windows",children:[(0,i.jsxs)(t.p,{children:["If you would not like to build from source, official pre-built rav1e binaries can be found on the ",(0,i.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository."]}),(0,i.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,i.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,i.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,i.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,i.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,i.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-powershell",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nset RUSTFLAGS=-C target-cpu=native\ncargo build --release\n"})}),(0,i.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,i.jsx)(t.code,{children:"target/release"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(t.p,{children:"For AV1 encoding, rav1e has very sane defaults. It is very hard to go wrong with parameters if you modify as few as possible."}),"\n",(0,i.jsx)(t.admonition,{type:"tip",children:(0,i.jsxs)(t.p,{children:["To convert ",(0,i.jsx)(t.code,{children:"cq-level"})," in aomenc and ",(0,i.jsx)(t.code,{children:"crf"})," in SVT-AV1 to rav1e's quantizer values, multiply by 4. For example, ",(0,i.jsx)(t.code,{children:"--cq-level 20"})," equals to ",(0,i.jsx)(t.code,{children:"--quantizer 80"}),"."]})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage"',children:"rav1e -i input.y4m -o output.ivf --quantizer 60 --photon-noise 8\n"})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 80 --photon-noise 8\n"})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input and assuming 4K"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 68 --tile-columns 2 --tile-rows 1 --photon-noise 8\n"})}),"\n",(0,i.jsx)(t.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Use 2x1 tiles or ",(0,i.jsx)(t.code,{children:"tile-columns 2"})," and ",(0,i.jsx)(t.code,{children:"tile-rows 1"})," for 4K (2160p) encoding, this will help with both encoding and decoding speeds."]}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>a});r(6540);var n=r(4164);const i={tabItem:"tabItem_Ymn6"};var s=r(4848);function a(e){let{children:t,hidden:r,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,n.A)(i.tabItem,a),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),i=r(4164),s=r(3104),a=r(6347),l=r(205),o=r(7485),c=r(1682),d=r(679);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:i}}=e;return{value:t,label:r,attributes:n,default:i}}))}(r);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function x(e){let{queryString:t=!1,groupId:r}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,o.aZ)(s),(0,n.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:i}=e,s=h(e),[a,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s}))),[c,u]=x({queryString:r,groupId:i}),[m,g]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,d.Dv)(r);return[i,(0,n.useCallback)((e=>{r&&s.set(e)}),[r,s])]}({groupId:i}),b=(()=>{const e=c??m;return p({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=r(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=r(4848);function v(e){let{className:t,block:r,selectedValue:n,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const t=e.currentTarget,r=o.indexOf(t),i=l[r].value;i!==n&&(c(t),a(i))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;t=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;t=o[r]??o[o.length-1];break}}t?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:s}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>o.push(e),onKeyDown:u,onClick:d,...s,className:(0,i.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function j(e){let{lazy:t,children:r,selectedValue:s}=e;const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=m(e);return(0,f.jsxs)("div",{className:(0,i.A)("tabs-container",b.tabList),children:[(0,f.jsx)(v,{...t,...e}),(0,f.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,f.jsx)(y,{...e,children:u(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>l});var n=r(6540);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ec3ce74.4c398aa5.js b/assets/js/1ec3ce74.4c398aa5.js deleted file mode 100644 index fcbda791d..000000000 --- a/assets/js/1ec3ce74.4c398aa5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2142],{5780:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var n=r(4848),i=r(8453),s=r(1470),a=r(9365);const l={title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},o="rav1e",c={id:"encoders/rav1e",title:"rav1e",description:"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.",source:"@site/docs/encoders/rav1e.mdx",sourceDirName:"encoders",slug:"/encoders/rav1e",permalink:"/docs/encoders/rav1e",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/rav1e.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"},next:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"}},d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Patched Installation with HDR10+ support",id:"patched-installation-with-hdr10-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rav1e",children:"rav1e"})}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e",children:"rav1e"})," is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause."]}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["rav1e is available in FFmpeg via ",(0,n.jsx)(t.code,{children:"librav1e"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=librav1e"}),". You can input non-FFmpeg standard rav1e parameters via ",(0,n.jsx)(t.code,{children:"-rav1e-params"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"rav1e supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"12-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(s.A,{children:[(0,n.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsxs)(t.p,{children:["Official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository. Unofficially, the ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," command line tool can automatically download and install rav1e to ",(0,n.jsx)(t.code,{children:"/usr/local/bin"}),". rav1e can also be installed with Cargo by running ",(0,n.jsx)(t.code,{children:"cargo install rav1e"}),"."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"/target/release"}),". You can then copy the binary wherever you desire it to go, like by doing ",(0,n.jsx)(t.code,{children:"cp /target/release/rav1e /usr/local/bin"})," ."]}),(0,n.jsx)(t.h3,{id:"patched-installation-with-hdr10-support",children:"Patched Installation with HDR10+ support"}),(0,n.jsxs)(t.p,{children:["rav1e currently has an ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/pull/3000",children:"unmerged pull request"})," by quietvoid, the person behind ",(0,n.jsx)(t.a,{href:"/docs/utilities/hdr10plus_tool",children:"hdr10plus_tool"})," and ",(0,n.jsx)(t.a,{href:"/docs/utilities/dovi_tool",children:"dovi_tool"}),". The PR adds a new parameter called ",(0,n.jsx)(t.code,{children:"--hdr10plus-json"})," for HDR10+ JSON dynamic metadata input. To merge it locally, do the following:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard [release commit]\ngit fetch origin pull/3000/head:HDR10+\n"})}),(0,n.jsx)(t.p,{children:"Now the patch should be applied, and you may build as usual."})]}),(0,n.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,n.jsxs)(t.p,{children:["If you would not like to build from source, official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-powershell",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nset RUSTFLAGS=-C target-cpu=native\ncargo build --release\n"})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"target/release"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"For AV1 encoding, rav1e has very sane defaults. It is very hard to go wrong with parameters if you modify as few as possible."}),"\n",(0,n.jsx)(t.admonition,{type:"tip",children:(0,n.jsxs)(t.p,{children:["To convert ",(0,n.jsx)(t.code,{children:"cq-level"})," in aomenc and ",(0,n.jsx)(t.code,{children:"crf"})," in SVT-AV1 to rav1e's quantizer values, multiply by 4. For example, ",(0,n.jsx)(t.code,{children:"--cq-level 20"})," equals to ",(0,n.jsx)(t.code,{children:"--quantizer 80"}),"."]})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage"',children:"rav1e -i input.y4m -o output.ivf --quantizer 60 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 80 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input and assuming 4K"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 68 --tile-columns 2 --tile-rows 1 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Use 2x1 tiles or ",(0,n.jsx)(t.code,{children:"tile-columns 2"})," and ",(0,n.jsx)(t.code,{children:"tile-rows 1"})," for 4K (2160p) encoding, this will help with both encoding and decoding speeds."]}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>a});r(6540);var n=r(4164);const i={tabItem:"tabItem_Ymn6"};var s=r(4848);function a(e){let{children:t,hidden:r,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,n.A)(i.tabItem,a),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),i=r(4164),s=r(3104),a=r(6347),l=r(205),o=r(7485),c=r(1682),d=r(679);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:i}}=e;return{value:t,label:r,attributes:n,default:i}}))}(r);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function x(e){let{queryString:t=!1,groupId:r}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,o.aZ)(s),(0,n.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:i}=e,s=h(e),[a,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s}))),[c,u]=x({queryString:r,groupId:i}),[m,g]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,d.Dv)(r);return[i,(0,n.useCallback)((e=>{r&&s.set(e)}),[r,s])]}({groupId:i}),b=(()=>{const e=c??m;return p({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=r(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function f(e){let{className:t,block:r,selectedValue:n,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const t=e.currentTarget,r=o.indexOf(t),i=l[r].value;i!==n&&(c(t),a(i))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;t=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;t=o[r]??o[o.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:s}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>o.push(e),onKeyDown:u,onClick:d,...s,className:(0,i.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function j(e){let{lazy:t,children:r,selectedValue:s}=e;const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=m(e);return(0,v.jsxs)("div",{className:(0,i.A)("tabs-container",b.tabList),children:[(0,v.jsx)(f,{...t,...e}),(0,v.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,v.jsx)(y,{...e,children:u(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>l});var n=r(6540);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.62f4d628.js b/assets/js/1f391b9e.62f4d628.js new file mode 100644 index 000000000..1ca1e26c9 --- /dev/null +++ b/assets/js/1f391b9e.62f4d628.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6061],{2234:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var i=t(4164),a=t(4084),s=t(7559),l=t(7293),r=t(4848);function c(e){let{className:n}=e;return(0,r.jsx)(l.A,{type:"caution",title:(0,r.jsx)(a.Rc,{}),className:(0,i.A)(n,s.G.common.unlistedBanner),children:(0,r.jsx)(a.Uh,{})})}function o(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.AE,{}),(0,r.jsx)(c,{...e})]})}},6451:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var i=t(4164),a=t(4084),s=t(7559),l=t(7293),r=t(4848);function c(e){let{className:n}=e;return(0,r.jsx)(l.A,{type:"caution",title:(0,r.jsx)(a.Yh,{}),className:(0,i.A)(n,s.G.common.draftBanner),children:(0,r.jsx)(a.TT,{})})}var o=t(2234);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:i}=n;return(0,r.jsxs)(r.Fragment,{children:[(t||i.unlisted)&&(0,r.jsx)(o.A,{}),i.draft&&(0,r.jsx)(c,{})]})}},7973:(e,n,t)=>{t.r(n),t.d(n,{default:()=>f});t(6540);var i=t(4164),a=t(1213),s=t(7559),l=t(7823),r=t(8509),c=t(7763),o=t(6451),d=t(4336);const m={mdxPageWrapper:"mdxPageWrapper_j9I6"};var u=t(4848);function f(e){const{content:n}=e,{metadata:t,assets:f}=n,{title:h,editUrl:v,description:x,frontMatter:g,lastUpdatedBy:p,lastUpdatedAt:j}=t,{keywords:A,wrapperClassName:b,hide_table_of_contents:L}=g,N=f.image??g.image,C=!!(v||j||p);return(0,u.jsx)(a.e3,{className:(0,i.A)(b??s.G.wrapper.mdxPages,s.G.page.mdxPage),children:(0,u.jsxs)(l.A,{children:[(0,u.jsx)(a.be,{title:h,description:x,keywords:A,image:N}),(0,u.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,u.jsxs)("div",{className:(0,i.A)("row",m.mdxPageWrapper),children:[(0,u.jsxs)("div",{className:(0,i.A)("col",!L&&"col--8"),children:[(0,u.jsx)(o.A,{metadata:t}),(0,u.jsx)("article",{children:(0,u.jsx)(r.A,{children:(0,u.jsx)(n,{})})}),C&&(0,u.jsx)(d.A,{className:(0,i.A)("margin-top--sm",s.G.pages.pageFooterEditMetaRow),editUrl:v,lastUpdatedAt:j,lastUpdatedBy:p})]}),!L&&n.toc.length>0&&(0,u.jsx)("div",{className:"col col--2",children:(0,u.jsx)(c.A,{toc:n.toc,minHeadingLevel:g.toc_min_heading_level,maxHeadingLevel:g.toc_max_heading_level})})]})})]})})}},7763:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var i=t(4164),a=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(4848);const r="table-of-contents__link toc-highlight",c="table-of-contents__link--active";function o(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,i.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(a.A,{...t,linkClassName:r,linkActiveClassName:c})})}},5195:(e,n,t)=>{t.d(n,{A:()=>v});var i=t(6540),a=t(6342);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function r(e){const n=e.getBoundingClientRect();return n.top===n.bottom?r(e.parentNode):n}function c(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>r(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=o();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:l}=e;function r(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),r=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:l}),o=c(r,{anchorTopOffset:t.current}),d=e.find((e=>o&&o.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",r),document.addEventListener("resize",r),r(),()=>{document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}),[e,t])}var m=t(8774),u=t(4848);function f(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,u.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(f,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const h=i.memo(f);function v(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:o,maxHeadingLevel:m,...f}=e;const v=(0,a.p)(),x=o??v.tableOfContents.minHeadingLevel,g=m??v.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>l({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:x,maxHeadingLevel:g});return d((0,i.useMemo)((()=>{if(r&&c)return{linkClassName:r,linkActiveClassName:c,minHeadingLevel:x,maxHeadingLevel:g}}),[r,c,x,g])),(0,u.jsx)(h,{toc:p,className:t,linkClassName:r,...f})}},4084:(e,n,t)=>{t.d(n,{AE:()=>c,Rc:()=>l,TT:()=>d,Uh:()=>r,Yh:()=>o});t(6540);var i=t(1312),a=t(5260),s=t(4848);function l(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,s.jsx)(a.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function o(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.6ff12782.js b/assets/js/1f391b9e.6ff12782.js deleted file mode 100644 index e52998f96..000000000 --- a/assets/js/1f391b9e.6ff12782.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6061],{2234:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var i=t(4164),a=t(4084),s=t(7559),l=t(7293),r=t(4848);function c(e){let{className:n}=e;return(0,r.jsx)(l.A,{type:"caution",title:(0,r.jsx)(a.Rc,{}),className:(0,i.A)(n,s.G.common.unlistedBanner),children:(0,r.jsx)(a.Uh,{})})}function o(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.AE,{}),(0,r.jsx)(c,{...e})]})}},1689:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var i=t(4164),a=t(4084),s=t(7559),l=t(7293),r=t(4848);function c(e){let{className:n}=e;return(0,r.jsx)(l.A,{type:"caution",title:(0,r.jsx)(a.Yh,{}),className:(0,i.A)(n,s.G.common.draftBanner),children:(0,r.jsx)(a.TT,{})})}var o=t(2234);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:i}=n;return(0,r.jsxs)(r.Fragment,{children:[(t||i.unlisted)&&(0,r.jsx)(o.A,{}),i.draft&&(0,r.jsx)(c,{})]})}},7973:(e,n,t)=>{t.r(n),t.d(n,{default:()=>f});t(6540);var i=t(4164),a=t(1213),s=t(7559),l=t(263),r=t(8509),c=t(7763),o=t(1689),d=t(4336);const m={mdxPageWrapper:"mdxPageWrapper_j9I6"};var u=t(4848);function f(e){const{content:n}=e,{metadata:t,assets:f}=n,{title:h,editUrl:v,description:x,frontMatter:g,lastUpdatedBy:p,lastUpdatedAt:j}=t,{keywords:A,wrapperClassName:b,hide_table_of_contents:L}=g,N=f.image??g.image,C=!!(v||j||p);return(0,u.jsx)(a.e3,{className:(0,i.A)(b??s.G.wrapper.mdxPages,s.G.page.mdxPage),children:(0,u.jsxs)(l.A,{children:[(0,u.jsx)(a.be,{title:h,description:x,keywords:A,image:N}),(0,u.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,u.jsxs)("div",{className:(0,i.A)("row",m.mdxPageWrapper),children:[(0,u.jsxs)("div",{className:(0,i.A)("col",!L&&"col--8"),children:[(0,u.jsx)(o.A,{metadata:t}),(0,u.jsx)("article",{children:(0,u.jsx)(r.A,{children:(0,u.jsx)(n,{})})}),C&&(0,u.jsx)(d.A,{className:(0,i.A)("margin-top--sm",s.G.pages.pageFooterEditMetaRow),editUrl:v,lastUpdatedAt:j,lastUpdatedBy:p})]}),!L&&n.toc.length>0&&(0,u.jsx)("div",{className:"col col--2",children:(0,u.jsx)(c.A,{toc:n.toc,minHeadingLevel:g.toc_min_heading_level,maxHeadingLevel:g.toc_max_heading_level})})]})})]})})}},7763:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var i=t(4164),a=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(4848);const r="table-of-contents__link toc-highlight",c="table-of-contents__link--active";function o(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,i.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(a.A,{...t,linkClassName:r,linkActiveClassName:c})})}},5195:(e,n,t)=>{t.d(n,{A:()=>v});var i=t(6540),a=t(6342);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function r(e){const n=e.getBoundingClientRect();return n.top===n.bottom?r(e.parentNode):n}function c(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>r(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=o();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:l}=e;function r(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),r=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:l}),o=c(r,{anchorTopOffset:t.current}),d=e.find((e=>o&&o.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",r),document.addEventListener("resize",r),r(),()=>{document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}),[e,t])}var m=t(8774),u=t(4848);function f(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,u.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(f,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const h=i.memo(f);function v(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:o,maxHeadingLevel:m,...f}=e;const v=(0,a.p)(),x=o??v.tableOfContents.minHeadingLevel,g=m??v.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>l({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:x,maxHeadingLevel:g});return d((0,i.useMemo)((()=>{if(r&&c)return{linkClassName:r,linkActiveClassName:c,minHeadingLevel:x,maxHeadingLevel:g}}),[r,c,x,g])),(0,u.jsx)(h,{toc:p,className:t,linkClassName:r,...f})}},4084:(e,n,t)=>{t.d(n,{AE:()=>c,Rc:()=>l,TT:()=>d,Uh:()=>r,Yh:()=>o});t(6540);var i=t(1312),a=t(5260),s=t(4848);function l(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,s.jsx)(a.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function o(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/1fabe0bd.354553d0.js b/assets/js/1fabe0bd.354553d0.js new file mode 100644 index 000000000..9efa4df33 --- /dev/null +++ b/assets/js/1fabe0bd.354553d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5562],{2988:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"colorimetry/intro","title":"Intro","description":"There are many aspects which determine how the color information","source":"@site/docs/colorimetry/intro.mdx","sourceDirName":"colorimetry","slug":"/colorimetry/intro","permalink":"/docs/colorimetry/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/intro.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Intro","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Graining","permalink":"/docs/filtering/graining"},"next":{"title":"Color Formats","permalink":"/docs/colorimetry/format"}}');var r=o(4848),i=o(8453);const s={title:"Intro",sidebar_position:1},a="Intro",c={},d=[];function l(e){const t={h1:"h1",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"intro",children:"Intro"})}),"\n",(0,r.jsx)(t.p,{children:"There are many aspects which determine how the color information\nfor a video is stored and how it is rendered. As technology has improved,\nnew standards developed, and with new techologies such as HDR,\nnew standards continue to develop. However, the result is that\nit can be confusing to know which color settings to use for\na given video."}),"\n",(0,r.jsx)(t.p,{children:"Some properties such as the color format must be set.\nHowever, properties such as color range, primaries, matrix coefficients,\nand transfer function are optional. It is always best practice to set these\nwhen you are encoding a video, because if they are not set, the player\nmust make a guess as to what the correct settings are. If it guesses\nincorrectly, this can lead to the colors of the video being different\nfrom what was intended."})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var n=o(6540);const r={},i=n.createContext(r);function s(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1fabe0bd.70077be9.js b/assets/js/1fabe0bd.70077be9.js deleted file mode 100644 index 74de4fbf3..000000000 --- a/assets/js/1fabe0bd.70077be9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5562],{3315:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var n=o(4848),r=o(8453);const i={title:"Intro",sidebar_position:1},s="Intro",c={id:"colorimetry/intro",title:"Intro",description:"There are many aspects which determine how the color information",source:"@site/docs/colorimetry/intro.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/intro",permalink:"/docs/colorimetry/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/intro.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Intro",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Graining",permalink:"/docs/filtering/graining"},next:{title:"Color Formats",permalink:"/docs/colorimetry/format"}},a={},d=[];function l(e){const t={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"intro",children:"Intro"})}),"\n",(0,n.jsx)(t.p,{children:"There are many aspects which determine how the color information\nfor a video is stored and how it is rendered. As technology has improved,\nnew standards developed, and with new techologies such as HDR,\nnew standards continue to develop. However, the result is that\nit can be confusing to know which color settings to use for\na given video."}),"\n",(0,n.jsx)(t.p,{children:"Some properties such as the color format must be set.\nHowever, properties such as color range, primaries, matrix coefficients,\nand transfer function are optional. It is always best practice to set these\nwhen you are encoding a video, because if they are not set, the player\nmust make a guess as to what the correct settings are. If it guesses\nincorrectly, this can lead to the colors of the video being different\nfrom what was intended."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>c});var n=o(6540);const r={},i=n.createContext(r);function s(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/20d769d8.6b62af69.js b/assets/js/20d769d8.6b62af69.js new file mode 100644 index 000000000..a90f0e1e0 --- /dev/null +++ b/assets/js/20d769d8.6b62af69.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3121],{7114:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>m,frontMatter:()=>a,metadata:()=>n,toc:()=>l});var n=i(7558),o=i(4848),s=i(8453);const a={title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},r=void 0,d={authorsImageUrls:[void 0]},l=[{value:"A Scenario",id:"a-scenario",level:2}];function c(e){const t={h2:"h2",img:"img",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.img,{alt:"Feature image",src:i(3808).A+"",width:"1920",height:"1080"}),"\n",(0,o.jsx)(t.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,o.jsx)(t.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,o.jsx)(t.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},3808:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var n=i(6540);const o={},s=n.createContext(o);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(s.Provider,{value:t},e.children)}},7558:e=>{e.exports=JSON.parse('{"permalink":"/blog/embedding-the-un-embeddable","source":"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx","title":"Embedding the Un-Embeddable","description":"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.","date":"2023-10-29T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"discord","permalink":"/blog/tags/discord"}],"readingTime":8.92,"hasTruncateMarker":true,"authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Embedding the Un-Embeddable","description":"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.","slug":"embedding-the-un-embeddable","authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"}],"tags":["video","discord"],"image":"/img/discord-embed-blog-image.webp","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Encoding Animation with SVT-AV1: A Deep Dive","permalink":"/blog/svt-av1-deep-dive"},"nextItem":{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies"}}')}}]); \ No newline at end of file diff --git a/assets/js/20d769d8.fc1bbd1d.js b/assets/js/20d769d8.fc1bbd1d.js deleted file mode 100644 index c71725407..000000000 --- a/assets/js/20d769d8.fc1bbd1d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3121],{7114:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>m,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var n=i(4848),o=i(8453);const s={title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.92,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4",key:null,page:null}],frontMatter:{title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"},nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},d={authorsImageUrls:[void 0]},l=[{value:"A Scenario",id:"a-scenario",level:2}];function c(e){const t={h2:"h2",img:"img",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.img,{alt:"Feature image",src:i(9395).A+"",width:"1920",height:"1080"}),"\n",(0,n.jsx)(t.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,n.jsx)(t.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,n.jsx)(t.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},9395:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var n=i(6540);const o={},s=n.createContext(o);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2237.71567272.js b/assets/js/2237.b2c1d41b.js similarity index 79% rename from assets/js/2237.71567272.js rename to assets/js/2237.b2c1d41b.js index 6e8e4c91f..da5882585 100644 --- a/assets/js/2237.71567272.js +++ b/assets/js/2237.b2c1d41b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2237],{3363:(e,t,i)=>{i.d(t,{A:()=>a});i(6540);var n=i(4164),o=i(1312),s=i(1107),r=i(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},2237:(e,t,i)=>{i.r(t),i.d(t,{default:()=>c});i(6540);var n=i(1312),o=i(1213),s=i(263),r=i(3363),a=i(4848);function c(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2237],{3363:(e,t,i)=>{i.d(t,{A:()=>a});i(6540);var n=i(4164),o=i(1312),s=i(1107),r=i(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},2237:(e,t,i)=>{i.r(t),i.d(t,{default:()=>c});i(6540);var n=i(1312),o=i(1213),s=i(7823),r=i(3363),a=i(4848);function c(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/229f7513.1144a374.js b/assets/js/229f7513.1144a374.js new file mode 100644 index 000000000..c3c85763f --- /dev/null +++ b/assets/js/229f7513.1144a374.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7146],{6138:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"subtitles/webvtt","title":"WebVTT","description":"WebVTT, or Web Video Text Tracks, is the format for subtitles on the web. It is used with the HTML \\\\ element, or embedded into a webm container.","source":"@site/docs/subtitles/webvtt.mdx","sourceDirName":"subtitles","slug":"/subtitles/webvtt","permalink":"/docs/subtitles/webvtt","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/webvtt.mdx","tags":[],"version":"current","frontMatter":{"title":"WebVTT"},"sidebar":"tutorialSidebar","previous":{"title":"SubStation Alpha","permalink":"/docs/subtitles/SSA"},"next":{"title":"Vapoursynth","permalink":"/docs/filtering/vapoursynth"}}');var i=n(4848),r=n(8453);const o={title:"WebVTT"},l="WebVTT",a={},c=[{value:"Structure",id:"structure",level:2},{value:"Cue",id:"cue",level:3},{value:"Example",id:"example",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"webvtt",children:"WebVTT"})}),"\n",(0,i.jsxs)(t.p,{children:["WebVTT, or Web Video Text Tracks, is the format for subtitles on the web. It is used with the ",(0,i.jsx)(t.a,{href:"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track",children:"HTML element"}),", or embedded into a webm container."]}),"\n",(0,i.jsx)(t.h2,{id:"structure",children:"Structure"}),"\n",(0,i.jsxs)(t.p,{children:["WebVTT is a simple, text-based format, based on ",(0,i.jsx)(t.a,{href:"/docs/subtitles/SRT",children:"SRT"}),". All files start with the string\n",(0,i.jsx)(t.code,{children:"WEBVTT"}),", optionally, some text, then two new lines. That's where the\ndata we're interested in starts."]}),"\n",(0,i.jsx)(t.h3,{id:"cue",children:"Cue"}),"\n",(0,i.jsxs)(t.p,{children:["A WebVTT file is basically a bunch of cues. They can have a line with\nan ID, then they have to have a line specifying from where to where\nthe cue should be displayed like this: ",(0,i.jsx)(t.code,{children:"STARTTIME -> ENDTIME [optional settings go here]"}),", then all the text to be displayed goes after\nit. That text can have some HTML-like formatting in it. To learn about\nthem, see ",(0,i.jsx)(t.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebVTT_API#webvtt_cues",children:"the documentation"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"WEBVTT\n\n00:01.000 --\x3e 00:04.000\n- Never drink liquid nitrogen.\n\n00:05.000 --\x3e 00:09.000\n- It will perforate your stomach.\n- You could die.\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>l});var s=n(6540);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/229f7513.a0a2f53f.js b/assets/js/229f7513.a0a2f53f.js deleted file mode 100644 index c1c1cc9f6..000000000 --- a/assets/js/229f7513.a0a2f53f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7146],{4153:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var i=n(4848),s=n(8453);const r={title:"WebVTT"},o="WebVTT",l={id:"subtitles/webvtt",title:"WebVTT",description:"WebVTT, or Web Video Text Tracks, is the format for subtitles on the web. It is used with the HTML \\ element, or embedded into a webm container.",source:"@site/docs/subtitles/webvtt.mdx",sourceDirName:"subtitles",slug:"/subtitles/webvtt",permalink:"/docs/subtitles/webvtt",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/webvtt.mdx",tags:[],version:"current",frontMatter:{title:"WebVTT"},sidebar:"tutorialSidebar",previous:{title:"SubStation Alpha",permalink:"/docs/subtitles/SSA"},next:{title:"Vapoursynth",permalink:"/docs/filtering/vapoursynth"}},a={},c=[{value:"Structure",id:"structure",level:2},{value:"Cue",id:"cue",level:3},{value:"Example",id:"example",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"webvtt",children:"WebVTT"})}),"\n",(0,i.jsxs)(t.p,{children:["WebVTT, or Web Video Text Tracks, is the format for subtitles on the web. It is used with the ",(0,i.jsx)(t.a,{href:"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track",children:"HTML element"}),", or embedded into a webm container."]}),"\n",(0,i.jsx)(t.h2,{id:"structure",children:"Structure"}),"\n",(0,i.jsxs)(t.p,{children:["WebVTT is a simple, text-based format, based on ",(0,i.jsx)(t.a,{href:"/docs/subtitles/SRT",children:"SRT"}),". All files start with the string\n",(0,i.jsx)(t.code,{children:"WEBVTT"}),", optionally, some text, then two new lines. That's where the\ndata we're interested in starts."]}),"\n",(0,i.jsx)(t.h3,{id:"cue",children:"Cue"}),"\n",(0,i.jsxs)(t.p,{children:["A WebVTT file is basically a bunch of cues. They can have a line with\nan ID, then they have to have a line specifying from where to where\nthe cue should be displayed like this: ",(0,i.jsx)(t.code,{children:"STARTTIME -> ENDTIME [optional settings go here]"}),", then all the text to be displayed goes after\nit. That text can have some HTML-like formatting in it. To learn about\nthem, see ",(0,i.jsx)(t.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebVTT_API#webvtt_cues",children:"the documentation"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"WEBVTT\n\n00:01.000 --\x3e 00:04.000\n- Never drink liquid nitrogen.\n\n00:05.000 --\x3e 00:09.000\n- It will perforate your stomach.\n- You could die.\n"})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>l});var i=n(6540);const s={},r=i.createContext(s);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/28bd9d7a.26846548.js b/assets/js/28bd9d7a.26846548.js deleted file mode 100644 index 8366368a7..000000000 --- a/assets/js/28bd9d7a.26846548.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[888],{1849:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>n,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var o=i(4848),s=i(8453);const r={title:"FFMetrics",sidebar_position:8},n="FFMetrics",a={id:"utilities/FFMetrics",title:"FFMetrics",description:"FFMetrics is a proprietary Windows-only graphical user interface (GUI) for FFmpeg that allows you to calculate and visualize video quality metric results with graphs. PSNR, SSIM, and VMAF are the only options.",source:"@site/docs/utilities/FFMetrics.mdx",sourceDirName:"utilities",slug:"/utilities/FFMetrics",permalink:"/docs/utilities/FFMetrics",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/FFMetrics.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"FFMetrics",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"NMKODER",permalink:"/docs/utilities/nmkoder"},next:{title:"dovi_tool",permalink:"/docs/utilities/dovi_tool"}},c={},l=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"ffmetrics",children:"FFMetrics"})}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"/img/ffmetrics.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"/img/ffmetrics.webp",alt:"FFmetrics Window"})]}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)(t.p,{children:"FFMetrics is a proprietary Windows-only graphical user interface (GUI) for FFmpeg that allows you to calculate and visualize video quality metric results with graphs. PSNR, SSIM, and VMAF are the only options."}),"\n",(0,o.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(t.admonition,{type:"caution",children:(0,o.jsxs)(t.p,{children:["You need to have FFmpeg in your system PATH in order to use this. and ",(0,o.jsx)(t.code,{children:"--enable-libvmaf"})," is required for VMAF calculation support."]})}),"\n",(0,o.jsxs)(t.p,{children:["Download the program from their GitHub homepage ",(0,o.jsx)(t.a,{href:"https://github.com/fifonik/FFMetrics/releases",children:"releases"}),", pick whichever version you'd like to download and extract to your preferred folder.\nRun the exe file to launch."]}),"\n",(0,o.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(t.p,{children:'Use the "Browse" button to insert your reference (source) video and "Add files" to add your distorted (encoded) video(s). Tick the checkboxes to choose the metric calculations you\'d like to run.\nCustom VMAF models can be chosen via "VMAF options" and once you\'re done just click "Start", the program will automatically generate graphs live for each score.'}),"\n",(0,o.jsx)(t.p,{children:"Depending on your CPU. This process might take a while."})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>n,x:()=>a});var o=i(6540);const s={},r=o.createContext(s);function n(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:n(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/28bd9d7a.e2593808.js b/assets/js/28bd9d7a.e2593808.js new file mode 100644 index 000000000..9b87878d7 --- /dev/null +++ b/assets/js/28bd9d7a.e2593808.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[888],{6945:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>n,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"utilities/FFMetrics","title":"FFMetrics","description":"FFMetrics is a proprietary Windows-only graphical user interface (GUI) for FFmpeg that allows you to calculate and visualize video quality metric results with graphs. PSNR, SSIM, and VMAF are the only options.","source":"@site/docs/utilities/FFMetrics.mdx","sourceDirName":"utilities","slug":"/utilities/FFMetrics","permalink":"/docs/utilities/FFMetrics","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/FFMetrics.mdx","tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"title":"FFMetrics","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"NMKODER","permalink":"/docs/utilities/nmkoder"},"next":{"title":"dovi_tool","permalink":"/docs/utilities/dovi_tool"}}');var s=i(4848),r=i(8453);const n={title:"FFMetrics",sidebar_position:8},a="FFMetrics",c={},l=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"ffmetrics",children:"FFMetrics"})}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"/img/ffmetrics.avif",type:"image/avif"}),(0,s.jsx)("img",{src:"/img/ffmetrics.webp",alt:"FFmetrics Window"})]}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)(t.p,{children:"FFMetrics is a proprietary Windows-only graphical user interface (GUI) for FFmpeg that allows you to calculate and visualize video quality metric results with graphs. PSNR, SSIM, and VMAF are the only options."}),"\n",(0,s.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(t.admonition,{type:"caution",children:(0,s.jsxs)(t.p,{children:["You need to have FFmpeg in your system PATH in order to use this. and ",(0,s.jsx)(t.code,{children:"--enable-libvmaf"})," is required for VMAF calculation support."]})}),"\n",(0,s.jsxs)(t.p,{children:["Download the program from their GitHub homepage ",(0,s.jsx)(t.a,{href:"https://github.com/fifonik/FFMetrics/releases",children:"releases"}),", pick whichever version you'd like to download and extract to your preferred folder.\nRun the exe file to launch."]}),"\n",(0,s.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(t.p,{children:'Use the "Browse" button to insert your reference (source) video and "Add files" to add your distorted (encoded) video(s). Tick the checkboxes to choose the metric calculations you\'d like to run.\nCustom VMAF models can be chosen via "VMAF options" and once you\'re done just click "Start", the program will automatically generate graphs live for each score.'}),"\n",(0,s.jsx)(t.p,{children:"Depending on your CPU. This process might take a while."})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>n,x:()=>a});var o=i(6540);const s={},r=o.createContext(s);function n(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:n(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/299beccc.bd5fb890.js b/assets/js/299beccc.bd5fb890.js new file mode 100644 index 000000000..3f71a111d --- /dev/null +++ b/assets/js/299beccc.bd5fb890.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5479],{9511:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"data/7z","title":"7z","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/data/7z.mdx","sourceDirName":"data","slug":"/data/7z","permalink":"/docs/data/7z","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/7z.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"7z","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"bzip2","permalink":"/docs/data/bzip2"},"next":{"title":"xz","permalink":"/docs/data/xz"}}');var o=i(4848),n=i(8453);const r={title:"7z",sidebar_position:4},a="7-zip (7z)",c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"7-zip-7z",children:"7-zip (7z)"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(t.p,{children:["7-zip (7z) is a file format that supports several different data compression, encryption, & pre-processing algorithms. It was introduced by the 7-Zip archiver, which is free and open-source software for dealing with various data compression formats including formats similar to 7z like ",(0,o.jsx)(t.a,{href:"/docs/data/xz",children:"XZ"}),"."]}),"\n",(0,o.jsxs)(t.p,{children:["The 7-zip format has some noteworthy advantages over the popular ",(0,o.jsx)(t.a,{href:"/docs/data/zip",children:"ZIP"})," format."]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:'The 7-zip utility can compress files to the 7z format "30-70% better" than to ZIP format despite having a highly efficient ZIP encoder. It mainly uses the LZMA & LZMA2 algorithms, which are more modern than DEFLATE and usually compress better.'}),"\n",(0,o.jsx)(t.li,{children:"7-zip can encrypt files with AES-256 using a user provided password. AES-256 is more secure than the ZipCrypto encryption often used by ZIP."}),"\n",(0,o.jsx)(t.li,{children:"7-zip can support files up to 16 exabytes in size, while traditional ZIP has a 4 GB limit (ZIP64, which is commonly used, does not suffer from this 4 GB limitation so this is less relevant now). 7-zip also supports various pre-processing filters, which can improve compression for certain types of data like executables and binaries."}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"However, 7-zip also has some drawbacks and limitations."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"7-zip is not as widely supported as ZIP by other software and platforms. Some users may need to install additional programs or plugins to open or extract 7z files."}),"\n",(0,o.jsx)(t.li,{children:"Slower speed: 7-zip archives may take longer to compress or decompress compared to ZIP. This is somewhat mitigated by the 7-zip utility's effective parallelization when decoding, but this only affects real time as opposed to user time meaning it is still likely going to be more expensive to decompress than ZIP."}),"\n",(0,o.jsx)(t.li,{children:"7-zip does not have any built-in mechanism to repair corrupted or damaged archives. Users may need to use third-party tools or backup copies to recover their data1"}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"7z archives are supported natively by macOS & many Linux distributions."})]})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var s=i(6540);const o={},n=s.createContext(o);function r(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/299beccc.de7d8920.js b/assets/js/299beccc.de7d8920.js deleted file mode 100644 index 3c6343530..000000000 --- a/assets/js/299beccc.de7d8920.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5479],{1531:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>n,metadata:()=>a,toc:()=>d});var s=i(4848),o=i(8453);const n={title:"7z",sidebar_position:4},r="7-zip (7z)",a={id:"data/7z",title:"7z",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/7z.mdx",sourceDirName:"data",slug:"/data/7z",permalink:"/docs/data/7z",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/7z.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"7z",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"bzip2",permalink:"/docs/data/bzip2"},next:{title:"xz",permalink:"/docs/data/xz"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"7-zip-7z",children:"7-zip (7z)"})}),"\n",(0,s.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(t.p,{children:["7-zip (7z) is a file format that supports several different data compression, encryption, & pre-processing algorithms. It was created by the 7-Zip archiver, which is free and open-source software for dealing with various data compression formats including formats similar to 7z like ",(0,s.jsx)(t.a,{href:"/docs/data/xz",children:"XZ"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["The 7-zip format has some noteworthy advantages over the popular ",(0,s.jsx)(t.a,{href:"/docs/data/zip",children:"ZIP"})," format."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:'The 7-zip utility can compress files to the 7z format "30-70% better" than to ZIP format despite having a highly efficient ZIP encoder. It mainly uses the LZMA & LZMA2 algorithms, which are more modern than DEFLATE and usually compress better.'}),"\n",(0,s.jsx)(t.li,{children:"7-zip can encrypt files with AES-256 using a user provided password. AES-256 is more secure than the ZipCrypto encryption often used by ZIP."}),"\n",(0,s.jsx)(t.li,{children:"7-zip can support files up to 16 exabytes in size, while traditional ZIP has a 4 GB limit (ZIP64, which is commonly used, does not suffer from this 4 GB limitation so this is less relevant now). 7-zip also supports various pre-processing filters, which can improve compression for certain types of data like executables and binaries."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"However, 7-zip also has some drawbacks and limitations."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"7-zip is not as widely supported as ZIP by other software and platforms. Some users may need to install additional programs or plugins to open or extract 7z files."}),"\n",(0,s.jsx)(t.li,{children:"Slower speed: 7-zip archives may take longer to compress or decompress compared to ZIP. This is somewhat mitigated by the 7-zip utility's effective parallelization when decoding, but this only affects real time as opposed to user time meaning it is still likely going to be more expensive to decompress than ZIP."}),"\n",(0,s.jsx)(t.li,{children:"7-zip does not have any built-in mechanism to repair corrupted or damaged archives. Users may need to use third-party tools or backup copies to recover their data1"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"7z archives are supported natively by macOS & many Linux distributions."})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var s=i(6540);const o={},n=s.createContext(o);function r(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2d25ac87.12cde25d.js b/assets/js/2d25ac87.12cde25d.js deleted file mode 100644 index 6eb409b4e..000000000 --- a/assets/js/2d25ac87.12cde25d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5949],{822:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>n,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>u});var s=t(4848),i=t(8453);const r={title:"autocompressor",sidebar_position:15},n="Autocompressor",a={id:"utilities/autocompressor",title:"autocompressor",description:"Autocompressor is a free online media compression tool by Auto-Rez Media Technologies that compresses videos, images, audio, and GIFs to a target file size. Depending on the file type you upload, it will be handled differently such that the result serves a similar function to what you uploaded. For example, videos are transcoded to videos, audio files to audio files, images to images, and animations to animations.",source:"@site/docs/utilities/autocompressor.mdx",sourceDirName:"utilities",slug:"/utilities/autocompressor",permalink:"/docs/utilities/autocompressor",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/autocompressor.mdx",tags:[],version:"current",sidebarPosition:15,frontMatter:{title:"autocompressor",sidebar_position:15},sidebar:"tutorialSidebar",previous:{title:"av1an-command-gen",permalink:"/docs/utilities/av1an-command-gen"},next:{title:"PSNR",permalink:"/docs/metrics/PSNR"}},c={},u=[];function d(e){const o={a:"a",blockquote:"blockquote",h1:"h1",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"autocompressor",children:"Autocompressor"})}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.a,{href:"https://autocompressor.net/",children:"Autocompressor"})," is a free online media compression tool by Auto-Rez Media Technologies that compresses videos, images, audio, and GIFs to a target file size. Depending on the file type you upload, it will be handled differently such that the result serves a similar function to what you uploaded. For example, videos are transcoded to videos, audio files to audio files, images to images, and animations to animations."]}),"\n",(0,s.jsx)(o.p,{children:"From their site:"}),"\n",(0,s.jsxs)(o.blockquote,{children:["\n",(0,s.jsx)(o.p,{children:"Reduce the file size of your video, image, audio, or GIF quickly and easily with our free online compression tool. Whether you need to shrink your file to 25MB or any other specific size, our tool offers a simple and intuitive solution. We'll also create perfectly compressed emotes and stickers for Discord. Using the link mode, you can instantly compress YouTube videos and other sites to 25MB. Our advanced AUTO-REZ\u2122 technology achieves higher quality at a given filesize than any other website. Autocompressor will automatically choose the output format based on the input format and the compatibility category you select."}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"Autocompressor also plans to offer a premium service in the future where the cost is determined by the CPU minutes used during the operation as well as the compression effort tier. For instance, encoding a typical 4-minute YouTube video to 8MB with MP4-Normal will cost about 5 CPU minutes."}),"\n",(0,s.jsx)(o.p,{children:"Users can create an account to get 1800 CPU minutes free. The site ensures high security for user data by using BCrypt hashes to store passwords."}),"\n",(0,s.jsxs)(o.p,{children:["You can read more on their ",(0,s.jsx)(o.a,{href:"https://autocompressor.net/about",children:"About page"}),"."]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>n,x:()=>a});var s=t(6540);const i={},r=s.createContext(i);function n(e){const o=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),s.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2d25ac87.ad88e0da.js b/assets/js/2d25ac87.ad88e0da.js new file mode 100644 index 000000000..b99ddd3c7 --- /dev/null +++ b/assets/js/2d25ac87.ad88e0da.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5949],{7765:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"utilities/autocompressor","title":"autocompressor","description":"Autocompressor is a free online media compression tool by Auto-Rez Media Technologies that compresses videos, images, audio, and GIFs to a target file size. Depending on the file type you upload, it will be handled differently such that the result serves a similar function to what you uploaded. For example, videos are transcoded to videos, audio files to audio files, images to images, and animations to animations.","source":"@site/docs/utilities/autocompressor.mdx","sourceDirName":"utilities","slug":"/utilities/autocompressor","permalink":"/docs/utilities/autocompressor","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/autocompressor.mdx","tags":[],"version":"current","sidebarPosition":15,"frontMatter":{"title":"autocompressor","sidebar_position":15},"sidebar":"tutorialSidebar","previous":{"title":"av1an-command-gen","permalink":"/docs/utilities/av1an-command-gen"},"next":{"title":"PSNR","permalink":"/docs/metrics/PSNR"}}');var i=t(4848),r=t(8453);const n={title:"autocompressor",sidebar_position:15},a="Autocompressor",c={},u=[];function l(e){const o={a:"a",blockquote:"blockquote",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"autocompressor",children:"Autocompressor"})}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.a,{href:"https://autocompressor.net/",children:"Autocompressor"})," is a free online media compression tool by Auto-Rez Media Technologies that compresses videos, images, audio, and GIFs to a target file size. Depending on the file type you upload, it will be handled differently such that the result serves a similar function to what you uploaded. For example, videos are transcoded to videos, audio files to audio files, images to images, and animations to animations."]}),"\n",(0,i.jsx)(o.p,{children:"From their site:"}),"\n",(0,i.jsxs)(o.blockquote,{children:["\n",(0,i.jsx)(o.p,{children:"Reduce the file size of your video, image, audio, or GIF quickly and easily with our free online compression tool. Whether you need to shrink your file to 25MB or any other specific size, our tool offers a simple and intuitive solution. We'll also create perfectly compressed emotes and stickers for Discord. Using the link mode, you can instantly compress YouTube videos and other sites to 25MB. Our advanced AUTO-REZ\u2122 technology achieves higher quality at a given filesize than any other website. Autocompressor will automatically choose the output format based on the input format and the compatibility category you select."}),"\n"]}),"\n",(0,i.jsx)(o.p,{children:"Autocompressor also plans to offer a premium service in the future where the cost is determined by the CPU minutes used during the operation as well as the compression effort tier. For instance, encoding a typical 4-minute YouTube video to 8MB with MP4-Normal will cost about 5 CPU minutes."}),"\n",(0,i.jsx)(o.p,{children:"Users can create an account to get 1800 CPU minutes free. The site ensures high security for user data by using BCrypt hashes to store passwords."}),"\n",(0,i.jsxs)(o.p,{children:["You can read more on their ",(0,i.jsx)(o.a,{href:"https://autocompressor.net/about",children:"About page"}),"."]})]})}function d(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>n,x:()=>a});var s=t(6540);const i={},r=s.createContext(i);function n(e){const o=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),s.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2e23a845.60b30d51.js b/assets/js/2e23a845.60b30d51.js new file mode 100644 index 000000000..de29041f8 --- /dev/null +++ b/assets/js/2e23a845.60b30d51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5147],{7126:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>m,frontMatter:()=>o,metadata:()=>t,toc:()=>h});const t=JSON.parse('{"id":"encoders/SVT-AV1-PSY","title":"SVT-AV1-PSY","description":"This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you\'d like to learn about the mainline SVT-AV1 encoder before reading, visit our SVT-AV1 wiki entry.","source":"@site/docs/encoders/SVT-AV1-PSY.mdx","sourceDirName":"encoders","slug":"/encoders/SVT-AV1-PSY","permalink":"/docs/encoders/SVT-AV1-PSY","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1-PSY.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"SVT-AV1-PSY","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"aomenc","permalink":"/docs/encoders/aomenc"},"next":{"title":"SVT-AV1","permalink":"/docs/encoders/SVT-AV1"}}');var r=i(4848),a=i(8453),s=i(1470),l=i(9365);const o={title:"SVT-AV1-PSY",sidebar_position:5},c="SVT-AV1-PSY",d={},h=[{value:"Micro-Release Framework",id:"micro-release-framework",level:2},{value:"Feature Additions",id:"feature-additions",level:2},{value:"Modified Defaults",id:"modified-defaults",level:2},{value:"Other Changes",id:"other-changes",level:3},{value:"Installation",id:"installation",level:2},{value:"Projects Featuring SVT-AV1-PSY",id:"projects-featuring-svt-av1-psy",level:2},{value:"License",id:"license",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"svt-av1-psy",children:"SVT-AV1-PSY"})}),"\n",(0,r.jsx)(n.admonition,{title:"Community Fork",type:"info",children:(0,r.jsxs)(n.p,{children:["This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you'd like to learn about the mainline SVT-AV1 encoder before reading, visit our ",(0,r.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1 wiki entry"}),"."]})}),"\n",(0,r.jsx)(n.p,{children:"SVT-AV1-PSY is a project that aims to enhance the Scalable Video Technology for AV1 Encoder with perceptual enhancements for psychovisually optimal AV1 encoding. The ultimate goal is to create the best encoding implementation for perceptual quality with AV1. The development of this project involves a collaborative effort from a team of dedicated developers and contributors who are committed to improving the perceptual quality of AV1 encoding."}),"\n",(0,r.jsxs)(n.p,{children:["The SVT-AV1-PSY project is maintained by ",(0,r.jsx)(n.a,{href:"https://github.com/gianni-rosato",children:"Gianni Rosato"}),", ",(0,r.jsx)(n.a,{href:"https://github.com/juliobbv",children:"Julio Barba"}),", & ",(0,r.jsx)(n.a,{href:"https://github.com/Clybius",children:"Clybius"}),", as well as a number of community contributors including ",(0,r.jsx)(n.a,{href:"https://github.com/BlueSwordM",children:"BlueSwordM"}),", the maintainer of the ",(0,r.jsx)(n.a,{href:"https://aur.archlinux.org/packages/svt-av1-psy-git",children:"SVT-AV1-PSY AUR package"})," & the original author of ",(0,r.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The development process involves community testing and optimization to ensure that the encoder and decoder deliver optimal performance. The team uses a variety of tools and methodologies to analyze and improve the performance of the encoder and decoder, including subjective analyses. ",(0,r.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," and ",(0,r.jsx)(n.a,{href:"/docs/metrics/XPSNR",children:"XPSNR"})," are used extensively for metrics testing, and the team is committed to improving the overall quality and performance of the encoder using these two metrics as general guidelines and benchmarks. However, the stated goal is not to improve metric scores but to improve the overall perceptual quality of the encoder; naturally, changes are often made to SVT-AV1-PSY that end up degrading metric performance in favor of perceptual fidelity per bit."]}),"\n",(0,r.jsx)(n.p,{children:"SVT-AV1-PSY is a superset of SVT-AV1, meaning any valid SVT-AV1 command will work with SVT-AV1-PSY given the modified defaults do not conflict with the settings provided."}),"\n",(0,r.jsxs)(n.p,{children:["SVT-AV1-PSY is used by default in ",(0,r.jsx)(n.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," and can be used in ",(0,r.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," by using the pre-compiled binaries available with the tool or by building a binary yourself."]}),"\n",(0,r.jsx)(n.p,{children:"SVT-AV1-PSY contributors are not in any way affiliated with the Alliance for Open Media or any upstream SVT-AV1 project contributors who have not also contributed to the SVT-AV1-PSY project."}),"\n",(0,r.jsx)(n.h2,{id:"micro-release-framework",children:"Micro-Release Framework"}),"\n",(0,r.jsx)(n.p,{children:"SVT-AV1-PSY features additions outside of mainline SVT-AV1 that are often considered to be significant, but don't line up with a major mainline release. Therefore, the SVT-AV1-PSY release framework is different, and the encoder is currently being developed around micro-releases to make this clear."}),"\n",(0,r.jsxs)(n.p,{children:["Micro-releases are tagged with letters starting at ",(0,r.jsx)(n.code,{children:"A"})," to indicate that they contain significant new features and aren't equivalent to mainline releases; for example, ",(0,r.jsx)(n.code,{children:"v2.0.0-A"})," was a micro-release with significant new features exclusive to SVT-AV1-PSY that followed the prior ",(0,r.jsx)(n.code,{children:"v2.0.0"})," release (which came out with PSY + mainline features in tandem with mainline ",(0,r.jsx)(n.code,{children:"v2.0.0"}),"). Releases without letters are in-line with mainline SVT-AV1 releases, and may contain significant PSY feature additions as well."]}),"\n",(0,r.jsx)(n.h2,{id:"feature-additions",children:"Feature Additions"}),"\n",(0,r.jsx)(n.p,{children:"SVT-AV1-PSY includes a number of new features that are not present in mainline SVT-AV1. These features are designed to improve the visual quality of AV1 encodes, and offer more flexibility when configuring the encoder for a wide range of encoding scenarios. Many of these changes are being integrated into mainline SVT-AV1 as the project matures."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"--variance-boost-strength"})," ",(0,r.jsx)(n.em,{children:"1 to 4"})," (",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/merge_requests/2195",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Provides control over our augmented AQ Modes 0 and 2 which can utilize variance information in each frame for more consistent quality under high/low contrast scenes. Four curve options are provided, and the default is curve 2. 1: mild, 2: gentle, 3: medium, 4: aggressive"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"--variance-octile"})," ",(0,r.jsx)(n.em,{children:"1 to 8"})," (",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/merge_requests/2195",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:['Controls how "selective" the algorithm is when boosting superblocks, based on their low/high 8x8 variance ratio. A value of 1 is the least selective, and will readily boost a superblock if only 1/8th of the superblock is low variance. Conversely, a value of 8 will only boost if the ',(0,r.jsx)(n.em,{children:"entire"})," superblock is low variance. Lower values increase bitrate. The default value is 6."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"--enable-alt-curve"})," ",(0,r.jsx)(n.em,{children:"0 and 1"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Enable an alternative variance boost curve, with different bit allocation and visual characteristics. The default is 0."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"Presets -2 & -3"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Terrifically slow encoding modes for research purposes."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"Tune 3"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"A new tune based on Tune 2 (SSIM) called SSIM with Subjective Quality Tuning. Generally harms metric performance in exchange for better visual fidelity."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"--sharpness"})," ",(0,r.jsx)(n.em,{children:"-7 to 7"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"A parameter for modifying loopfilter deblock sharpness and rate distortion to improve visual fidelity. The default is 0 (no sharpness)."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"--dolby-vision-rpu"})," ",(0,r.jsx)(n.em,{children:"path to file"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Set the path to a Dolby Vision RPU for encoding Dolby Vision video. SVT-AV1-PSY needs to be built with the ",(0,r.jsx)(n.code,{children:"enable-libdovi"})," flag enabled in build.sh (see ",(0,r.jsx)(n.code,{children:"./Build/linux/build.sh --help"})," for more info) (Thank you @quietvoid !)"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"Progress 3"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"A new progress mode that provides more detailed information about the encoding process."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"--fgs-table"})," ",(0,r.jsx)(n.em,{children:"path to file"})," (",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/ae7ce1abc5f3f7913624f728ae123f8b8c1e30de",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Argument for providing a film grain table for synthetic film grain (similar to aomenc's '--film-grain-table=' argument)."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"Extended CRF"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Provides a more versatile and granular way to set CRF. Range has been expanded to 70 (from 63) to help with ultra-low bitrate encodes, and can now be set in quarter-step (0.25) increments."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"--qp-scale-compress-strength"})," ",(0,r.jsx)(n.em,{children:"0 to 3"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Increases video quality temporal consistency, especially with clips that contain film grain and/or contain fast-moving objects."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"--enable-dlf 2"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Enables a more accurate loop filter that prevents blocking, for a modest increase in compute time (most noticeable at presets 7 to 9)"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"Higher-quality presets for 8K"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Lowers the minimum available preset from 8 to 2 for higher-quality 8K encoding (64 GB of RAM recommended per encoding instance)"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"--frame-luma-bias"})," ",(0,r.jsx)(n.em,{children:"0 to 100"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Enables frame-level luma bias to improve quality in dark scenes by adjusting frame-level QP based on average luminance across each frame"}),"\n",(0,r.jsx)(n.h2,{id:"modified-defaults",children:"Modified Defaults"}),"\n",(0,r.jsx)(n.p,{children:"SVT-AV1-PSY has different defaults than mainline SVT-AV1 in order to provide better visual fidelity out of the box. They include:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Default 10-bit color depth when given a 10-bit input."}),"\n",(0,r.jsxs)(n.li,{children:["Disable film grain denoising by default, as it often harms visual fidelity. (",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/8b39b41df9e07bbcdbd19ea618762c5db3353c03",children:"Merged to Mainline"})}),")"]}),"\n",(0,r.jsx)(n.li,{children:"Default to Tune 2 instead of Tune 1, as it reliably outperforms Tune 1 perceptually."}),"\n",(0,r.jsx)(n.li,{children:"Enable quantization matrices by default."}),"\n",(0,r.jsx)(n.li,{children:"Set minimum QM level to 0 by default."}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"--enable-variance-boost"})," enabled by default."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"other-changes",children:"Other Changes"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"--color-help"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Prints the information found in Appendix A.2 of the user guide in order to help users more easily understand the Color Description Options in SvtAv1EncApp."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"Micro-Releases"})}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["In order to make SVT-AV1-PSY feature additions more clear, micro-release tags indicate when significant new feature additions have been made. Micro-release tags are letters starting with ",(0,r.jsx)(n.code,{children:"A"}),", so new releases will be tagged as ",(0,r.jsx)(n.code,{children:"v#.#.#-A"}),", ",(0,r.jsx)(n.code,{children:"v#.#.#-B"}),", etc. This is discussed earlier in this entry."]}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.p,{children:"Building & installing SVT-AV1-PSY is the same as building & installing mainline SVT-AV1."}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsxs)(l.A,{value:"unixlike",label:"Linux & macOS",children:[(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["A precompiled AVX2-optimized binary of SVT-AV1-PSY can be installed for x86_64 Linux via ",(0,r.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,r.jsx)(n.p,{children:"To build SVT-AV1 from source, first clone the desired SVT-AV1 repository & enter the build directory."}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd svt-av1-psy/Build/linux\n"})}),(0,r.jsxs)(n.p,{children:["In the directory, simply run ",(0,r.jsx)(n.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use Clang."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,r.jsxs)(n.p,{children:["The compiled binaries will be in the ",(0,r.jsx)(n.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,r.jsx)(n.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,r.jsxs)(n.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 23 May 2024) please run ",(0,r.jsx)(n.code,{children:"git reset --hard 5471bd78311d70ab4691af1ae54fd80e25f214f5"})," in the cloned directory. It is recommended that you do this, as new changes to git aren't always stable right away & a release will guarantee more stability."]}),(0,r.jsxs)(n.p,{children:["If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,r.jsxs)(n.strong,{children:["Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,r.jsx)(n.code,{children:"/dev/shm"})," for transcoding"]}),". You can compile statically linked SVT-AV1 with PGO (and LTO, or link-time optimization) by following this script:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Bulding SVT-AV1 with profile guided optimization"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n"})}),(0,r.jsx)(n.p,{children:"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n"})})]}),(0,r.jsxs)(l.A,{value:"windows",label:"Windows",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"MSYS2"})," is the best option for building in Windows, as it provides a Unix-like environment for building SVT-AV1-PSY. This makes the compilation procedure the same as described for Linux & macOS. The full build process is detailed here."]}),(0,r.jsxs)(n.ol,{start:"0",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,r.jsx)(n.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Start the UCRT64 console & install the required dependencies:"}),"\n"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"pacman -Syu --needed git mingw-w64-ucrt-x86_64-toolchain mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja mingw-w64-ucrt-x86_64-yasm\n"})}),(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsx)(n.li,{children:"[Optional] Clang is the recommended compiler for SVT-AV1 & SVT-AV1-PSY, so you may wish to download it with the following command:"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"pacman -Syu --needed mingw-w64-ucrt-x86_64-clang\n"})}),(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsxs)(n.li,{children:["Now, we may follow the steps for Linux & macOS to complete building. Please note that CMake may require you to include ",(0,r.jsx)(n.code,{children:'-G "Ninja"'})," in any CMake commands."]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd SVT-AV1/Build/linux\n"})}),(0,r.jsxs)(n.p,{children:["In the directory, simply run ",(0,r.jsx)(n.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use Clang, and ideally it will be installed as per Step 2."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,r.jsxs)(n.p,{children:["The compiled binaries will be in the ",(0,r.jsx)(n.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,r.jsx)(n.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,r.jsxs)(n.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 23 May 2024) please run ",(0,r.jsx)(n.code,{children:"git reset --hard 5471bd78311d70ab4691af1ae54fd80e25f214f5"})," in the cloned directory."]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"projects-featuring-svt-av1-psy",children:"Projects Featuring SVT-AV1-PSY"}),"\n",(0,r.jsx)(n.p,{children:"Some projects that feature SVT-AV1-PSY include:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," ~ an AV1 encoding GUI by @gianni-rosato"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," ~ a TUI for video encoding with Av1an by @gianni-rosato"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://aur.archlinux.org/packages/svt-av1-psy-git",children:"SVT-AV1-PSY on the AUR"})," ~ by @BlueSwordM"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/CachyOS/CachyOS-PKGBUILDS/pull/144",children:"SVT-AV1-PSY in CachyOS"})," ~ by @BlueSwordM"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/vincejv/docker-handbrake",children:"Custom Handbrake Builds"})," ~ by @vincejv"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/staxrip/staxrip",children:"Staxrip"})," ~ a video & audio encoding GUI for Windows by @Dendraspis"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"license",children:"License"}),"\n",(0,r.jsx)(n.p,{children:"Up to v0.8.7, SVT-AV1 is licensed under the BSD-2-clause license and the\nAlliance for Open Media Patent License 1.0. Starting from v0.9, SVT-AV1 is licensed\nunder the BSD-3-clause clear license and the Alliance for Open Media Patent\nLicense 1.0."}),"\n",(0,r.jsx)(n.p,{children:"SVT-AV1-PSY does not feature license modifications from mainline SVT-AV1."})]})}function m(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>s});i(6540);var t=i(4164);const r={tabItem:"tabItem_Ymn6"};var a=i(4848);function s(e){let{children:n,hidden:i,className:s}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,s),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>S});var t=i(6540),r=i(4164),a=i(3104),s=i(6347),l=i(205),o=i(7485),c=i(1682),d=i(679);function h(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:t,default:r}}=e;return{value:n,label:i,attributes:t,default:r}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const r=(0,s.W6)(),a=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(a),(0,t.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})}),[a,r])]}function f(e){const{defaultValue:n,queryString:i=!1,groupId:r}=e,a=u(e),[s,o]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=i.find((e=>e.default))??i[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a}))),[c,h]=p({queryString:i,groupId:r}),[f,g]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,a]=(0,d.Dv)(i);return[r,(0,t.useCallback)((e=>{i&&a.set(e)}),[i,a])]}({groupId:r}),b=(()=>{const e=c??f;return m({value:e,tabValues:a})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:s,selectValue:(0,t.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),g(e)}),[h,g,a]),tabValues:a}}var g=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function j(e){let{className:n,block:i,selectedValue:t,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),r=l[i].value;r!==t&&(c(n),s(r))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:a}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...a,className:(0,r.A)("tabs__item",b.tabItem,a?.className,{"tabs__item--active":t===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:a}=e;const s=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===a));return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==a})))})}function V(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",b.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function S(e){const n=(0,g.A)();return(0,x.jsx)(V,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>l});var t=i(6540);const r={},a=t.createContext(r);function s(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2e23a845.996efb55.js b/assets/js/2e23a845.996efb55.js deleted file mode 100644 index 8833091b5..000000000 --- a/assets/js/2e23a845.996efb55.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5147],{2914:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>h});var t=i(4848),r=i(8453),a=i(1470),s=i(9365);const l={title:"SVT-AV1-PSY",sidebar_position:5},o="SVT-AV1-PSY",c={id:"encoders/SVT-AV1-PSY",title:"SVT-AV1-PSY",description:"This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you'd like to learn about the mainline SVT-AV1 encoder before reading, visit our SVT-AV1 wiki entry.",source:"@site/docs/encoders/SVT-AV1-PSY.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-AV1-PSY",permalink:"/docs/encoders/SVT-AV1-PSY",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1-PSY.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"SVT-AV1-PSY",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"aomenc",permalink:"/docs/encoders/aomenc"},next:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"}},d={},h=[{value:"Micro-Release Framework",id:"micro-release-framework",level:2},{value:"Feature Additions",id:"feature-additions",level:2},{value:"Modified Defaults",id:"modified-defaults",level:2},{value:"Other Changes",id:"other-changes",level:3},{value:"Installation",id:"installation",level:2},{value:"Projects Featuring SVT-AV1-PSY",id:"projects-featuring-svt-av1-psy",level:2},{value:"License",id:"license",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"svt-av1-psy",children:"SVT-AV1-PSY"})}),"\n",(0,t.jsx)(n.admonition,{title:"Community Fork",type:"info",children:(0,t.jsxs)(n.p,{children:["This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you'd like to learn about the mainline SVT-AV1 encoder before reading, visit our ",(0,t.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1 wiki entry"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY is a project that aims to enhance the Scalable Video Technology for AV1 Encoder with perceptual enhancements for psychovisually optimal AV1 encoding. The ultimate goal is to create the best encoding implementation for perceptual quality with AV1. The development of this project involves a collaborative effort from a team of dedicated developers and contributors who are committed to improving the perceptual quality of AV1 encoding."}),"\n",(0,t.jsxs)(n.p,{children:["The SVT-AV1-PSY project is maintained by ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato",children:"Gianni Rosato"}),", ",(0,t.jsx)(n.a,{href:"https://github.com/juliobbv",children:"Julio Barba"}),", & ",(0,t.jsx)(n.a,{href:"https://github.com/Clybius",children:"Clybius"}),", as well as a number of community contributors including ",(0,t.jsx)(n.a,{href:"https://github.com/BlueSwordM",children:"BlueSwordM"}),", the maintainer of the ",(0,t.jsx)(n.a,{href:"https://aur.archlinux.org/packages/svt-av1-psy-git",children:"SVT-AV1-PSY AUR package"})," & the original author of ",(0,t.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The development process involves community testing and optimization to ensure that the encoder and decoder deliver optimal performance. The team uses a variety of tools and methodologies to analyze and improve the performance of the encoder and decoder, including subjective analyses. ",(0,t.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," and ",(0,t.jsx)(n.a,{href:"/docs/metrics/XPSNR",children:"XPSNR"})," are used extensively for metrics testing, and the team is committed to improving the overall quality and performance of the encoder using these two metrics as general guidelines and benchmarks. However, the stated goal is not to improve metric scores but to improve the overall perceptual quality of the encoder; naturally, changes are often made to SVT-AV1-PSY that end up degrading metric performance in favor of perceptual fidelity per bit."]}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY is a superset of SVT-AV1, meaning any valid SVT-AV1 command will work with SVT-AV1-PSY given the modified defaults do not conflict with the settings provided."}),"\n",(0,t.jsxs)(n.p,{children:["SVT-AV1-PSY is used by default in ",(0,t.jsx)(n.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," and can be used in ",(0,t.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," by using the pre-compiled binaries available with the tool or by building a binary yourself."]}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY contributors are not in any way affiliated with the Alliance for Open Media or any upstream SVT-AV1 project contributors who have not also contributed to the SVT-AV1-PSY project."}),"\n",(0,t.jsx)(n.h2,{id:"micro-release-framework",children:"Micro-Release Framework"}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY features additions outside of mainline SVT-AV1 that are often considered to be significant, but don't line up with a major mainline release. Therefore, the SVT-AV1-PSY release framework is different, and the encoder is currently being developed around micro-releases to make this clear."}),"\n",(0,t.jsxs)(n.p,{children:["Micro-releases are tagged with letters starting at ",(0,t.jsx)(n.code,{children:"A"})," to indicate that they contain significant new features and aren't equivalent to mainline releases; for example, ",(0,t.jsx)(n.code,{children:"v2.0.0-A"})," was a micro-release with significant new features exclusive to SVT-AV1-PSY that followed the prior ",(0,t.jsx)(n.code,{children:"v2.0.0"})," release (which came out with PSY + mainline features in tandem with mainline ",(0,t.jsx)(n.code,{children:"v2.0.0"}),"). Releases without letters are in-line with mainline SVT-AV1 releases, and may contain significant PSY feature additions as well."]}),"\n",(0,t.jsx)(n.h2,{id:"feature-additions",children:"Feature Additions"}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY includes a number of new features that are not present in mainline SVT-AV1. These features are designed to improve the visual quality of AV1 encodes, and offer more flexibility when configuring the encoder for a wide range of encoding scenarios. Many of these changes are being integrated into mainline SVT-AV1 as the project matures."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--variance-boost-strength"})," ",(0,t.jsx)(n.em,{children:"1 to 4"})," (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/merge_requests/2195",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Provides control over our augmented AQ Modes 0 and 2 which can utilize variance information in each frame for more consistent quality under high/low contrast scenes. Four curve options are provided, and the default is curve 2. 1: mild, 2: gentle, 3: medium, 4: aggressive"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--variance-octile"})," ",(0,t.jsx)(n.em,{children:"1 to 8"})," (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/merge_requests/2195",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:['Controls how "selective" the algorithm is when boosting superblocks, based on their low/high 8x8 variance ratio. A value of 1 is the least selective, and will readily boost a superblock if only 1/8th of the superblock is low variance. Conversely, a value of 8 will only boost if the ',(0,t.jsx)(n.em,{children:"entire"})," superblock is low variance. Lower values increase bitrate. The default value is 6."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--enable-alt-curve"})," ",(0,t.jsx)(n.em,{children:"0 and 1"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Enable an alternative variance boost curve, with different bit allocation and visual characteristics. The default is 0."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Presets -2 & -3"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Terrifically slow encoding modes for research purposes."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Tune 3"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A new tune based on Tune 2 (SSIM) called SSIM with Subjective Quality Tuning. Generally harms metric performance in exchange for better visual fidelity."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--sharpness"})," ",(0,t.jsx)(n.em,{children:"-7 to 7"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A parameter for modifying loopfilter deblock sharpness and rate distortion to improve visual fidelity. The default is 0 (no sharpness)."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--dolby-vision-rpu"})," ",(0,t.jsx)(n.em,{children:"path to file"})]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Set the path to a Dolby Vision RPU for encoding Dolby Vision video. SVT-AV1-PSY needs to be built with the ",(0,t.jsx)(n.code,{children:"enable-libdovi"})," flag enabled in build.sh (see ",(0,t.jsx)(n.code,{children:"./Build/linux/build.sh --help"})," for more info) (Thank you @quietvoid !)"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Progress 3"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A new progress mode that provides more detailed information about the encoding process."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--fgs-table"})," ",(0,t.jsx)(n.em,{children:"path to file"})," (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/ae7ce1abc5f3f7913624f728ae123f8b8c1e30de",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Argument for providing a film grain table for synthetic film grain (similar to aomenc's '--film-grain-table=' argument)."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Extended CRF"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Provides a more versatile and granular way to set CRF. Range has been expanded to 70 (from 63) to help with ultra-low bitrate encodes, and can now be set in quarter-step (0.25) increments."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--qp-scale-compress-strength"})," ",(0,t.jsx)(n.em,{children:"0 to 3"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Increases video quality temporal consistency, especially with clips that contain film grain and/or contain fast-moving objects."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--enable-dlf 2"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Enables a more accurate loop filter that prevents blocking, for a modest increase in compute time (most noticeable at presets 7 to 9)"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Higher-quality presets for 8K"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Lowers the minimum available preset from 8 to 2 for higher-quality 8K encoding (64 GB of RAM recommended per encoding instance)"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--frame-luma-bias"})," ",(0,t.jsx)(n.em,{children:"0 to 100"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Enables frame-level luma bias to improve quality in dark scenes by adjusting frame-level QP based on average luminance across each frame"}),"\n",(0,t.jsx)(n.h2,{id:"modified-defaults",children:"Modified Defaults"}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY has different defaults than mainline SVT-AV1 in order to provide better visual fidelity out of the box. They include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Default 10-bit color depth when given a 10-bit input."}),"\n",(0,t.jsxs)(n.li,{children:["Disable film grain denoising by default, as it often harms visual fidelity. (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/8b39b41df9e07bbcdbd19ea618762c5db3353c03",children:"Merged to Mainline"})}),")"]}),"\n",(0,t.jsx)(n.li,{children:"Default to Tune 2 instead of Tune 1, as it reliably outperforms Tune 1 perceptually."}),"\n",(0,t.jsx)(n.li,{children:"Enable quantization matrices by default."}),"\n",(0,t.jsx)(n.li,{children:"Set minimum QM level to 0 by default."}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--enable-variance-boost"})," enabled by default."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"other-changes",children:"Other Changes"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--color-help"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Prints the information found in Appendix A.2 of the user guide in order to help users more easily understand the Color Description Options in SvtAv1EncApp."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Micro-Releases"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In order to make SVT-AV1-PSY feature additions more clear, micro-release tags indicate when significant new feature additions have been made. Micro-release tags are letters starting with ",(0,t.jsx)(n.code,{children:"A"}),", so new releases will be tagged as ",(0,t.jsx)(n.code,{children:"v#.#.#-A"}),", ",(0,t.jsx)(n.code,{children:"v#.#.#-B"}),", etc. This is discussed earlier in this entry."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"Building & installing SVT-AV1-PSY is the same as building & installing mainline SVT-AV1."}),"\n",(0,t.jsxs)(a.A,{children:[(0,t.jsxs)(s.A,{value:"unixlike",label:"Linux & macOS",children:[(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["A precompiled AVX2-optimized binary of SVT-AV1-PSY can be installed for x86_64 Linux via ",(0,t.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,t.jsx)(n.p,{children:"To build SVT-AV1 from source, first clone the desired SVT-AV1 repository & enter the build directory."}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd svt-av1-psy/Build/linux\n"})}),(0,t.jsxs)(n.p,{children:["In the directory, simply run ",(0,t.jsx)(n.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use Clang."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,t.jsxs)(n.p,{children:["The compiled binaries will be in the ",(0,t.jsx)(n.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,t.jsx)(n.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,t.jsxs)(n.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 23 May 2024) please run ",(0,t.jsx)(n.code,{children:"git reset --hard 5471bd78311d70ab4691af1ae54fd80e25f214f5"})," in the cloned directory. It is recommended that you do this, as new changes to git aren't always stable right away & a release will guarantee more stability."]}),(0,t.jsxs)(n.p,{children:["If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,t.jsxs)(n.strong,{children:["Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,t.jsx)(n.code,{children:"/dev/shm"})," for transcoding"]}),". You can compile statically linked SVT-AV1 with PGO (and LTO, or link-time optimization) by following this script:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Bulding SVT-AV1 with profile guided optimization"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n"})}),(0,t.jsx)(n.p,{children:"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n"})})]}),(0,t.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"MSYS2"})," is the best option for building in Windows, as it provides a Unix-like environment for building SVT-AV1-PSY. This makes the compilation procedure the same as described for Linux & macOS. The full build process is detailed here."]}),(0,t.jsxs)(n.ol,{start:"0",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,t.jsx)(n.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the UCRT64 console & install the required dependencies:"}),"\n"]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pacman -Syu --needed git mingw-w64-ucrt-x86_64-toolchain mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja mingw-w64-ucrt-x86_64-yasm\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"[Optional] Clang is the recommended compiler for SVT-AV1 & SVT-AV1-PSY, so you may wish to download it with the following command:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pacman -Syu --needed mingw-w64-ucrt-x86_64-clang\n"})}),(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsxs)(n.li,{children:["Now, we may follow the steps for Linux & macOS to complete building. Please note that CMake may require you to include ",(0,t.jsx)(n.code,{children:'-G "Ninja"'})," in any CMake commands."]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd SVT-AV1/Build/linux\n"})}),(0,t.jsxs)(n.p,{children:["In the directory, simply run ",(0,t.jsx)(n.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use Clang, and ideally it will be installed as per Step 2."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,t.jsxs)(n.p,{children:["The compiled binaries will be in the ",(0,t.jsx)(n.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,t.jsx)(n.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,t.jsxs)(n.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 23 May 2024) please run ",(0,t.jsx)(n.code,{children:"git reset --hard 5471bd78311d70ab4691af1ae54fd80e25f214f5"})," in the cloned directory."]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"projects-featuring-svt-av1-psy",children:"Projects Featuring SVT-AV1-PSY"}),"\n",(0,t.jsx)(n.p,{children:"Some projects that feature SVT-AV1-PSY include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," ~ an AV1 encoding GUI by @gianni-rosato"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," ~ a TUI for video encoding with Av1an by @gianni-rosato"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://aur.archlinux.org/packages/svt-av1-psy-git",children:"SVT-AV1-PSY on the AUR"})," ~ by @BlueSwordM"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/CachyOS/CachyOS-PKGBUILDS/pull/144",children:"SVT-AV1-PSY in CachyOS"})," ~ by @BlueSwordM"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/vincejv/docker-handbrake",children:"Custom Handbrake Builds"})," ~ by @vincejv"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/staxrip/staxrip",children:"Staxrip"})," ~ a video & audio encoding GUI for Windows by @Dendraspis"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"license",children:"License"}),"\n",(0,t.jsx)(n.p,{children:"Up to v0.8.7, SVT-AV1 is licensed under the BSD-2-clause license and the\nAlliance for Open Media Patent License 1.0. Starting from v0.9, SVT-AV1 is licensed\nunder the BSD-3-clause clear license and the Alliance for Open Media Patent\nLicense 1.0."}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY does not feature license modifications from mainline SVT-AV1."})]})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>s});i(6540);var t=i(4164);const r={tabItem:"tabItem_Ymn6"};var a=i(4848);function s(e){let{children:n,hidden:i,className:s}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,s),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>S});var t=i(6540),r=i(4164),a=i(3104),s=i(6347),l=i(205),o=i(7485),c=i(1682),d=i(679);function h(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:t,default:r}}=e;return{value:n,label:i,attributes:t,default:r}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const r=(0,s.W6)(),a=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(a),(0,t.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})}),[a,r])]}function f(e){const{defaultValue:n,queryString:i=!1,groupId:r}=e,a=u(e),[s,o]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=i.find((e=>e.default))??i[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a}))),[c,h]=p({queryString:i,groupId:r}),[f,g]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,a]=(0,d.Dv)(i);return[r,(0,t.useCallback)((e=>{i&&a.set(e)}),[i,a])]}({groupId:r}),b=(()=>{const e=c??f;return m({value:e,tabValues:a})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:s,selectValue:(0,t.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),g(e)}),[h,g,a]),tabValues:a}}var g=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function j(e){let{className:n,block:i,selectedValue:t,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),r=l[i].value;r!==t&&(c(n),s(r))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:a}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...a,className:(0,r.A)("tabs__item",b.tabItem,a?.className,{"tabs__item--active":t===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:a}=e;const s=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===a));return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==a})))})}function V(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",b.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function S(e){const n=(0,g.A)();return(0,x.jsx)(V,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>l});var t=i(6540);const r={},a=t.createContext(r);function s(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2f08935f.fb7954df.js b/assets/js/2f08935f.fb7954df.js new file mode 100644 index 000000000..0f829f2ad --- /dev/null +++ b/assets/js/2f08935f.fb7954df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2210],{1165:(t,s,e)=>{e.d(s,{Ck:()=>u,kS:()=>h});var a=e(4848),i=e(8453),r=e(6540),n=e(4016),o=e(3517),c=e(3343),p=e(3864),m=e(8633),l=e(363);const u=({imageData:t,pixelsAbove:s,pixelsBelow:e})=>{const r={div:"div",...(0,i.R)()},p=({currentSlide:t,direction:s,slideCount:e,...i})=>"left"===s?(0,a.jsx)(m.A,{...i,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,a.jsx)(l.A,{...i,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!s||s<0)&&(s=0),(!e||e<0)&&(e=0),(0,a.jsxs)(n.A,{justify:"space-between",vertical:!0,children:[(0,a.jsx)(r.div,{style:{height:`${s}px`}}),(0,a.jsx)(o.A,{arrows:!0,prevArrow:(0,a.jsx)(p,{direction:"left"}),nextArrow:(0,a.jsx)(p,{direction:"right"}),children:t.map((t=>(0,a.jsx)(c.A,{src:t.src},t.src)))}),(0,a.jsx)(r.div,{style:{height:`${e}px`}})]})},h=({tabMap:t,pixelsAbove:s,pixelsBelow:e})=>{const o={div:"div",...(0,i.R)()},[c,m]=(0,r.useState)(Object.keys(t)[0]);return(!s||s<0)&&(s=0),(!e||e<0)&&(e=0),(0,a.jsxs)(n.A,{justify:"space-between",vertical:!0,children:[(0,a.jsx)(o.div,{style:{height:`${s}px`}}),(0,a.jsx)(p.A,{tabList:Object.entries(t).map((([t,s])=>({key:t,label:s.label}))),activeTabKey:c,onTabChange:t=>{m(t)},children:t[c].component}),(0,a.jsx)(o.div,{style:{height:`${e}px`}})]})}},1716:(t,s,e)=>{e.r(s),e.d(s,{assets:()=>p,contentTitle:()=>c,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>m});var a=e(3788),i=e(4848),r=e(8453),n=e(1165);const o={title:"Better late than never: SVT-AV1 v2.2.x Deep Dive",description:"How does SVT-AV1 2.2.x stack up against the encoder previous version?",slug:"svt-av1-third-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.2.x-testing-blog-image.webp",hide_table_of_contents:!1},c="Introduction",p={authorsImageUrls:[void 0]},m=[{value:"Feedback",id:"feedback",level:2},{value:"Methodology",id:"methodology",level:2},{value:"Samples & Encoding Settings",id:"samples--encoding-settings",level:2},{value:"Visual comparisons",id:"visual-comparisons",level:2},{value:"Presets comparisons (-1 -> 12)",id:"presets-comparisons--1---12",level:2},{value:"Efficiency",id:"efficiency",level:3},{value:"Speed",id:"speed",level:3},{value:"Interpretation",id:"interpretation",level:3},{value:"TLDR",id:"tldr",level:3},{value:"SVT-AV1 v2.1.x vs v2.2.x presets comparisons:",id:"svt-av1-v21x-vs-v22x-presets-comparisons",level:2},{value:"preset -1: v2.1.x vs v2.2.x",id:"preset--1-v21x-vs-v22x",level:3},{value:"preset 0: v2.1.x vs v2.2.x",id:"preset-0-v21x-vs-v22x",level:3},{value:"preset 1: v2.1.x vs v2.2.x",id:"preset-1-v21x-vs-v22x",level:3},{value:"preset 2: v2.1.x vs v2.2.x",id:"preset-2-v21x-vs-v22x",level:3},{value:"preset 3: v2.1.x vs v2.2.x",id:"preset-3-v21x-vs-v22x",level:3},{value:"preset 4: v2.1.x vs v2.2.x",id:"preset-4-v21x-vs-v22x",level:3},{value:"preset 5: v2.1.x vs v2.2.x",id:"preset-5-v21x-vs-v22x",level:3},{value:"preset 6: v2.1.x vs v2.2.x",id:"preset-6-v21x-vs-v22x",level:3},{value:"preset 7: v2.1.x vs v2.2.x",id:"preset-7-v21x-vs-v22x",level:3},{value:"preset 8: v2.1.x vs v2.2.x",id:"preset-8-v21x-vs-v22x",level:3},{value:"preset 9: v2.1.x vs v2.2.x",id:"preset-9-v21x-vs-v22x",level:3},{value:"preset 10: v2.1.x vs v2.2.x",id:"preset-10-v21x-vs-v22x",level:3},{value:"preset 11: v2.1.x vs v2.2.x",id:"preset-11-v21x-vs-v22x",level:3},{value:"preset 12: v2.1.x vs v2.2.x",id:"preset-12-v21x-vs-v22x",level:3},{value:"preset 13: v2.1.x vs v2.2.x",id:"preset-13-v21x-vs-v22x",level:3},{value:"TLDR",id:"tldr-1",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Future",id:"future",level:2}];function l(t){const s={a:"a",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...t.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.p,{children:"SVT-AV1 v2.2.0 was released in late August and a minor version v2.2.1 followed suit to adress some bugs. This blog post will focus on comparing this new encoder version to the last, on the basis of benchmarks and visual comparisons. We will quantify the new trade-offs between compression efficiency and encoding speed, so you can choose the right balance for your projects. Our metrics of choice today will be SSIMULACRA2 and XPSNR, used in conjonction with a revised methodology."}),"\n",(0,i.jsx)(s.h2,{id:"feedback",children:"Feedback"}),"\n",(0,i.jsxs)(s.p,{children:["The biggest missed opportunity of the previous SVT-AV1 deep dives was the absence of visual comparisons. Indeed, metrics may be convenient for easily quantifying differences between encoder versions or encoding parameters, but they fail to give the information of how much these differences matter for your eyes. However, making properly useful visual comparisons isn't an easy task. Comparing two encodes of varying bitrates will bias the result against one or the other, which is not desirable. Figuring out the best way to present these comparisons and making the appropriate scripts took me weeks. Gathering all the necessary data, crafting the comparisons and proceeding to a double-checking pass took me another few weeks. These reasons explain why this blog post took so long to release, but I hope it will have been worth the wait! On that note though, I have been uploading thousands of png screenshots to ",(0,i.jsx)(s.em,{children:"slow.pics"})," and I ended up rate-limited. This has prevented me from uploading the visual comparisons for preset 11, 12 and some of 10. I'm actively trying to fix this situation, so please understand."]}),"\n",(0,i.jsx)(s.p,{children:"Another reason for this taking so long was my decision to increase the amount of video samples while increasing the amount of CRF values tested. A grand total of 3682 encodes were done for this blog post alone, in the span of around two weeks, where my PC would be exclusively encoding 24/7. Send help."}),"\n",(0,i.jsx)(s.p,{children:"Also, the graphs will now be using the harmonic mean instead of the arithmetic mean. Indeed, arithmetic mean scores fail to account for deviations and outliers. Using the harmonic mean implies low-scoring frames have more weight towards the final score, which adds a consistency component to the picture. That's not it though! Consistency is capital in an enjoyable watching experience. As such, each graph now possesses a SSIMULACRA2 (Harmonic) version, a XPSNR (Harmonic) version and a SSIMULACRA2 (Standard Deviation) version, in order to closely monitor variations in consistency between presets."}),"\n",(0,i.jsx)(s.p,{children:"Lastly, the biggest complaint I have received is me exclusively using anime clips. The reason for that is pretty simple: I mostly encode anime content on my free time and am myself very little interested in other types of media. However, these blog posts have grown in exposure and I understand a majority of people is more concerned about the performance of encoders on live action content or gaming clips. Thus, this new blog post is comprised of 3 live action clips, 2 gaming clips and 2 anime clips! See the sacrifices I'm making for y'all?"}),"\n",(0,i.jsx)(s.h2,{id:"methodology",children:"Methodology"}),"\n",(0,i.jsx)(s.p,{children:"The resources provided will include both graphs and image comparisons. Graphs offer a straightforward, objective look at efficiency across encoder parameters, using metrics as benchmarks for performance. In contrast, image comparisons display actual samples from encoded files, allowing you to assess quality firsthand. This adds a subjective dimension to the comparisons, giving you a more nuanced understanding of each preset's impact on visual quality."}),"\n",(0,i.jsxs)(s.p,{children:["The testing methodology involves using relatively short video samples with a wide range of content types, uncompressed to the y4m file format for ease of use. These lossless files are ",(0,i.jsx)(s.em,{children:"directly"})," fed to SvtAv1EncApp, implying the performance of a single encoder instance is what's being measured here. A more serious AV1 encoding pipeline should probably be leveraging a chunked encoding approach, especially on higher core count systems. Once an encode is done, SSIMULACRA2 scores are calculated using the ",(0,i.jsx)(s.a,{href:"https://github.com/dnjulek/vapoursynth-ssimulacra2",children:"Zig implementation"}),", XPSNR scores on the other hand are calculated using a ",(0,i.jsx)(s.a,{href:"https://github.com/fraunhoferhhi/xpsnr",children:"ffmpeg filter"}),", and the data is then aggregated into a final Harmonic or Standard Deviation score to create the graphs for this benchmark. The Constant Rate Factor (CRF) is plotted against encoding time, and the metrics scores against encode size (bitrate). The former may represent the efficiency as defined by the speed achieved at a certain quality target. For the latter, Bits Per Pixel scores (BPP) are calculated so that the ",(0,i.jsx)(s.code,{children:"Metric / BPP"})," graphs may represent the compression efficiency, normalized by resolution."]}),"\n",(0,i.jsx)(s.p,{children:"How to read the graphs? For the compression efficiency ones, the closer to the top left the better. For the encoding speed ones, the closer to the left the faster. For the standard deviation ones, the closer to the bottom left the better."}),"\n",(0,i.jsx)(s.p,{children:"The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy."}),"\n",(0,i.jsxs)(s.p,{children:["SvtAv1EncApp was compiled directly from the ",(0,i.jsx)(s.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/",children:"v2.1.2 and v2.2.1 source code"})," using Clang 18.1.8 and the provided ",(0,i.jsx)(s.code,{children:"Build/linux/build.sh"})," script with the following command: ",(0,i.jsx)(s.code,{children:"build.sh cc=clang cxx=clang++ jobs=$(nproc) enable-lto static native release"}),". The testing machine is comprised of an i3 12100 in its stock configuration, with 2x8GB of 3200MHz CL14 DDR4 RAM, in Arch Linux with kernel 6.9.12 and the performance governor enabled. All encodes have been made in the same session without rebooting."]}),"\n",(0,i.jsx)(s.p,{children:"I want to give a disclaimer concerning encoding speeds. Contrary to the efficiency results which should be reproducible independantly of the machine, measuring speed is a pretty difficult endeavor, with increased risks for errors. The performance numbers I mention may differ for you depending on the hardware configuration at hand."}),"\n",(0,i.jsxs)(s.p,{children:["This testing was conducted within the ",(0,i.jsx)(s.a,{href:"https://discord.gg/83dRFDFDp7",children:"AV1 Weeb Edition"})," Discord server, which is focused on encoding animated content in AV1."]}),"\n",(0,i.jsx)(s.h2,{id:"samples--encoding-settings",children:"Samples & Encoding Settings"}),"\n",(0,i.jsx)(s.p,{children:"The samples are as follows:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["17s ",(0,i.jsx)(s.code,{children:"Avatar The Way Of Water (trailer 3)"})," clip sourced from ",(0,i.jsx)(s.a,{href:"https://thedigitaltheater.com/category/movie-trailers/lossless-movie-trailers/",children:"thedigitaltheater.com"})," (1916x804p, 23.976fps)."]}),"\n",(0,i.jsxs)(s.li,{children:["6s ",(0,i.jsx)(s.code,{children:"Ducks Take Off"})," clip sourced from ",(0,i.jsx)(s.a,{href:"https://media.xiph.org/video/derf/",children:"xiph.org"})," (1280x720p, 50fps)."]}),"\n",(0,i.jsxs)(s.li,{children:["3s ",(0,i.jsx)(s.code,{children:"Fallout 4"})," clip sourced from another encoder fellow (1920x1080p, 60fps)."]}),"\n",(0,i.jsxs)(s.li,{children:["8s ",(0,i.jsx)(s.code,{children:"Minecraft"})," clip sourced from ",(0,i.jsx)(s.a,{href:"https://media.xiph.org/video/derf/",children:"xiph.org"})," (1920x1080p, 60fps)."]}),"\n",(0,i.jsxs)(s.li,{children:["8s ",(0,i.jsx)(s.code,{children:"Sol Levante"})," HDR clip sourced from ",(0,i.jsx)(s.a,{href:"http://download.opencontent.netflix.com/?prefix=SolLevante/",children:"opencontent.netflix.com"})," (3840x2160p, 24fps). This one is pretty educative as SVT-AV1's behavior isn't influenced by the existence (or lack thereof) of HDR metadata in a source."]}),"\n",(0,i.jsxs)(s.li,{children:["21s ",(0,i.jsx)(s.code,{children:"Suzume (trailer 2)"})," clip sourced from ",(0,i.jsx)(s.a,{href:"https://thedigitaltheater.com/category/movie-trailers/lossless-movie-trailers/",children:"thedigitaltheater.com"})," (1920x808p, 23.976fps)."]}),"\n",(0,i.jsxs)(s.li,{children:["13s ",(0,i.jsx)(s.code,{children:"The Mandalorian (trailer 2)"})," clip sourced from ",(0,i.jsx)(s.a,{href:"https://thedigitaltheater.com/category/movie-trailers/lossless-movie-trailers/",children:"thedigitaltheater.com"})," (1920x800p, 23.976fps)."]}),"\n"]}),"\n",(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.strong,{children:["All clips have been encoded in a wide quality range, from ",(0,i.jsx)(s.code,{children:"--crf 10"})," to ",(0,i.jsx)(s.code,{children:"--crf 50"}),", by increments of 2, with the exception of preset -1 that uses increments of 4."]})}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"--preset X --hierarchical-levels 4"})," are the only parameter used here, in conjunction with the CRF values. I have been asked to use ",(0,i.jsx)(s.code,{children:"--hierarchical-levels 4"})," by fellow SVT-AV1-PSY developers to force smaller mini GOPs, more appropriate for testing."]}),"\n",(0,i.jsx)(s.p,{children:"Else, the SVT-AV1 defaults were used. The ones worth mentioning are:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--tune 1"}),": tune PSNR"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--aq-mode 2"}),": variance deltaq"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--enable-qm 0"}),": quantisation matrices disabled"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--irefresh-type 2"}),": closed GOP"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--enable-tf 1"}),": temporal filtering enabled\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled..."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"visual-comparisons",children:"Visual comparisons"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"comp_showcase",src:e(9332).A+"",width:"1735",height:"784"})}),"\n",(0,i.jsxs)(s.p,{children:["Throughout this blog post, you\u2019ll find ",(0,i.jsx)(s.em,{children:"slow.pics"})," links that provide various visual comparisons between presets."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"The \u201cfull\u201d links offer comparisons across the entire quality range for each source."}),"\n",(0,i.jsx)(s.li,{children:"The HQ (High Quality), MQ (Medium Quality), and LQ (Low Quality) links showcase more targeted comparisons. These have been carefully handcrafted to be as size-normalized as possible, given the available encodes. We want to be focusing on encodes with minimal bitrate deviation for a fair comparison."}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Feel free to double-check the bitrate of each frame or scene to make a more informed observation, keeping the size difference in mind when comparing the encodes."}),"\n",(0,i.jsx)(s.p,{children:'Use the arrow keys and numpad to navigate between screenshots. Alternatively, you can click on "Slider comparison" and select two sources if you prefer comparing this way.'}),"\n",(0,i.jsx)(s.p,{children:"Without further ado, let's start with the first comparisons!"}),"\n",(0,i.jsx)(s.h2,{id:"presets-comparisons--1---12",children:"Presets comparisons (-1 -> 12)"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.strong,{children:["In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest ",(0,i.jsx)(s.code,{children:"--preset -1"})," to the fastest ",(0,i.jsx)(s.code,{children:"--preset 12"}),"."]})}),"\n",(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["Just like in ",(0,i.jsx)(s.strong,{children:"v2.1.x"}),", preset 6 and 13 do not exist in ",(0,i.jsx)(s.strong,{children:"v2.2.x"})," and are instead mapped to preset 7 and 12 respectively."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"efficiency",children:"Efficiency"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"First of all, the complete efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_xpsnr.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/full/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"You may notice something odd going on with the Avatar results using XPSNR. I have tried to understand the cause, without success. For the remainder of this blog post, the Avatar XPSNR results will be omitted. I will continue investigating and aim to have a workaround in place for next time."}),"\n",(0,i.jsx)(s.p,{children:"Anyway, this graph may be impressive, but difficult to read. So let's analyse different quality targets."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'The same graphs but focusing on the "high quality" range (CRF10 -> 22):'}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/hq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'Same, but now focusing on the "medium quality" range (CRF24 -> 36):'}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/mq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'And lastly, focusing on the "low quality" range (CRF38 -> 50):'}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/lq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If we now focus on ",(0,i.jsx)(s.strong,{children:"presets 4"}),' and below, where it\'s more difficult to discern the differences between presets, we get this at "high quality":']}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/hq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'This at "medium quality":'}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/mq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'And the following at "low quality":'}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/mrto4/lq/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.h3,{id:"speed",children:"Speed"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Let's now compare the speed of all presets:"})}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speed/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speed/v2-2-1_SVT-1_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speed/v2-2-1_SVT-1_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speed/v2-2-1_SVT-1_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speed/v2-2-1_SVT-1_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speed/v2-2-1_SVT-1_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speed/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Unusable, right?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Then, here is what it looks like with a logarithmic scale:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speedlog/v2-2-1_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_speed_log.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speedlog/v2-2-1_SVT-1_ducks_take_off_720p50_speed_log.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speedlog/v2-2-1_SVT-1_fallout_4_1080p60_speed_log.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speedlog/v2-2-1_SVT-1_minecraft_1080p60_speed_log.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speedlog/v2-2-1_SVT-1_SolLevante_2160p24_speed_log.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speedlog/v2-2-1_SVT-1_Suzume_trailer2_808p24_speed_log.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.2.x-only/allpresets/speedlog/v2-2-1_SVT-1_TheMandalorian_trailer2_800p24_speed_log.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.h3,{id:"interpretation",children:"Interpretation"}),"\n",(0,i.jsxs)(s.p,{children:["It appears as if once again ",(0,i.jsx)(s.strong,{children:"preset 2"})," through ",(0,i.jsx)(s.strong,{children:"preset 4"})," remain the most balanced presets all-around in an efficient encoding scenario, with ",(0,i.jsx)(s.strong,{children:"preset 3"})," not offering much improvements over ",(0,i.jsx)(s.strong,{children:"preset 4"})," in average scores but nicely improving on consistency instead, and ",(0,i.jsx)(s.strong,{children:"preset 2"})," offering a nice efficiency and consistency uplift on top."]}),"\n",(0,i.jsxs)(s.p,{children:["In this release again, the quality gap between ",(0,i.jsx)(s.strong,{children:"preset 2"})," and ",(0,i.jsx)(s.strong,{children:"preset 1"})," is pretty narrow, and the speed penalty from ",(0,i.jsx)(s.strong,{children:"preset 1"})," onward continuously increases, ending up close to ~2x. In comparison, the penalty of going from ",(0,i.jsx)(s.strong,{children:"preset 3"})," to ",(0,i.jsx)(s.strong,{children:"preset 2"})," is closer to ~1.5x. As such, using ",(0,i.jsx)(s.strong,{children:"preset 1"})," is entering placebo territory and it is usually not recommended to waste precious encoding resources on ",(0,i.jsx)(s.strong,{children:"preset 0"})," and ",(0,i.jsx)(s.strong,{children:"preset -1"}),". This especially applies at medium to high quality, though at extremely low quality targets, like the CRF40-50 range, we can still see appreciable gains from these placebo presets in some clips."]}),"\n",(0,i.jsxs)(s.p,{children:["As for the faster presets, ",(0,i.jsx)(s.strong,{children:"presets 5 to 10"})," are usually grouped on the graphs focusing on average scores and the ones focusing on consistency. They tend to stand apart from their slower counterparts by just a bit. Though ",(0,i.jsx)(s.strong,{children:"preset 10"})," can be worryingly close to ",(0,i.jsx)(s.strong,{children:"preset 11"})," on some occasions. They are all viable for your real-time needs. The rule is the same as usual: ",(0,i.jsx)(s.strong,{children:"go the slowest you can bear that still achieves your goal!"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Presets 11 and 12"})," are especially inefficient and inconsistent, and to be avoided at all costs. If possible, forget they even exist, as it's probably better to use a comparably fast (or faster) competing codec. They could still be of use in a convex-hull scenario, but in the case of realtime transcoding, you will be better off with some hardware solution like the ones found in RTX 4000 or Arc GPUs."]}),"\n",(0,i.jsx)(s.h3,{id:"tldr",children:"TLDR"}),"\n",(0,i.jsxs)(s.p,{children:["The same conclusions as the previous blog posts can be made:\n",(0,i.jsxs)(s.strong,{children:["clear quality gains can be observed as we decrease presets, until ",(0,i.jsx)(s.strong,{children:"preset 2"}),", however the effectiveness of dropping presets is noticeably less and less important as quality is increased."]})]}),"\n",(0,i.jsx)(s.h2,{id:"svt-av1-v21x-vs-v22x-presets-comparisons",children:"SVT-AV1 v2.1.x vs v2.2.x presets comparisons:"}),"\n",(0,i.jsx)(s.p,{children:"In this section, we\u2019ll examine the efficiency and speed differences across presets when upgrading from SVT-AV1 2.1.x to 2.2.x. This comparison should bring a new level of nuance to our results, highlighting both incremental improvements and any notable shifts in performance."}),"\n",(0,i.jsxs)(s.p,{children:["SVT-AV1 ",(0,i.jsx)(s.strong,{children:"v2.1.x"})," brought some nice improvements over ",(0,i.jsx)(s.strong,{children:"v2.0.0"}),", but does ",(0,i.jsx)(s.strong,{children:"v2.2.x"})," bring appreciable improvements in the presets trade-offs this time around as well? Let's find out!"]}),"\n",(0,i.jsxs)(s.h3,{id:"preset--1-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset -1"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:'Let\'s start things off with the battle of the placebos, with the Compression efficiency & consistency at "high to medium-ish quality" (CRF10 -> 30):'})}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT-1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'Along with the Compression efficiency & consistency at "medium-ish to low quality" (CRF34 -> 50):'}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT-1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Basically no changes at all, except a slight regression on Minecraft."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"What about their speeds though?:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT-1_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT-1_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT-1_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT-1_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT-1_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT-1_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT-1_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Well ",(0,i.jsx)(s.strong,{children:"preset -1"})," basically became 15 to 25% faster, not bad at all!"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset -1 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/LdIsYSua",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/19Oi8pWw",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/4Ir6SG5S",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/BpxD7oZd",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/qBdzKUFm",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/XFaep0lc",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/EOIoOoAQ",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/lPg9yLv9",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/FquLoNSq",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/XRHmsQOw",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ZCzJfBUC",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/P0VLDoMT",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/AQC1xzLS",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/BCVbL7w2",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/UwSQfopm",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/Ab6bkcpS",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/W9KlRAts",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/6yHhAeM5",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/BAF89tjA",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/DkkK3GYV",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/xmZmIEar",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-0-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 0"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Efficiency wise, this new ",(0,i.jsx)(s.strong,{children:"preset 0"})," is close to unchanged from the old ",(0,i.jsx)(s.strong,{children:"preset 0"}),", but its consistency improved slightly in a few clips at high quality and decreased in one clip at low quality."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT0_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT0_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT0_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT0_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT0_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT0_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT0_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 0"}),"'s speed sees an improvement of about 20% at best. Overall, ",(0,i.jsx)(s.strong,{children:"preset 0"})," got a proper upgrade!"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 0 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/7n5bAB2d",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/AHmNT8Pw",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/VC6lZr6D",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/97SAuLaO",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/m9iPnqqW",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/gBXawmpH",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/7dRVJzXD",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/qshRSgnZ",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/aq9eTZf5",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/xu99HM0j",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/eC0gzO7y",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/pB9Ps3a6",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/aWbIxmgr",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/3jVGagWZ",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/MlYl7i4e",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/7MImyYc0",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/SmDGEAPx",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ZiCgjlxE",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/4GbaSzv6",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/EPTFWHQI",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/oVZqCWsl",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/LqadqVGG",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/TnD6CAyF",children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/CDuu3SOK",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/x8Sot0wg",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/idbPz3uh",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/OpFzXtjr",children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/3d8gpuoo",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-1-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 1"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 1"})," is mostly unchanged but sees another slight regression in Minecraft at high quality."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT1_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT1_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT1_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT1_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT1_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT1_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT1_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Depending on the clip, speed is mostly unchanged or ever so slighty improved. ",(0,i.jsx)(s.strong,{children:"Preset 1"})," is a bit stagnant this release."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 1 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/BnOX37oJ",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/bWjBtTyR",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/6UQKyNac",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/NpyxU3uF",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/KVX4piAj",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/EsEpbKVY",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/8AxTTvKw",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ZgW8715d",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/xQprIMbB",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/qRvBez7k",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/taXnNGUx",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/s6fbIqvr",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/cE86n2Gb",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/eOyUxHhq",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/tKPYsd9K",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/evfzJDjc",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/BSzecR9N",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/mWIoU45b",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/geYXLoIY",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/QzSjaYXF",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/pBVidgiB",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/5KtTXd3q",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/lb0yMDhZ",children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/TipcRRJr",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/4ouGFV9s",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/oxPNsHdU",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/EPju5ULC",children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/e58LmgFm",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-2-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 2"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 2"}),"'s efficiency has regressed at high quality on some clips, improved in some and stayed the same in others. Except in one clip, consistency seems to have improved all around. At low to medium quality targets, efficiency is mostly unchanged, same for consistency. Not exactly noteworthy."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT2_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT2_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT2_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT2_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT2_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT2_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT2_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Speed was improved by about 10-20%. Not a bad showcase, for sure."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 2 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/CJg3dsFg",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/71wpH5eB",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/AN0syhNv",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/NRocyEay",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/NyGfMRpQ",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/OAqs5b8k",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/tQSF50Ro",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/gJjm3BGl",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/snQuTi1f",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/0rLG3TUT",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/MMX6DgNz",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/lwoIkLfm",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/5OYsrhGY",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/kCwbA7Ir",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/1nnyrvjD",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/F1RTfQf7",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/xduJGoTU",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/8SdKLegQ",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/uHNR7DNz",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/wgZgH7w6",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/zC4AEMLt",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/kGip9wuY",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/aoQ0m9ms",children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/7ZMT3inc",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/8BKkJ4du",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/XQeD7vfY",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/6rQMASQR",children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/Jl2Fh5wE",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-3-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 3"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Practically, it's a wash."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT3_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT3_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT3_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT3_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT3_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT3_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT3_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Still, ",(0,i.jsx)(s.strong,{children:"preset 3"})," got slightly faster, I'm happy to report this is a speedup!"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 3 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/Vql4MJWQ",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/Iuqp0Zbz",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/MuTOEHE9",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/poiDDJRQ",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/mqWOgsYF",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/16L6HyaH",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/KaoPy7ae",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/0L84OWnI",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/JuXAjSY6",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/mR5rJfsU",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/Zpy7Hzds",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/GeQrpfhp",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/rBCbaJkx",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/AJHQ4KNL",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/MYLA8KPH",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/aEMnRk7D",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/F7rmPiaW",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/PYO4K4sy",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/viWYsgX7",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/4NBaUoEX",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/d15XbowQ",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/eS6EQKng",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/IJtLW35Z",children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/zf352iox",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/UrAekqg6",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/WWgygRS4",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ry5sPqmB",children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/6wI4wexZ",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-4-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 4"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 4"})," sees a consistent though small improvement in average scores and standard deviation accross the entire quality range on basically all clips."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT4_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT4_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT4_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT4_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT4_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT4_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT4_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Unfortunately, it got slower as a result. If you remember, ",(0,i.jsx)(s.strong,{children:"v2.1.0"})," did the exact contrary over ",(0,i.jsx)(s.strong,{children:"v2.0.0"}),", I wonder if ",(0,i.jsx)(s.strong,{children:"preset 4"})," simply took back the place it previously had..."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 4 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/ArdO4K7R",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/88ikqaZn",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/rM6LRBg0",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ofmHWCkv",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/HVkqo5G3",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/w44DNiqe",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/GlRLCaBt",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/Lkzi1VBU",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/44jtBEqw",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/G9YPifBb",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/86m4exaw",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/m4KHBihZ",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/n9OP2sht",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/JohJ3MzJ",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/e6b8R24h",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/xNwNlmAG",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/vB7ndGZI",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/R5uENbD5",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/i7eV72sl",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/zUMYarNf",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/rgmuB5xB",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/y9rxWVre",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/4GhRL8gZ",children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/F3Hq8V9z",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/3BAR5P80",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/s2xzApJd",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/Ihjks1JO",children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/JjGKUO1r",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-5-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 5"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Both metrics say ",(0,i.jsx)(s.strong,{children:"preset 5"})," regressed slightly to moderately, though surprisingly its consistency is basically unchanged."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT5_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT5_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT5_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT5_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT5_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT5_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT5_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"The result of this regression is an impressive speedup of up to 25%."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 5 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/Lc8HjJBK",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/r3gJkCv3",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/k2TwNLHN",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/cMlNo17a",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/X4EZFJcM",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/zKLphp19",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/dYs1snV3",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/JFtne5WV",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/9ye1q9Rm",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/zhEuOjRc",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/YmZ3aRLO",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/9ye1q9Rm",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/kyjcJWxt",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/UTWgYc3P",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/FtOxX3RH",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/jNyqLPgP",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/ipyfREjA",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/73V8CGKk",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/z8P9UokS",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/OPwerF86",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/xfsYGM5C",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/dL2J923D",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/OhZNMzjx",children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/XFCnEebJ",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/xrO227rQ",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/m7Yky6EK",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/pN0cH6Yn",children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/vB9zK9iz",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsx)(s.h3,{id:"preset-6-v21x-vs-v22x",children:(0,i.jsxs)(s.del,{children:[(0,i.jsx)(s.code,{children:"preset 6"}),": v2.1.x vs v2.2.x"]})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 6"})," is mapped to ",(0,i.jsx)(s.strong,{children:"preset 7"})," in ",(0,i.jsx)(s.strong,{children:"v2.2.x"}),"."]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-7-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 7"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 7"})," is close to unchanged in ",(0,i.jsx)(s.strong,{children:"v2.2.x"}),"."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT7_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT7_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT7_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT7_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT7_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT7_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT7_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"It still got some slight to moderate speedups though, which can be appreciated."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 7 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/YtvMG9X6",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/P0gF7nbQ",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/syT6uiVt",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/zkkv1ePp",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/pyVQmAWj",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/eXSNnqV7",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ja7d0sFU",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/JCTFfcMu",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/S6SbCW8x",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/bWCLQWwV",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/hvauusst",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/04LVSbGD",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/mh8VUfrO",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/P0pIx6XP",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/vnrXVajs",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/8WKQdw2N",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/kH9LcEzG",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/1DWCNq2B",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/clxjB7Uw",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/52wLF7NR",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/3VlVk3O9",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/FKel5bhI",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/XXiyyCNN",children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/rrBoua68",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/unxuKHEK",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/GMXnxSdA",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/v8wSN90W",children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/fswh5kCT",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-8-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 8"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["The efficiency and consistency of ",(0,i.jsx)(s.strong,{children:"preset 8"})," has improved at high quality."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT8_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT8_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT8_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT8_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT8_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT8_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT8_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"And we can observe a speed increase of around 10%. Some crazy speed deviations can be noticed in Sol Levante."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 8 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/8tKOAvGN",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/YLWgqmxU",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/pDg4gLry",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ADFSsXmP",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/ug0TVcoF",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/WiDmtcVZ",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ERVfuYHH",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/I0N97rQw",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/MqVzmFIi",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/jUoB0PGo",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/hXGIfwVj",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/QUy3iX2H",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/frkuJR97",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/GayEkyrn",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/S36Ha8LP",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/lxoYsv8k",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/YupMFGeu",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/evfWqxZ9",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/Juh027Eq",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ETPf9ppU",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/oeFUWMHd",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/01vzYfnq",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/BIL4g7zk",children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/boxyyeZN",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/57M6RHM0",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/8WJcnZfU",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/M7q5PYz8",children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/ctoke6p1",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-9-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 9"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Efficiency and consistency stayed mostly the same."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT9_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT9_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT9_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT9_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT9_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT9_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT9_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Speed improved by a few percents at most. ",(0,i.jsx)(s.strong,{children:"Preset 9"})," has stagnated over ",(0,i.jsx)(s.strong,{children:"v2.1.x"}),"."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 9 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/P3zZKVF0",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/sL4HPZLa",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/QOxyI9h0",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/RfLKIRjj",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/aj6SVcIZ",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/UpnejngN",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/KJRzl3FY",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/4mMq9sz3",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/vHqlIJBK",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/XHoe9Udp",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/tukibDud",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/cV57jRF9",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/XRT1OYnX",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/HqtoRlvV",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/Ml2rLjvO",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/EGCsqcSl",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/8URvlnba",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/jPFT5hMG",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/92EZO3U3",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/bWgcvUtj",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/yA2y0v92",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/pAPBbl7r",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/7hTvbMy1",children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/arrDGAd9",children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/KQHqkAVZ",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/UzdN0rSC",children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/dxKpfcvs",children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/FPJAf74J",children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-10-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 10"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 10"})," received the most efficiency and consistency improvements out of all presets in this release. What will be the cost of such drastic change though?"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT10_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT10_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT10_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT10_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT10_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT10_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT10_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Well, not that much all things considered! ",(0,i.jsx)(s.strong,{children:"Preset 10"}),"'s speed did decrease from barely anything to 20% in the most extreme situation, but its improvements well outshine its speed regression. Overall, ",(0,i.jsx)(s.strong,{children:"preset 11"})," went from borderline unusable to becoming an interesting new fast real-time preset. This is pretty huge in my opinion, as it offers a new kind of trade-off no other AV1 encoder or prior SVT-AV1 versions did."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Preset 10 visual comparisons:"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/8GjtQQAm",children:"Avatar (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/FriwG6rw",children:"Avatar (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/vqau9jk1",children:"Avatar (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/WQTbcWvH",children:"Avatar (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/xYotraaP",children:"Ducks (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/HHlwCvwc",children:"Ducks (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/bgV6MoQz",children:"Ducks (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/bOAyMVUk",children:"Ducks (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/MrYTMHoQ",children:"Fallout (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/qL9xmCfI",children:"Fallout (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/dwdE0pWt",children:"Fallout (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/uo7Ztb5f",children:"Fallout (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/fICToF3E",children:"Minecraft (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/cGBhBsaS",children:"Minecraft (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/w1P4LAu5",children:"Minecraft (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/rNqRWd61",children:"Minecraft (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/UyMpDhx0",children:"Sol Levante (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/b0B7ndsZ",children:"Sol Levante (HQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/3H4ewpMI",children:"Sol Levante (MQ)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/wpCnz72u",children:"Sol Levante (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/ZYoFdtdS",children:"Suzume (full)"}),", ",(0,i.jsx)(s.a,{href:"https://slow.pics/c/L2z8yEd5",children:"Suzume (HQ)"}),", ",(0,i.jsx)(s.del,{children:"Suzume (MQ)"}),", ",(0,i.jsx)(s.del,{children:"Suzume (LQ)"})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://slow.pics/c/NhYFWBzc",children:"The Mandalorian (full)"}),", ",(0,i.jsx)(s.del,{children:"The Mandalorian (HQ)"}),", ",(0,i.jsx)(s.del,{children:"The Mandalorian (MQ)"}),", ",(0,i.jsx)(s.del,{children:"The Mandalorian (LQ)"})]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-11-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 11"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["The new ",(0,i.jsx)(s.strong,{children:"preset 11"})," places itself between the old ",(0,i.jsx)(s.strong,{children:"preset 11"})," and the old ",(0,i.jsx)(s.strong,{children:"preset 12"})," efficiency and consistency wise."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT11_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT11_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT11_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT11_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT11_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT11_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT11_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Unsurprisingly, its speed is also in-between the old ",(0,i.jsx)(s.strong,{children:"preset 11"})," and the old ",(0,i.jsx)(s.strong,{children:"preset 12"}),". I'm unsure this new trade-off helps in anything."]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-12-v21x-vs-v22x",children:[(0,i.jsx)(s.code,{children:"preset 12"}),": v2.1.x vs v2.2.x"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, high quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/hq/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, medium quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/mq/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Compression efficiency & consistency graphs, low quality range:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_AvatarTheWayOfWater_Trailer3_804p24_ssimu2.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_ducks_take_off_720p50_ssimu2.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_fallout_4_1080p60_ssimu2.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_minecraft_1080p60_ssimu2.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_SolLevante_2160p24_ssimu2.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_Suzume_trailer2_808p24_ssimu2.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_ssimu2.webp",alt:"The Mandalorian Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_ducks_take_off_720p50_xpsnr.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_fallout_4_1080p60_xpsnr.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_minecraft_1080p60_xpsnr.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_SolLevante_2160p24_xpsnr.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_Suzume_trailer2_808p24_xpsnr.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_xpsnr.webp",alt:"The Mandalorian Efficiency Graph"}]})},stddev:{label:"STD DEV",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_AvatarTheWayOfWater_Trailer3_804p24_ssimu2_std.webp",alt:"Avatar The Way Of Water Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_ducks_take_off_720p50_ssimu2_std.webp",alt:"Ducks Take Off Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_fallout_4_1080p60_ssimu2_std.webp",alt:"Fallout 4 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_minecraft_1080p60_ssimu2_std.webp",alt:"Minecraft Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_SolLevante_2160p24_ssimu2_std.webp",alt:"Sol Levante Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_Suzume_trailer2_808p24_ssimu2_std.webp",alt:"Suzume Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/lq/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_ssimu2_std.webp",alt:"The Mandalorian Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 12"})," is almost unchanged from the previous release."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT12_AvatarTheWayOfWater_Trailer3_804p24_speed.webp",alt:"Avatar The Way Of Water Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT12_ducks_take_off_720p50_speed.webp",alt:"Ducks Take Off Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT12_fallout_4_1080p60_speed.webp",alt:"Fallout 4 Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT12_minecraft_1080p60_speed.webp",alt:"Minecraft Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT12_SolLevante_2160p24_speed.webp",alt:"Sol Levante Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT12_Suzume_trailer2_808p24_speed.webp",alt:"Suzume Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.2.x-blogpost/2.1.xvs2.2.x/speed/v2-1-2_SVT12_TheMandalorian_trailer2_800p24_speed.webp",alt:"The Mandalorian Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Same speed wise. So, no improvements at all for the two fastest presets. They remain all around very bad performers. In hindsight, it doesn't matter that I couldn't upload the ",(0,i.jsx)(s.strong,{children:"preset 11 & 12"})," visual comparisons, because there is literally nothing to see."]}),"\n",(0,i.jsx)(s.h3,{id:"preset-13-v21x-vs-v22x",children:(0,i.jsxs)(s.del,{children:[(0,i.jsx)(s.code,{children:"preset 13"}),": v2.1.x vs v2.2.x"]})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 13"})," is mapped to ",(0,i.jsx)(s.strong,{children:"preset 12"})," in ",(0,i.jsx)(s.strong,{children:"v2.2.x"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"tldr-1",children:"TLDR"}),"\n",(0,i.jsxs)(s.p,{children:["With ",(0,i.jsx)(s.strong,{children:"v2.2.x"}),", we observed new efficiency/speed trade-offs for a good amount of presets.\nSome presets, like ",(0,i.jsx)(s.strong,{children:"-1"})," and ",(0,i.jsx)(s.strong,{children:"0"}),", received significant speed improvements at no efficiency cost. ",(0,i.jsx)(s.strong,{children:"Presets 3 and 7"})," received more reasonable speedups. ",(0,i.jsx)(s.strong,{children:"Presets 2, 8 and 11"})," have seen new trade-offs that are mostly beneficial. ",(0,i.jsx)(s.strong,{children:"Preset 10"})," was deeply revamped and replaces ",(0,i.jsx)(s.strong,{children:"preset 9"})," in my book as the fastest, still viable, real-time preset. ",(0,i.jsx)(s.strong,{children:"Preset 4"})," seems to have returned to the state it was in ",(0,i.jsx)(s.strong,{children:"v2.0.0"}),". On the other hand, ",(0,i.jsx)(s.strong,{children:"preset 5"})," seemed to have regressed slightly, and ",(0,i.jsx)(s.strong,{children:"presets 1, 9 and 12"})," are basically unchanged from ",(0,i.jsx)(s.strong,{children:"v2.1.x"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsxs)(s.p,{children:["The release of SVT-AV1 ",(0,i.jsx)(s.strong,{children:"v2.2.x"})," brings some welcome speed improvements. ",(0,i.jsx)(s.strong,{children:"Presets 2 through 4"})," continue to lead in efficiency for AV1 encoding, delivering top-tier quality and compression. Meanwhile, ",(0,i.jsx)(s.strong,{children:"presets 5 through 10"})," offer solid alternatives for those who find ",(0,i.jsx)(s.strong,{children:"presets 2 through 4"})," too slow, balancing quality with noticeably faster encoding times."]}),"\n",(0,i.jsxs)(s.p,{children:["Hopefully, this comprehensive third deep dive has given you a helpful starting point for choosing settings when encoding with ",(0,i.jsx)(s.del,{children:"the latest"})," SVT-AV1(-PSY) v2.2.x."]}),"\n",(0,i.jsx)(s.h2,{id:"future",children:"Future"}),"\n",(0,i.jsxs)(s.p,{children:["Once more, this testing focused on establishing the new presets dynamics, however I haven't revisited the different SVT-AV1 parameters since ",(0,i.jsx)(s.strong,{children:"v1.8.0"}),". A few meaningful features have been added since, like variance boost, and with this overhauled methodology, the conclusion made in that blog post may be different now. I think it will be worth to revisit this in the future, maybe in the next blog post for ",(0,i.jsx)(s.strong,{children:"v2.3.0"}),"?\nYes, I'm fully aware I'm late because ",(0,i.jsx)(s.strong,{children:"v2.3.0"})," has already been out for two whole weeks. Even if the frontend of this blog post doesn't seem to have radically changed, my entire workflow has tremendously evolved since last time. It may have taken me since mid-August to manage to complete this blog post, but my efforts should allow me to produce a follow-up faster."]}),"\n",(0,i.jsxs)(s.p,{children:["I am conscious of this blog post's limitations. First of all, I observed some odd behaviors from XPSNR on certain clips which I haven't been able to pinpoint yet. It would also give me nonsensical standard deviation results, which is the reason why only the standard deviation in SSIMU2 scores was given. Second of all, SVT-AV1's own behavior starts to get messy when you approach the SSIMULACRA2 0 score, rendering all the data in that region pretty much useless. Plus, aggregating these metrics scores take forever, so I'm looking into ways to accelerate the process, for instance by offloading the work to my GPU using ",(0,i.jsx)(s.a,{href:"https://github.com/Gui-Yom/turbo-metrics",children:"turbo-metrics"}),". Also, I'm stuck between wanting to increase the amount of data points in each graphs to get more detailed results and having to keep everything readable. This time around I had to seperate each graph into three quality levels, but that's already too much for my liking. I will look into improving myself on the data presentation front. I feel like I have to streamline this formula to make it more digestible for everyone."]}),"\n",(0,i.jsxs)(s.p,{children:["Please, I'm open to ",(0,i.jsx)(s.strong,{children:"your"})," remarks and suggestions to improve on this blog post formula."]}),"\n",(0,i.jsx)(s.p,{children:"That said, here are my plans for future blog posts:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["a follow-up v2.3.0 article that also revisits the useful SVT-AV1 parameters. ",(0,i.jsx)(s.em,{children:(0,i.jsx)(s.strong,{children:"I'm planning for this to release before 2025."})})]}),"\n",(0,i.jsxs)(s.li,{children:["an article focused on giving you encoding tips and explaining common AV1 encoding knowlegde is still planned for ",(0,i.jsx)(s.em,{children:"someday"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["a ",(0,i.jsx)(s.em,{children:"future"})," article focused on observing the evolution of all software AV1 encoders since the beginning of their development, as well as comparisons with vpxenc, AVM (development ground for AV2) and VVenC."]}),"\n",(0,i.jsx)(s.li,{children:"and many more..."}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Thanks for reading!"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.em,{children:["Support me by making a donation on ",(0,i.jsx)(s.a,{href:"https://ko-fi.com/nekotrix",children:"my Ko-Fi page"}),", as a reward for my efforts and to compensate for the electricity bills of two whole weeks of non-stop encoding."]})}),"\n"]})}function u(t={}){const{wrapper:s}={...(0,r.R)(),...t.components};return s?(0,i.jsx)(s,{...t,children:(0,i.jsx)(l,{...t})}):l(t)}},9332:(t,s,e)=>{e.d(s,{A:()=>a});const a=e.p+"assets/images/comp_showcase-3902fce14e72fc094b637b526525a24e.webp"},3788:t=>{t.exports=JSON.parse('{"permalink":"/blog/svt-av1-third-deep-dive","source":"@site/blog/2024-11-14-svt-av1-deep-dive3-v2-2-x.mdx","title":"Better late than never: SVT-AV1 v2.2.x Deep Dive","description":"How does SVT-AV1 2.2.x stack up against the encoder previous version?","date":"2024-11-14T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"},{"inline":true,"label":"benchmarks","permalink":"/blog/tags/benchmarks"}],"readingTime":77.835,"hasTruncateMarker":true,"authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Better late than never: SVT-AV1 v2.2.x Deep Dive","description":"How does SVT-AV1 2.2.x stack up against the encoder previous version?","slug":"svt-av1-third-deep-dive","authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043"}],"tags":["video","compression","benchmarks"],"image":"/img/svt-2.2.x-testing-blog-image.webp","hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Codec Wiki: One Year Later","permalink":"/blog/codec-wiki-one-year-later"}}')}}]); \ No newline at end of file diff --git a/assets/js/2fcb10cd.4dab5d96.js b/assets/js/2fcb10cd.4dab5d96.js new file mode 100644 index 000000000..e91ac6a36 --- /dev/null +++ b/assets/js/2fcb10cd.4dab5d96.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8158],{3034:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"audio/intro","title":"Intro","description":"What is lossless audio? What is lossy audio? What is an audio codec? This entry serves as an intro to digital audio processing.","source":"@site/docs/audio/intro.mdx","sourceDirName":"audio","slug":"/audio/intro","permalink":"/docs/audio/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/intro.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Intro","description":"What is lossless audio? What is lossy audio? What is an audio codec? This entry serves as an intro to digital audio processing.","keywords":["audio codec","audio","codec","audio encoding","audio decoding","audio compression","audio quality","audio formats","audio file formats","audio file","audio file type","audio file extension","audio file format","audio file types","audio file formats"],"sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"High Dynamic Range","permalink":"/docs/introduction/high-dynamic-range"},"next":{"title":"AAC","permalink":"/docs/audio/AAC"}}');var n=s(4848),t=s(8453);const a={title:"Intro",description:"What is lossless audio? What is lossy audio? What is an audio codec? This entry serves as an intro to digital audio processing.",keywords:["audio codec","audio","codec","audio encoding","audio decoding","audio compression","audio quality","audio formats","audio file formats","audio file","audio file type","audio file extension","audio file format","audio file types","audio file formats"],sidebar_position:1},r="Introduction to Lossy & Lossless Audio Compression",d={},c=[{value:"Sampling & the Nyquist Frequency",id:"sampling--the-nyquist-frequency",level:2},{value:"Lossless Audio Compression",id:"lossless-audio-compression",level:2},{value:"Lossy Audio Compression",id:"lossy-audio-compression",level:2},{value:"Conclusion",id:"conclusion",level:2}];function l(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"introduction-to-lossy--lossless-audio-compression",children:"Introduction to Lossy & Lossless Audio Compression"})}),"\n",(0,n.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(i.p,{children:["Digital audio is the representation of sound recorded in, or converted into, digital form. To understand digital audio, it's crucial to grasp some fundamental concepts, including ",(0,n.jsx)(i.strong,{children:"sampling"}),", ",(0,n.jsx)(i.strong,{children:"Nyquist Frequency"}),", and the ",(0,n.jsx)(i.strong,{children:"Nyquist-Shannon Sampling Theorem"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"sampling--the-nyquist-frequency",children:"Sampling & the Nyquist Frequency"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Sampling"})," is the process of converting a continuous, analog audio signal into a discrete digital signal by measuring the amplitude of the audio signal at uniform intervals. The frequency of this measurement is known as the ",(0,n.jsx)(i.em,{children:"sampling rate"}),", typically measured in samples per second, or Hertz (Hz). For example, audio CDs use a sampling rate of 44,100 Hz, which means the audio signal is sampled 44,100 times every second."]}),"\n",(0,n.jsxs)(i.p,{children:["To accurately represent a wave, you need at least two measurements per cycle; one to capture the peak of the wave, and one to capture the trough. If you sample less than twice per cycle, you can't distinguish between different frequencies; this is where the ",(0,n.jsx)(i.strong,{children:"Nyquist frequency"})," comes from. Named after Harry Nyquist, the ",(0,n.jsx)(i.strong,{children:"Nyquist frequency"})," is ",(0,n.jsx)(i.em,{children:"half of the sampling rate of a discrete signal processing system"}),". For a given sampling rate, the Nyquist frequency represents the highest frequency that can be accurately sampled without introducing errors such as aliasing. For example, with a sampling rate of 48,000 Hz, the Nyquist frequency is 24,000 Hz. Capturing frequencies above the Nyquist frequency for a given system can bring about ",(0,n.jsx)(i.strong,{children:"aliasing"})," artifacts. Aliasing occurs where high-frequency components appear as lower frequencies in the sampled signal, distorting the information."]}),"\n",(0,n.jsxs)(i.p,{children:["The ",(0,n.jsx)(i.strong,{children:"Nyquist-Shannon sampling theorem"})," states that to avoid aliasing, the sampling rate must be at least twice the highest frequency present in the signal. This theorem is crucial for ensuring that the digital representation of the audio signal retains all the information from the original analog signal without distortion."]}),"\n",(0,n.jsx)(i.h2,{id:"lossless-audio-compression",children:"Lossless Audio Compression"}),"\n",(0,n.jsx)(i.p,{children:"The main benefit of lossless compression is the preservation of audio quality, making it ideal for professional audio production, archiving, and situations where high fidelity is required. However, lossless files are significantly larger than their lossy counterparts, which can be a drawback for storage and (especially) streaming."}),"\n",(0,n.jsx)(i.admonition,{title:"Lossless Compression",type:"note",children:(0,n.jsxs)(i.p,{children:["If you would like to dive more deeply into the topic of lossless compression, you can check out the ",(0,n.jsx)(i.a,{href:"/docs/introduction/lossless",children:"Lossless Compression"})," entry in the Introduction section of the wiki."]})}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"/docs/audio/FLAC",children:"FLAC"}),", ",(0,n.jsx)(i.a,{href:"/docs/audio/WavPack",children:"WavPack"}),", & ",(0,n.jsx)(i.a,{href:"/docs/audio/ALAC",children:"ALAC"})," are examples of popular lossless audio codecs that you are likely to encounter in the wild."]}),"\n",(0,n.jsx)(i.h2,{id:"lossy-audio-compression",children:"Lossy Audio Compression"}),"\n",(0,n.jsx)(i.p,{children:"The primary advantage of lossy compression is the significant reduction in file size, making it ideal for streaming, portable devices, and situations where storage space is limited. However, the trade-off is a potential loss in audio quality, which may be noticeable in critical listening environments."}),"\n",(0,n.jsx)(i.admonition,{title:"Lossy Compression",type:"note",children:(0,n.jsxs)(i.p,{children:["If you would like to dive more deeply into the topic of lossy compression, you can check out the ",(0,n.jsx)(i.a,{href:"/docs/introduction/lossy",children:"Lossy Compression"})," entry in the Introduction section of the wiki."]})}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"/docs/audio/MP3",children:"MP3"}),", ",(0,n.jsx)(i.a,{href:"/docs/audio/AAC",children:"AAC"}),", ",(0,n.jsx)(i.a,{href:"/docs/audio/Vorbis",children:"Vorbis"}),", & ",(0,n.jsx)(i.a,{href:"/docs/audio/Opus",children:"Opus"})," are some examples of popular lossy audio codecs that you are likely to encounter in the wild."]}),"\n",(0,n.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(i.p,{children:"Understanding these baseline principles of digital audio processing is essential for informed reading when it comes to the rest of the Audio section of this wiki. We hope this page helped you grasp some of the fundamental concepts that underpin digital audio processing."})]})}function u(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>a,x:()=>r});var o=s(6540);const n={},t=o.createContext(n);function a(e){const i=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2fcb10cd.5be239c1.js b/assets/js/2fcb10cd.5be239c1.js deleted file mode 100644 index 7073a548f..000000000 --- a/assets/js/2fcb10cd.5be239c1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8158],{1162:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>t,metadata:()=>r,toc:()=>c});var o=s(4848),n=s(8453);const t={title:"Intro",description:"What is lossless audio? What is lossy audio? What is an audio codec? This entry serves as an intro to digital audio processing.",keywords:["audio codec","audio","codec","audio encoding","audio decoding","audio compression","audio quality","audio formats","audio file formats","audio file","audio file type","audio file extension","audio file format","audio file types","audio file formats"],sidebar_position:1},a="Introduction to Lossy & Lossless Audio Compression",r={id:"audio/intro",title:"Intro",description:"What is lossless audio? What is lossy audio? What is an audio codec? This entry serves as an intro to digital audio processing.",source:"@site/docs/audio/intro.mdx",sourceDirName:"audio",slug:"/audio/intro",permalink:"/docs/audio/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/intro.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Intro",description:"What is lossless audio? What is lossy audio? What is an audio codec? This entry serves as an intro to digital audio processing.",keywords:["audio codec","audio","codec","audio encoding","audio decoding","audio compression","audio quality","audio formats","audio file formats","audio file","audio file type","audio file extension","audio file format","audio file types","audio file formats"],sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"High Dynamic Range",permalink:"/docs/introduction/high-dynamic-range"},next:{title:"AAC",permalink:"/docs/audio/AAC"}},d={},c=[{value:"Sampling & the Nyquist Frequency",id:"sampling--the-nyquist-frequency",level:2},{value:"Lossless Audio Compression",id:"lossless-audio-compression",level:2},{value:"Lossy Audio Compression",id:"lossy-audio-compression",level:2},{value:"Conclusion",id:"conclusion",level:2}];function l(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"introduction-to-lossy--lossless-audio-compression",children:"Introduction to Lossy & Lossless Audio Compression"})}),"\n",(0,o.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,o.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,o.jsxs)(i.p,{children:["Digital audio is the representation of sound recorded in, or converted into, digital form. To understand digital audio, it's crucial to grasp some fundamental concepts, including ",(0,o.jsx)(i.strong,{children:"sampling"}),", ",(0,o.jsx)(i.strong,{children:"Nyquist Frequency"}),", and the ",(0,o.jsx)(i.strong,{children:"Nyquist-Shannon Sampling Theorem"}),"."]}),"\n",(0,o.jsx)(i.h2,{id:"sampling--the-nyquist-frequency",children:"Sampling & the Nyquist Frequency"}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.strong,{children:"Sampling"})," is the process of converting a continuous, analog audio signal into a discrete digital signal by measuring the amplitude of the audio signal at uniform intervals. The frequency of this measurement is known as the ",(0,o.jsx)(i.em,{children:"sampling rate"}),", typically measured in samples per second, or Hertz (Hz). For example, audio CDs use a sampling rate of 44,100 Hz, which means the audio signal is sampled 44,100 times every second."]}),"\n",(0,o.jsxs)(i.p,{children:["To accurately represent a wave, you need at least two measurements per cycle; one to capture the peak of the wave, and one to capture the trough. If you sample less than twice per cycle, you can't distinguish between different frequencies; this is where the ",(0,o.jsx)(i.strong,{children:"Nyquist frequency"})," comes from. Named after Harry Nyquist, the ",(0,o.jsx)(i.strong,{children:"Nyquist frequency"})," is ",(0,o.jsx)(i.em,{children:"half of the sampling rate of a discrete signal processing system"}),". For a given sampling rate, the Nyquist frequency represents the highest frequency that can be accurately sampled without introducing errors such as aliasing. For example, with a sampling rate of 48,000 Hz, the Nyquist frequency is 24,000 Hz. Capturing frequencies above the Nyquist frequency for a given system can bring about ",(0,o.jsx)(i.strong,{children:"aliasing"})," artifacts. Aliasing occurs where high-frequency components appear as lower frequencies in the sampled signal, distorting the information."]}),"\n",(0,o.jsxs)(i.p,{children:["The ",(0,o.jsx)(i.strong,{children:"Nyquist-Shannon sampling theorem"})," states that to avoid aliasing, the sampling rate must be at least twice the highest frequency present in the signal. This theorem is crucial for ensuring that the digital representation of the audio signal retains all the information from the original analog signal without distortion."]}),"\n",(0,o.jsx)(i.h2,{id:"lossless-audio-compression",children:"Lossless Audio Compression"}),"\n",(0,o.jsx)(i.p,{children:"The main benefit of lossless compression is the preservation of audio quality, making it ideal for professional audio production, archiving, and situations where high fidelity is required. However, lossless files are significantly larger than their lossy counterparts, which can be a drawback for storage and (especially) streaming."}),"\n",(0,o.jsx)(i.admonition,{title:"Lossless Compression",type:"note",children:(0,o.jsxs)(i.p,{children:["If you would like to dive more deeply into the topic of lossless compression, you can check out the ",(0,o.jsx)(i.a,{href:"/docs/introduction/lossless",children:"Lossless Compression"})," entry in the Introduction section of the wiki."]})}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.a,{href:"/docs/audio/FLAC",children:"FLAC"}),", ",(0,o.jsx)(i.a,{href:"/docs/audio/WavPack",children:"WavPack"}),", & ",(0,o.jsx)(i.a,{href:"/docs/audio/ALAC",children:"ALAC"})," are examples of popular lossless audio codecs that you are likely to encounter in the wild."]}),"\n",(0,o.jsx)(i.h2,{id:"lossy-audio-compression",children:"Lossy Audio Compression"}),"\n",(0,o.jsx)(i.p,{children:"The primary advantage of lossy compression is the significant reduction in file size, making it ideal for streaming, portable devices, and situations where storage space is limited. However, the trade-off is a potential loss in audio quality, which may be noticeable in critical listening environments."}),"\n",(0,o.jsx)(i.admonition,{title:"Lossy Compression",type:"note",children:(0,o.jsxs)(i.p,{children:["If you would like to dive more deeply into the topic of lossy compression, you can check out the ",(0,o.jsx)(i.a,{href:"/docs/introduction/lossy",children:"Lossy Compression"})," entry in the Introduction section of the wiki."]})}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.a,{href:"/docs/audio/MP3",children:"MP3"}),", ",(0,o.jsx)(i.a,{href:"/docs/audio/AAC",children:"AAC"}),", ",(0,o.jsx)(i.a,{href:"/docs/audio/Vorbis",children:"Vorbis"}),", & ",(0,o.jsx)(i.a,{href:"/docs/audio/Opus",children:"Opus"})," are some examples of popular lossy audio codecs that you are likely to encounter in the wild."]}),"\n",(0,o.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,o.jsx)(i.p,{children:"Understanding these baseline principles of digital audio processing is essential for informed reading when it comes to the rest of the Audio section of this wiki. We hope this page helped you grasp some of the fundamental concepts that underpin digital audio processing."})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>a,x:()=>r});var o=s(6540);const n={},t=o.createContext(n);function a(e){const i=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/318608aa.25b04195.js b/assets/js/318608aa.25b04195.js deleted file mode 100644 index b09b2d3f1..000000000 --- a/assets/js/318608aa.25b04195.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6003],{3187:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=i(4848),s=i(8453);i(1470),i(9365);const r={title:"vpxenc",sidebar_position:8},l="vpxenc",c={id:"encoders/vpxenc",title:"vpxenc",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/vpxenc.mdx",sourceDirName:"encoders",slug:"/encoders/vpxenc",permalink:"/docs/encoders/vpxenc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/vpxenc.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"vpxenc",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"},next:{title:"SVT-VP9",permalink:"/docs/encoders/SVT-VP9"}},o={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installing (Binary)",id:"installing-binary",level:2},{value:"Compiling (Windows/MacOS/Linux)",id:"compiling-windowsmacoslinux",level:2},{value:"Cloning",id:"cloning",level:3},{value:"./configure file",id:"configure-file",level:3},{value:"Other ./configure options",id:"other-configure-options",level:3},{value:"Running GNU make",id:"running-gnu-make",level:3},{value:"VP8",id:"vp8",level:2},{value:"VP9",id:"vp9",level:2},{value:"Encoding",id:"encoding",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"vpxenc",children:"vpxenc"})}),"\n",(0,t.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc is part of the libvpx library for working with the ",(0,t.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,t.jsx)(n.a,{href:"/docs/video/VP8",children:"VP8"})," video codecs. It is capable of encoding & decoding both formats, where vpxenc is the multipurpose encoder. VP9 competes with ",(0,t.jsx)(n.a,{href:"/docs/video/HEVC",children:"HEVC"})," (h265) & ",(0,t.jsx)(n.a,{href:"/docs/video/AVC",children:"AVC"})," (h264) in coding efficiency, and has been superseded by ",(0,t.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"}),". VP8 competes with AVC."]}),"\n",(0,t.jsxs)(n.p,{children:["By default, vpxenc isn't as competitive as it could be, but even when used properly, most tests show that h265 offers slightly better quality per bit with efficient encoders like ",(0,t.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc is available in FFmpeg via ",(0,t.jsx)(n.code,{children:"libvpx"})," for ",(0,t.jsx)(n.strong,{children:"VP8"})," and ",(0,t.jsx)(n.code,{children:"libvpx-vp9"})," for ",(0,t.jsx)(n.strong,{children:"VP9"}),", to check if you have it, run ",(0,t.jsx)(n.code,{children:"ffmpeg -h encoder=libvpx"})," or ",(0,t.jsx)(n.code,{children:"ffmpeg -h encoder=libvpx-vp9"}),".\nNon-FFmpeg standard VP8/VP9 parameters are ",(0,t.jsx)(n.strong,{children:"not"})," supported."]}),"\n",(0,t.jsx)(n.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,t.jsx)(n.p,{children:"vpxenc supports the following color spaces:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Format"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,t.jsx)(n.th,{children:"Supported Bit Depth(s)"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUVA420P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"8-bit (Alpha Channel)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV440P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV440P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV440P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"12-bit"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"installing-binary",children:"Installing (Binary)"}),"\n",(0,t.jsxs)(n.p,{children:["Windows builds are available on Lastrosade's ",(0,t.jsx)(n.a,{href:"https://jeremylee.sh/bins/",children:"website"})," and can be downloaded ",(0,t.jsx)(n.a,{href:"https://jeremylee.sh/bins/vpx.7z",children:"here"}),"."]}),"\n",(0,t.jsx)(n.p,{children:'For Linux and MacOS, it may be be available when searching "vpxenc" or "libvpx" in their respective package managers.'}),"\n",(0,t.jsx)(n.h2,{id:"compiling-windowsmacoslinux",children:"Compiling (Windows/MacOS/Linux)"}),"\n",(0,t.jsxs)(n.p,{children:["Windows users are recommended to compile via MinGW-W64 which comes with ",(0,t.jsx)(n.a,{href:"https://msys2.org/",children:"MSYS2"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"nasm/yasm, and the GNU build tools (make, configure) are required for this operation."}),"\n",(0,t.jsx)(n.h3,{id:"cloning",children:"Cloning"}),"\n",(0,t.jsx)(n.p,{children:"First, cloning"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://chromium.googlesource.com/webm/libvpx\ncd libvpx\nmkdir libvpx_build && cd libvpx_build\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configure-file",children:"./configure file"}),"\n",(0,t.jsx)(n.p,{children:"Now here comes the annoying part, the configure file have really bad defaults. So you will need to adjust them, here are some recommended options you should use:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'../configure --cpu=native --extra-cxxflags="-flto" --extra-cflags="-flto" --as=auto --enable-vp9-highbitdepth --enable-libyuv --enable-webm-io --enable-vp9 --enable-runtime-cpu-detect --enable-internal-stats --enable-postproc --enable-vp9-postproc --enable-static --disable-shared --enable-vp9-temporal-denoising --disable-unit-tests --disable-docs --enable-multithread\n'})}),"\n",(0,t.jsx)(n.p,{children:"Now let's break down what each of them do."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--cpu=native"}),"\nNative CPU optimizations."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:'--extra-cxxflags="-flto" --extra-cflags="-flto"'}),"\nMore CPU optimizations for faster encoding."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--as=auto"}),"\nSet the assembler to auto, so it can choose between ",(0,t.jsx)(n.code,{children:"yasm"})," and ",(0,t.jsx)(n.code,{children:"nasm"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9-highbitdepth"}),"\nEnables high bit depth (>=10 bits) when encoding VP9."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-libyuv"}),"\nEnables YUV4MPEG input support (IMPORTANT), otherwise it will only accept RAW."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-webm-io"}),"\nEnables input and output support for WebM container."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9"}),"\nEnables VP9 encoding support."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-runtime-cpu-detect"}),"\nEnables runtime CPU detection."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-internal-stats"}),"\nEnables internal statistics for the encoder for debug purposes."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-postproc"}),"\nEnables postprocessing stuff for better video quality."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9-postproc"}),"\nEnables VP9-specific postprocessing stuff for better video quality."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-static"}),"\nEnables static builds."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-shared"}),"\nDisables shared builds."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9-temporal-denoising"}),"\nDisables spatial denoising for VP9 and enables temporal instead."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-unit-tests"}),"\nDisables unit tests, unless you want to test the encoder as a developer. This should be disabled."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-docs"}),"\nDisables documentation, as enabling this also requires doxygen."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-multithread"}),"\nEnables the usage of multiple CPU threads for encoding and decoding."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"other-configure-options",children:"Other ./configure options"}),"\n",(0,t.jsx)(n.p,{children:"There are other options you may want use to either speed up compiliation or drop unwanted features."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-vp8 --disable-vp9-decoder --disable-vp8-decoder"}),"\nDisables VP8 encoding and ",(0,t.jsx)(n.code,{children:"vpxdec"})," (decoder) to be compiled."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-small"}),"\nPrioritizes smaller encoder binary size over encoding speed."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--target="}),"\nEnables target compilation for a specific operating system or CPU architecture. There's a lot of them. Here's an exhaustive list of all of them based on the configure file:"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"arm64-android-gcc\narm64-darwin-gcc\narm64-darwin20-gcc\narm64-darwin21-gcc\narm64-darwin22-gcc\narm64-darwin23-gcc\narm64-linux-gcc\narm64-win64-gcc\narm64-win64-vs15\narm64-win64-vs16\narm64-win64-vs16-clangcl\narm64-win64-vs17\narm64-win64-vs17-clangcl\narmv7-android-gcc\narmv7-darwin-gcc\narmv7-linux-rvct\narmv7-linux-gcc\narmv7-none-rvct\narmv7-win32-gcc\narmv7-win32-vs14\narmv7-win32-vs15\narmv7-win32-vs16\narmv7-win32-vs17\narmv7s-darwin-gcc\narmv8-linux-gcc\nloongarch32-linux-gcc\nloongarch64-linux-gcc\nmips32-linux-gcc\nmips64-linux-gcc\nppc64le-linux-gcc\nsparc-solaris-gcc\nx86-android-gcc\nx86-darwin8-gcc\nx86-darwin8-icc\nx86-darwin9-gcc\nx86-darwin9-icc\nx86-darwin10-gcc\nx86-darwin11-gcc\nx86-darwin12-gcc\nx86-darwin13-gcc\nx86-darwin14-gcc\nx86-darwin15-gcc\nx86-darwin16-gcc\nx86-darwin17-gcc\nx86-iphonesimulator-gcc\nx86-linux-gcc\nx86-linux-icc\nx86-os2-gcc\nx86-solaris-gcc\nx86-win32-gcc\nx86-win32-vs14\nx86-win32-vs15\nx86-win32-vs16\nx86-win32-vs17\nx86_64-android-gcc\nx86_64-darwin9-gcc\nx86_64-darwin10-gcc\nx86_64-darwin11-gcc\nx86_64-darwin12-gcc\nx86_64-darwin13-gcc\nx86_64-darwin14-gcc\nx86_64-darwin15-gcc\nx86_64-darwin16-gcc\nx86_64-darwin17-gcc\nx86_64-darwin18-gcc\nx86_64-darwin19-gcc\nx86_64-darwin20-gcc\nx86_64-darwin21-gcc\nx86_64-darwin22-gcc\nx86_64-darwin23-gcc\nx86_64-iphonesimulator-gcc\nx86_64-linux-gcc\nx86_64-linux-icc\nx86_64-solaris-gcc\nx86_64-win64-gcc\nx86_64-win64-vs14\nx86_64-win64-vs15\nx86_64-win64-vs16\nx86_64-win64-vs17\ngeneric-gnu\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For ",(0,t.jsx)(n.strong,{children:"Windows"})," compilation with MinGW you may need to use ",(0,t.jsx)(n.code,{children:"--target=x86_64-win64-gcc"})," and ",(0,t.jsx)(n.code,{children:"--target=arm64-darwin22-gcc"})," for ",(0,t.jsx)(n.strong,{children:"MacOS"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"running-gnu-make",children:"Running GNU make"}),"\n",(0,t.jsxs)(n.p,{children:["After successfully running the configure command above, run ",(0,t.jsx)(n.code,{children:"make -j $(nproc)"})," to start compiling with your CPU count. The resulting binary will be called ",(0,t.jsx)(n.code,{children:"vpxenc"})," and you can copy it wherever you like."]}),"\n",(0,t.jsx)(n.h2,{id:"vp8",children:"VP8"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Incomplete"})}),"\n",(0,t.jsx)(n.h2,{id:"vp9",children:"VP9"}),"\n",(0,t.jsxs)(n.p,{children:["For encoding VP9, vpxenc's default parameters are not considered optimal. There are a lot of options that are either disabled without reason or are simply misconfigured, hurting coding efficiency at little cost otherwise. As of mid-2021, some parameters (the TPL-model, lag-in-frames and auto-alt-ref frames) were changed (since libvpx 1.9.0 and libvpx 1.10.0) which means that there's not much use of setting these three parameters unless you're in ",(0,t.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),". This section covers the most important options libvpx-vp9 has to offer, recommended settings, & what they do."]}),"\n",(0,t.jsx)(n.p,{children:"It is important to note that the vpxenc parameters provided below are considered optimal because they are efficient, but VP9 Profile 2 isn't compatible with many hardware-accelerated VP9 decoding implementations."}),"\n",(0,t.jsx)(n.h3,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--codec=vp9"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Self-explanatory."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--passes=2"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc's 2-pass mode is quite fast compared to 2-pass in ",(0,t.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"})," and x265. Only use 1-pass mode for real-time applications, which won't be covered here yet. It is the default in the standalone vpxenc libvpx-vp9 encoder."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--webm"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Enables WebM output for the encoder, and passes the encoder flags set. It is not necessary to enable it, but since it passes the encoder flags, I would use it. Can be changed to ",(0,t.jsx)(n.code,{children:"--ivf"})," for an ivf video stream."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--good"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This is a sort of quality deadline, the minimum speed the encoder is allowed to go to. It isn't recommended to use ",(0,t.jsx)(n.code,{children:"--best"})," as it is slow for the quality uplift you get. Do not use RT for anything but real-time encoding."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--threads=8"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Dictates the number of threads the encoder should spawn. It doesn\u2019t mean it\u2019ll scale all that well over those 8 threads. On a 16 thread CPU with a single encoder instance, I would use 8 threads. With multiple encoder instance encoding(with qencoder/av1an/neav1e), I would set it to 2 threads."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--profile=2"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"VP9 profile 2 is obligatory if you want 10-bit & 12-bit support for HDR, and improved quality from 8-bit."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--lag-in-frames=25"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Lag-in-frames is the libvpx equivalent of lookahead in x264. The higher the number, the slower the encoder will be, but at the upside of making it more efficient. Going above \u2013lag-in-frames=12 also activates another setting called alternate reference frames. 25 is the maximum you can get in libvpx-vp9. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--end-usage=q"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Q mode is the closest equivalent to CRF that libvpx-vp9 offers, so use it if maximum quality is desired."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--cq-level=25"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"For 1080p30 8-bit content, it is recommended to go with a Q of 25; you can go lower if you value higher quality over pure efficiency. For 1080p60 8-bit content, I would recommend going with a higher Q value with a delta of around 15. So, a Q of 30 to 40 is usually recommended. Depending on the content, you may have to tune this value, so this advice is only useful in choosing a starting point."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--kf-max-dist=[input FPS * 10]"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This tells the encoder to have a maximum number of frames between keyframes. It will usually place a lower number of keyframes in content like movies, TV shows, or animated shows, so you can set it to a very high number or not set it at all if you want maximum efficiency for this kind of content. Otherwise, I would go with the 10-second rule: ",(0,t.jsx)(n.code,{children:"--kf-max-dist=240"})," for 24FPS content, 300 for 30FPS content, 600 for 60FPS content, and so on."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--cpu-used=3"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This is where the biggest balance of quality to speed is with libvpx-vp9. This is similar to presets in x264 and x265, except the lower the number, the slower the encoder takes. Using ",(0,t.jsx)(n.code,{children:"--cpu-used=3"})," & below enables RDO, which increases quality at the expense of speed."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--cpu-used=5"})," and above are ",(0,t.jsx)(n.em,{children:"slower"})," in the 1st pass, so it isn't recommended to use them anyway."]})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--auto-alt-ref=6"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'Activates alternate reference frames. Alternate reference frames are "invisible" frames which are used as references when creating the final display frames.'}),"\n",(0,t.jsx)(n.p,{children:"More alternate reference frames is typically more efficient. Setting this greater than 1 activates overlay frames and isn't compatible with the 8-bit color profiles."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--arnr-maxframes=7"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This is the maximum number of alternate reference frames the encoder is allowed to use. For most content, 7 is usually a good bet, and it is the default. With animated content, going with a value of 12 or to the max is a good bet, as animated content benefits from more additional alt-ref frames than other content. Be aware that increasing this value will impact encode speed."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--arnr-strength=4"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This setting dictates how much denoising will occur in the alt-ref frames. Lowering it to 2 or 3 is usually a good bet for noisier/grainy content to try and retain more detail, but 4 is a sane starting place. The default setting is 5, which is fine for most content, but it can be beneficial going a bit lower. For animation, keeping the default of 5 is likely a better option."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--aq-mode=0"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Adaptive quantization is the way for an encoder to spend more bits in certain areas to improve ",(0,t.jsx)(n.a,{href:"/docs/introduction/psychovisual",children:"psychovisual fidelity"}),". ",(0,t.jsx)(n.code,{children:"--aq-mode=0"})," works well on clean content (animation, video games, screen content). ",(0,t.jsx)(n.code,{children:"--aq-mode=2"})," is recommended when you want to give more detail to more complex parts of a video."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--frame-boost=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This flag lets the encoder periodically boost the bitrate of a scene/frame if it needs it. Leaving it at the default ",(0,t.jsx)(n.code,{children:"--frame-boost=0"})," is usually a good bet, & this isn't a particularly salient change."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tune-content=default"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This determines how the encoder is tuned. In libvpx-vp9, there are three options: ",(0,t.jsx)(n.code,{children:"default"}),", ",(0,t.jsx)(n.code,{children:"screen"}),", and ",(0,t.jsx)(n.code,{children:"film"}),". Default is for most scenarios, screen is for screen content(video games, live-streaming content like web pages & your screen), and film is for heavily dithered/grainy video. Leaving it at the default for about everything but screen content as described above is probably the best option. ",(0,t.jsx)(n.code,{children:"--tune-content=screen"})," with ",(0,t.jsx)(n.code,{children:"--aq-mode=2"})," is not recommended, as it creates some odd artifacts. It is advised to use ",(0,t.jsx)(n.code,{children:"--aq-mode=0"})," if ",(0,t.jsx)(n.code,{children:"--tune-content=screen"})," is activated, or if you want better perceptual quality, ",(0,t.jsx)(n.code,{children:"--aq-mode=1"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--row-mt=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Enables row multi-threading in libvpx-vp9. ",(0,t.jsx)(n.em,{children:"Always"})," enable it no matter what, as it does not hurt efficiency, but boosts speed considerably. This feature is disabled by default."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--bit-depth=10"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Always use 10-bit for maximum efficiency & minimal banding, even with an 8-bit source. Make sure to enable ",(0,t.jsx)(n.code,{children:"--profile=2"})," as mentioned above."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tile-columns=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This setting divides the video into tile columns for easier parallelization when encoding & decoding. Setting ",(0,t.jsx)(n.code,{children:"--tile-columns=1"}),", you will get 2\xb9 tile columns. Setting it higher is a trade-off between parallelization & coding efficiency, as more tiles means less information your encoder can work with, and this will result in decreased efficiency. Do note there is an upper threshold in regards to the number of tile columns you can get due to the fixed minimum tile width of 256 pixels. So, this means 4 tile columns (2\xb2) for 720p and 1080p, 8 tile columns (2\u2074) for 1440p/4k, and so on. If you set a tile column number that is too high, it will drop down to the lowest supported number of tile columns at the input resolution."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tile-rows=0"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This setting divides the video into tile rows. This option is different from columns because although it also makes decoding performance higher, it does not scale as well as tile columns & doesn\u2019t increase encoder threading nearly as much. Always use more tile-columns than rows, or leave the number of tile rows at default (0). Leaving the encoder defaults at ",(0,t.jsx)(n.code,{children:"--tile-rows=0"})," & ",(0,t.jsx)(n.code,{children:"--tile-columns=0"})," will result in the highest overall coding efficiency possible with these options."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--enable-tpl=1"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This option enables a temporal layer model, which helps with coding efficiency. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,t.jsx)(n.p,{children:"All of these options are only available for the standalone vpxenc program. Here is a sample FFmpeg command line interpretation of the commands above, with some options missing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 1 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 3 -auto-alt-ref 6 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tune-content default -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 -f null -\nffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 2 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 3 -auto-alt-ref 6 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tune-content default -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 output.mkv\n"})}),"\n",(0,t.jsx)(n.p,{children:"Alternatively, you can pass a raw .y4m stream to standalone vpxenc & encode that way."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"VP9 section written based on work by BlueSwordM, who has granted written permission for this wiki page to exist in its current fashion"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>l});i(6540);var t=i(4164);const s={tabItem:"tabItem_Ymn6"};var r=i(4848);function l(e){let{children:n,hidden:i,className:l}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,l),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>y});var t=i(6540),s=i(4164),r=i(3104),l=i(6347),c=i(205),o=i(7485),a=i(1682),d=i(679);function h(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:t,default:s}}=e;return{value:n,label:i,attributes:t,default:s}}))}(i);return function(e){const n=(0,a.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function x(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const s=(0,l.W6)(),r=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(r),(0,t.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(s.location.search);n.set(r,e),s.replace({...s.location,search:n.toString()})}),[r,s])]}function m(e){const{defaultValue:n,queryString:i=!1,groupId:s}=e,r=u(e),[l,o]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!x({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=i.find((e=>e.default))??i[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:r}))),[a,h]=p({queryString:i,groupId:s}),[m,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,r]=(0,d.Dv)(i);return[s,(0,t.useCallback)((e=>{i&&r.set(e)}),[i,r])]}({groupId:s}),j=(()=>{const e=a??m;return x({value:e,tabValues:r})?e:null})();(0,c.A)((()=>{j&&o(j)}),[j]);return{selectedValue:l,selectValue:(0,t.useCallback)((e=>{if(!x({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),f(e)}),[h,f,r]),tabValues:r}}var f=i(2303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=i(4848);function b(e){let{className:n,block:i,selectedValue:t,selectValue:l,tabValues:c}=e;const o=[],{blockElementScrollPositionUntilNextRender:a}=(0,r.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),s=c[i].value;s!==t&&(a(n),l(s))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":i},n),children:c.map((e=>{let{value:n,label:i,attributes:r}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",j.tabItem,r?.className,{"tabs__item--active":t===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:r}=e;const l=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===r));return e?(0,t.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function w(e){const n=m(e);return(0,g.jsxs)("div",{className:(0,s.A)("tabs-container",j.tabList),children:[(0,g.jsx)(b,{...n,...e}),(0,g.jsx)(v,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,g.jsx)(w,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>c});var t=i(6540);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/318608aa.d1f8abdb.js b/assets/js/318608aa.d1f8abdb.js new file mode 100644 index 000000000..0beb1b1dc --- /dev/null +++ b/assets/js/318608aa.d1f8abdb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6003],{3239:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>h,frontMatter:()=>l,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"encoders/vpxenc","title":"vpxenc","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/encoders/vpxenc.mdx","sourceDirName":"encoders","slug":"/encoders/vpxenc","permalink":"/docs/encoders/vpxenc","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/vpxenc.mdx","tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"title":"vpxenc","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"Aurora1 AV1","permalink":"/docs/encoders/Aurora1"},"next":{"title":"SVT-VP9","permalink":"/docs/encoders/SVT-VP9"}}');var s=i(4848),r=i(8453);i(1470),i(9365);const l={title:"vpxenc",sidebar_position:8},c="vpxenc",o={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installing (Binary)",id:"installing-binary",level:2},{value:"Compiling (Windows/MacOS/Linux)",id:"compiling-windowsmacoslinux",level:2},{value:"Cloning",id:"cloning",level:3},{value:"./configure file",id:"configure-file",level:3},{value:"Other ./configure options",id:"other-configure-options",level:3},{value:"Running GNU make",id:"running-gnu-make",level:3},{value:"VP8",id:"vp8",level:2},{value:"VP9",id:"vp9",level:2},{value:"Encoding",id:"encoding",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"vpxenc",children:"vpxenc"})}),"\n",(0,s.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsxs)(n.p,{children:["vpxenc is part of the libvpx library for working with the ",(0,s.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,s.jsx)(n.a,{href:"/docs/video/VP8",children:"VP8"})," video codecs. It is capable of encoding & decoding both formats, where vpxenc is the multipurpose encoder. VP9 competes with ",(0,s.jsx)(n.a,{href:"/docs/video/HEVC",children:"HEVC"})," (h265) & ",(0,s.jsx)(n.a,{href:"/docs/video/AVC",children:"AVC"})," (h264) in coding efficiency, and has been superseded by ",(0,s.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"}),". VP8 competes with AVC."]}),"\n",(0,s.jsxs)(n.p,{children:["By default, vpxenc isn't as competitive as it could be, but even when used properly, most tests show that h265 offers slightly better quality per bit with efficient encoders like ",(0,s.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(n.p,{children:["vpxenc is available in FFmpeg via ",(0,s.jsx)(n.code,{children:"libvpx"})," for ",(0,s.jsx)(n.strong,{children:"VP8"})," and ",(0,s.jsx)(n.code,{children:"libvpx-vp9"})," for ",(0,s.jsx)(n.strong,{children:"VP9"}),", to check if you have it, run ",(0,s.jsx)(n.code,{children:"ffmpeg -h encoder=libvpx"})," or ",(0,s.jsx)(n.code,{children:"ffmpeg -h encoder=libvpx-vp9"}),".\nNon-FFmpeg standard VP8/VP9 parameters are ",(0,s.jsx)(n.strong,{children:"not"})," supported."]}),"\n",(0,s.jsx)(n.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,s.jsx)(n.p,{children:"vpxenc supports the following color spaces:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Format"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,s.jsx)(n.th,{children:"Supported Bit Depth(s)"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUVA420P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"8-bit (Alpha Channel)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV440P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV440P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV440P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"12-bit"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"installing-binary",children:"Installing (Binary)"}),"\n",(0,s.jsxs)(n.p,{children:["Windows builds are available on Lastrosade's ",(0,s.jsx)(n.a,{href:"https://jeremylee.sh/bins/",children:"website"})," and can be downloaded ",(0,s.jsx)(n.a,{href:"https://jeremylee.sh/bins/vpx.7z",children:"here"}),"."]}),"\n",(0,s.jsx)(n.p,{children:'For Linux and MacOS, it may be be available when searching "vpxenc" or "libvpx" in their respective package managers.'}),"\n",(0,s.jsx)(n.h2,{id:"compiling-windowsmacoslinux",children:"Compiling (Windows/MacOS/Linux)"}),"\n",(0,s.jsxs)(n.p,{children:["Windows users are recommended to compile via MinGW-W64 which comes with ",(0,s.jsx)(n.a,{href:"https://msys2.org/",children:"MSYS2"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"nasm/yasm, and the GNU build tools (make, configure) are required for this operation."}),"\n",(0,s.jsx)(n.h3,{id:"cloning",children:"Cloning"}),"\n",(0,s.jsx)(n.p,{children:"First, cloning"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://chromium.googlesource.com/webm/libvpx\ncd libvpx\nmkdir libvpx_build && cd libvpx_build\n"})}),"\n",(0,s.jsx)(n.h3,{id:"configure-file",children:"./configure file"}),"\n",(0,s.jsx)(n.p,{children:"Now here comes the annoying part, the configure file have really bad defaults. So you will need to adjust them, here are some recommended options you should use:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'../configure --cpu=native --extra-cxxflags="-ffat-lto-objects -flto" --extra-cflags="-ffat-lto-objects -flto" --as=auto --enable-vp9-highbitdepth --enable-libyuv --enable-webm-io --enable-vp9 --enable-runtime-cpu-detect --enable-internal-stats --enable-postproc --enable-vp9-postproc --enable-static --disable-shared --enable-vp9-temporal-denoising --disable-unit-tests --disable-docs --enable-multithread\n'})}),"\n",(0,s.jsx)(n.p,{children:"Now let's break down what each of them do."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu=native"}),"\nNative CPU optimizations."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'--extra-cxxflags="-ffat-lto-objects -flto" --extra-cflags="-ffat-lto-objects -flto"'}),"\nMore CPU optimizations for faster encoding."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--as=auto"}),"\nSet the assembler to auto, so it can choose between ",(0,s.jsx)(n.code,{children:"yasm"})," and ",(0,s.jsx)(n.code,{children:"nasm"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-vp9-highbitdepth"}),"\nEnables high bit depth (>=10 bits) when encoding VP9."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-libyuv"}),"\nEnables YUV4MPEG input support (IMPORTANT), otherwise it will only accept RAW."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-webm-io"}),"\nEnables input and output support for WebM container."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-vp9"}),"\nEnables VP9 encoding support."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-runtime-cpu-detect"}),"\nEnables runtime CPU detection."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-internal-stats"}),"\nEnables internal statistics for the encoder for debug purposes."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-postproc"}),"\nEnables postprocessing stuff for better video quality."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-vp9-postproc"}),"\nEnables VP9-specific postprocessing stuff for better video quality."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-static"}),"\nEnables static builds."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-shared"}),"\nDisables shared builds."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-vp9-temporal-denoising"}),"\nDisables spatial denoising for VP9 and enables temporal instead."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-unit-tests"}),"\nDisables unit tests, unless you want to test the encoder as a developer. This should be disabled."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-docs"}),"\nDisables documentation, as enabling this also requires doxygen."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-multithread"}),"\nEnables the usage of multiple CPU threads for encoding and decoding."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"other-configure-options",children:"Other ./configure options"}),"\n",(0,s.jsx)(n.p,{children:"There are other options you may want use to either speed up compiliation or drop unwanted features."}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-vp8 --disable-vp9-decoder --disable-vp8-decoder"}),"\nDisables VP8 encoding and ",(0,s.jsx)(n.code,{children:"vpxdec"})," (decoder) to be compiled."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-small"}),"\nPrioritizes smaller encoder binary size over encoding speed."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--target="}),"\nEnables target compilation for a specific operating system or CPU architecture. There's a lot of them. Here's an exhaustive list of all of them based on the configure file:"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"arm64-android-gcc\narm64-darwin-gcc\narm64-darwin20-gcc\narm64-darwin21-gcc\narm64-darwin22-gcc\narm64-darwin23-gcc\narm64-linux-gcc\narm64-win64-gcc\narm64-win64-vs15\narm64-win64-vs16\narm64-win64-vs16-clangcl\narm64-win64-vs17\narm64-win64-vs17-clangcl\narmv7-android-gcc\narmv7-darwin-gcc\narmv7-linux-rvct\narmv7-linux-gcc\narmv7-none-rvct\narmv7-win32-gcc\narmv7-win32-vs14\narmv7-win32-vs15\narmv7-win32-vs16\narmv7-win32-vs17\narmv7s-darwin-gcc\narmv8-linux-gcc\nloongarch32-linux-gcc\nloongarch64-linux-gcc\nmips32-linux-gcc\nmips64-linux-gcc\nppc64le-linux-gcc\nsparc-solaris-gcc\nx86-android-gcc\nx86-darwin8-gcc\nx86-darwin8-icc\nx86-darwin9-gcc\nx86-darwin9-icc\nx86-darwin10-gcc\nx86-darwin11-gcc\nx86-darwin12-gcc\nx86-darwin13-gcc\nx86-darwin14-gcc\nx86-darwin15-gcc\nx86-darwin16-gcc\nx86-darwin17-gcc\nx86-iphonesimulator-gcc\nx86-linux-gcc\nx86-linux-icc\nx86-os2-gcc\nx86-solaris-gcc\nx86-win32-gcc\nx86-win32-vs14\nx86-win32-vs15\nx86-win32-vs16\nx86-win32-vs17\nx86_64-android-gcc\nx86_64-darwin9-gcc\nx86_64-darwin10-gcc\nx86_64-darwin11-gcc\nx86_64-darwin12-gcc\nx86_64-darwin13-gcc\nx86_64-darwin14-gcc\nx86_64-darwin15-gcc\nx86_64-darwin16-gcc\nx86_64-darwin17-gcc\nx86_64-darwin18-gcc\nx86_64-darwin19-gcc\nx86_64-darwin20-gcc\nx86_64-darwin21-gcc\nx86_64-darwin22-gcc\nx86_64-darwin23-gcc\nx86_64-iphonesimulator-gcc\nx86_64-linux-gcc\nx86_64-linux-icc\nx86_64-solaris-gcc\nx86_64-win64-gcc\nx86_64-win64-vs14\nx86_64-win64-vs15\nx86_64-win64-vs16\nx86_64-win64-vs17\ngeneric-gnu\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For ",(0,s.jsx)(n.strong,{children:"Windows"})," compilation with MinGW you may need to use ",(0,s.jsx)(n.code,{children:"--target=x86_64-win64-gcc"})," and ",(0,s.jsx)(n.code,{children:"--target=arm64-darwin22-gcc"})," for ",(0,s.jsx)(n.strong,{children:"MacOS"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"running-gnu-make",children:"Running GNU make"}),"\n",(0,s.jsxs)(n.p,{children:["After successfully running the configure command above, run ",(0,s.jsx)(n.code,{children:"make -j $(nproc)"})," to start compiling with your CPU count. The resulting binary will be called ",(0,s.jsx)(n.code,{children:"vpxenc"})," and you can copy it wherever you like."]}),"\n",(0,s.jsx)(n.h2,{id:"vp8",children:"VP8"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"Incomplete"})}),"\n",(0,s.jsx)(n.h2,{id:"vp9",children:"VP9"}),"\n",(0,s.jsxs)(n.p,{children:["For encoding VP9, vpxenc's default parameters are not considered optimal. There are a lot of options that are either disabled without reason or are simply misconfigured, hurting coding efficiency at little cost otherwise. As of mid-2021, some parameters (the TPL-model, lag-in-frames and auto-alt-ref frames) were changed (since libvpx 1.9.0 and libvpx 1.10.0) which means that there's not much use of setting these three parameters unless you're in ",(0,s.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),". This section covers the most important options libvpx-vp9 has to offer, recommended settings, & what they do."]}),"\n",(0,s.jsx)(n.p,{children:"It is important to note that the vpxenc parameters provided below are considered optimal because they are efficient, but VP9 Profile 2 isn't compatible with many hardware-accelerated VP9 decoding implementations."}),"\n",(0,s.jsx)(n.h3,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--codec=vp9"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Self-explanatory."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--passes=2"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["vpxenc's 2-pass mode is quite fast compared to 2-pass in ",(0,s.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"})," and x265. Only use 1-pass mode for real-time applications, which won't be covered here yet. It is the default in the standalone vpxenc libvpx-vp9 encoder."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--webm"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Enables WebM output for the encoder, and passes the encoder flags set. It is not necessary to enable it, but since it passes the encoder flags, I would use it. Can be changed to ",(0,s.jsx)(n.code,{children:"--ivf"})," for an ivf video stream."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--good"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This is a sort of quality deadline, the minimum speed the encoder is allowed to go to. It isn't recommended to use ",(0,s.jsx)(n.code,{children:"--best"})," as it is slow for the quality uplift you get. Do not use RT for anything but real-time encoding."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--threads=8"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Dictates the number of threads the encoder should spawn. It doesn\u2019t mean it\u2019ll scale all that well over those 8 threads. On a 16 thread CPU with a single encoder instance, I would use 8 threads. With multiple encoder instance encoding(with qencoder/av1an/neav1e), I would set it to 2 threads."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--profile=2"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"VP9 profile 2 is obligatory if you want 10-bit & 12-bit support for HDR, and improved quality from 8-bit."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--lag-in-frames=25"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Lag-in-frames is the libvpx equivalent of lookahead in x264. The higher the number, the slower the encoder will be, but at the upside of making it more efficient. Going above \u2013lag-in-frames=12 also activates another setting called alternate reference frames. 25 is the maximum you can get in libvpx-vp9. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--end-usage=q"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Q mode is the closest equivalent to CRF that libvpx-vp9 offers, so use it if maximum quality is desired."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--cq-level=25"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For 1080p30 8-bit content, it is recommended to go with a Q of 25; you can go lower if you value higher quality over pure efficiency. For 1080p60 8-bit content, I would recommend going with a higher Q value with a delta of around 15. So, a Q of 30 to 40 is usually recommended. Depending on the content, you may have to tune this value, so this advice is only useful in choosing a starting point."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--kf-max-dist=[input FPS * 10]"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This tells the encoder to have a maximum number of frames between keyframes. It will usually place a lower number of keyframes in content like movies, TV shows, or animated shows, so you can set it to a very high number or not set it at all if you want maximum efficiency for this kind of content. Otherwise, I would go with the 10-second rule: ",(0,s.jsx)(n.code,{children:"--kf-max-dist=240"})," for 24FPS content, 300 for 30FPS content, 600 for 60FPS content, and so on."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--cpu-used=3"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This is where the biggest balance of quality to speed is with libvpx-vp9. This is similar to presets in x264 and x265, except the lower the number, the slower the encoder takes. Using ",(0,s.jsx)(n.code,{children:"--cpu-used=3"})," & below enables RDO, which increases quality at the expense of speed."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=5"})," and above are ",(0,s.jsx)(n.em,{children:"slower"})," in the 1st pass, so it isn't recommended to use them anyway."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--auto-alt-ref=6"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'Activates alternate reference frames. Alternate reference frames are "invisible" frames which are used as references when creating the final display frames.'}),"\n",(0,s.jsx)(n.p,{children:"More alternate reference frames is typically more efficient. Setting this greater than 1 activates overlay frames and isn't compatible with the 8-bit color profiles."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--arnr-maxframes=7"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"This is the maximum number of alternate reference frames the encoder is allowed to use. For most content, 7 is usually a good bet, and it is the default. With animated content, going with a value of 12 or to the max is a good bet, as animated content benefits from more additional alt-ref frames than other content. Be aware that increasing this value will impact encode speed."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--arnr-strength=4"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"This setting dictates how much denoising will occur in the alt-ref frames. Lowering it to 2 or 3 is usually a good bet for noisier/grainy content to try and retain more detail, but 4 is a sane starting place. The default setting is 5, which is fine for most content, but it can be beneficial going a bit lower. For animation, keeping the default of 5 is likely a better option."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--aq-mode=0"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Adaptive quantization is the way for an encoder to spend more bits in certain areas to improve ",(0,s.jsx)(n.a,{href:"/docs/introduction/psychovisual",children:"psychovisual fidelity"}),". ",(0,s.jsx)(n.code,{children:"--aq-mode=0"})," works well on clean content (animation, video games, screen content). ",(0,s.jsx)(n.code,{children:"--aq-mode=2"})," is recommended when you want to give more detail to more complex parts of a video."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--frame-boost=1"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This flag lets the encoder periodically boost the bitrate of a scene/frame if it needs it. Leaving it at the default ",(0,s.jsx)(n.code,{children:"--frame-boost=0"})," is usually a good bet, & this isn't a particularly salient change."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--tune-content=default"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This determines how the encoder is tuned. In libvpx-vp9, there are three options: ",(0,s.jsx)(n.code,{children:"default"}),", ",(0,s.jsx)(n.code,{children:"screen"}),", and ",(0,s.jsx)(n.code,{children:"film"}),". Default is for most scenarios, screen is for screen content(video games, live-streaming content like web pages & your screen), and film is for heavily dithered/grainy video. Leaving it at the default for about everything but screen content as described above is probably the best option. ",(0,s.jsx)(n.code,{children:"--tune-content=screen"})," with ",(0,s.jsx)(n.code,{children:"--aq-mode=2"})," is not recommended, as it creates some odd artifacts. It is advised to use ",(0,s.jsx)(n.code,{children:"--aq-mode=0"})," if ",(0,s.jsx)(n.code,{children:"--tune-content=screen"})," is activated, or if you want better perceptual quality, ",(0,s.jsx)(n.code,{children:"--aq-mode=1"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--row-mt=1"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Enables row multi-threading in libvpx-vp9. ",(0,s.jsx)(n.em,{children:"Always"})," enable it no matter what, as it does not hurt efficiency, but boosts speed considerably. This feature is disabled by default."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--bit-depth=10"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Always use 10-bit for maximum efficiency & minimal banding, even with an 8-bit source. Make sure to enable ",(0,s.jsx)(n.code,{children:"--profile=2"})," as mentioned above."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--tile-columns=1"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This setting divides the video into tile columns for easier parallelization when encoding & decoding. Setting ",(0,s.jsx)(n.code,{children:"--tile-columns=1"}),", you will get 2\xb9 tile columns. Setting it higher is a trade-off between parallelization & coding efficiency, as more tiles means less information your encoder can work with, and this will result in decreased efficiency. Do note there is an upper threshold in regards to the number of tile columns you can get due to the fixed minimum tile width of 256 pixels. So, this means 4 tile columns (2\xb2) for 720p and 1080p, 8 tile columns (2\u2074) for 1440p/4k, and so on. If you set a tile column number that is too high, it will drop down to the lowest supported number of tile columns at the input resolution."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--tile-rows=0"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This setting divides the video into tile rows. This option is different from columns because although it also makes decoding performance higher, it does not scale as well as tile columns & doesn\u2019t increase encoder threading nearly as much. Always use more tile-columns than rows, or leave the number of tile rows at default (0). Leaving the encoder defaults at ",(0,s.jsx)(n.code,{children:"--tile-rows=0"})," & ",(0,s.jsx)(n.code,{children:"--tile-columns=0"})," will result in the highest overall coding efficiency possible with these options."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"--enable-tpl=1"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"This option enables a temporal layer model, which helps with coding efficiency. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,s.jsx)(n.p,{children:"All of these options are only available for the standalone vpxenc program. Here is a sample FFmpeg command line interpretation of the commands above, with some options missing:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 1 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 3 -auto-alt-ref 6 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tune-content default -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 -f null -\nffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 2 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 3 -auto-alt-ref 6 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tune-content default -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 output.mkv\n"})}),"\n",(0,s.jsx)(n.p,{children:"Alternatively, you can pass a raw .y4m stream to standalone vpxenc & encode that way."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"VP9 section written based on work by BlueSwordM, who has granted written permission for this wiki page to exist in its current fashion"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>l});i(6540);var t=i(4164);const s={tabItem:"tabItem_Ymn6"};var r=i(4848);function l(e){let{children:n,hidden:i,className:l}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,l),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>y});var t=i(6540),s=i(4164),r=i(3104),l=i(6347),c=i(205),o=i(7485),a=i(1682),d=i(679);function h(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:t,default:s}}=e;return{value:n,label:i,attributes:t,default:s}}))}(i);return function(e){const n=(0,a.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function x(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const s=(0,l.W6)(),r=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(r),(0,t.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(s.location.search);n.set(r,e),s.replace({...s.location,search:n.toString()})}),[r,s])]}function m(e){const{defaultValue:n,queryString:i=!1,groupId:s}=e,r=u(e),[l,o]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!x({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=i.find((e=>e.default))??i[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:r}))),[a,h]=p({queryString:i,groupId:s}),[m,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,r]=(0,d.Dv)(i);return[s,(0,t.useCallback)((e=>{i&&r.set(e)}),[i,r])]}({groupId:s}),j=(()=>{const e=a??m;return x({value:e,tabValues:r})?e:null})();(0,c.A)((()=>{j&&o(j)}),[j]);return{selectedValue:l,selectValue:(0,t.useCallback)((e=>{if(!x({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),f(e)}),[h,f,r]),tabValues:r}}var f=i(2303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=i(4848);function b(e){let{className:n,block:i,selectedValue:t,selectValue:l,tabValues:c}=e;const o=[],{blockElementScrollPositionUntilNextRender:a}=(0,r.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),s=c[i].value;s!==t&&(a(n),l(s))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":i},n),children:c.map((e=>{let{value:n,label:i,attributes:r}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",j.tabItem,r?.className,{"tabs__item--active":t===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:r}=e;const l=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===r));return e?(0,t.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function w(e){const n=m(e);return(0,g.jsxs)("div",{className:(0,s.A)("tabs-container",j.tabList),children:[(0,g.jsx)(b,{...n,...e}),(0,g.jsx)(v,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,g.jsx)(w,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>c});var t=i(6540);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/32987299.8275d921.js b/assets/js/32987299.8275d921.js new file mode 100644 index 000000000..8b1661761 --- /dev/null +++ b/assets/js/32987299.8275d921.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7754],{8860:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"filtering/vapoursynth","title":"Vapoursynth","description":"VapourSynth is an application for video manipulation. Or a plugin. Or a library. It\u2019s hard to tell because it has a core library written in C++ and a Python module to allow video scripts to be created.","source":"@site/docs/filtering/vapoursynth.mdx","sourceDirName":"filtering","slug":"/filtering/vapoursynth","permalink":"/docs/filtering/vapoursynth","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/vapoursynth.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Vapoursynth","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"WebVTT","permalink":"/docs/subtitles/webvtt"},"next":{"title":"Basics of Filtering","permalink":"/docs/filtering/basics"}}');var s=n(4848),r=n(8453);const o={title:"Vapoursynth",sidebar_position:2},a="Vapoursynth",l={},c=[{value:"Installation",id:"installation",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3},{value:"Arch Linux",id:"arch-linux",level:3},{value:"Other Linux",id:"other-linux",level:3},{value:"Previewing",id:"previewing",level:2},{value:"Output",id:"output",level:2},{value:"Source Filters",id:"source-filters",level:2},{value:"LSmashSource",id:"lsmashsource",level:3},{value:"ffms2",id:"ffms2",level:3},{value:"BestSource",id:"bestsource",level:3}];function h(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"vapoursynth",children:"Vapoursynth"})}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"VapourSynth is an application for video manipulation. Or a plugin. Or a library. It\u2019s hard to tell because it has a core library written in C++ and a Python module to allow video scripts to be created."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.em,{children:"Fredrik Mellbin, creator of VapourSynth"})}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/vs_edit_script.avif?token=GHSAT0AAAAAACEZPDXJ6SHSUQIMUOGQXQTEZHY7K4A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/g7DucEq3aRGWVH0MHQe-A21GkyDVln9IHzRlfjEYEh/vs_edit_script.png",alt:"Vapoursynth script",width:"520",height:"632"})]}),"\n"," ","\n",(0,s.jsx)(i.h1,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(i.p,{children:"In the realm of video processing, one will frequently encounter media with various quality issues. These can range from minor imperfections to significant degradation, including:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Excessive film grain or noise that significantly increases bitrate due to its unpredictable nature"}),"\n",(0,s.jsx)(i.li,{children:"Visible banding artifacts"}),"\n",(0,s.jsx)(i.li,{children:"Unwanted halos around objects"}),"\n",(0,s.jsx)(i.li,{children:"Interlacing issues in older, unrestored footage"}),"\n",(0,s.jsx)(i.li,{children:"Telecine artifacts from improper film-to-video conversion"}),"\n",(0,s.jsxs)(i.li,{children:["And more, on our ",(0,s.jsx)(i.a,{href:"/docs/introduction/video-artifacts",children:"video artifacts"})," page."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"To address these challenges, video filtering techniques are employed. Currently, there are three primary software frameworks used for video filtering:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://vapoursynth.com",children:"VapourSynth"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"http://avisynth.nl/index.php/Main_Page",children:"AviSynth"})}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"VapourSynth is designed as a 21st-century upgrade and rewrite of AviSynth, which was originally created by Ben Rudiak-Gould, Edwin van Eggelen, Klaus Post, Richard Berg, and Ian Brabham in May 2000. One of the most attractive features of this complete rewrite is its improved multithreading capability, an area where AviSynth struggled due to its aging infrastructure."}),"\n",(0,s.jsxs)(i.p,{children:["Some longtime AviSynth users are reluctant to switch to VapourSynth, preferring to stick with a familiar workflow. There is nothing wrong with this preference, as both tools have their merits in video processing; that being said, the Codec Wiki's ",(0,s.jsx)(i.em,{children:"Filtering"})," section focuses primarily on VapourSynth (and occaisonally FFmpeg). It is important to note that working with VapourSynth requires a basic understanding of Python, as the filtering process involves scripting."]}),"\n",(0,s.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(i.h3,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["At the time of writing, Python 3.12 is required. This will change in the future so consult from ",(0,s.jsx)(i.a,{href:"http://www.vapoursynth.com/doc/installation.html",children:"their website"})]}),"\n",(0,s.jsxs)(i.li,{children:["Download the installer (",(0,s.jsx)(i.code,{children:".exe"}),") unless you require portability"]}),"\n",(0,s.jsx)(i.li,{children:"Install it"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"arch-linux",children:"Arch Linux"}),"\n",(0,s.jsxs)(i.p,{children:["Currently, Arch is the best Linux distribution for working with Vapoursynth due to the fact that\nthe vast majority of filters and plugins are available in the AUR. This makes installing and updating filters easy.\nIf you are not already, we recommend using an AUR helper such as\n",(0,s.jsx)(i.a,{href:"https://github.com/Morganamilo/paru",children:"paru"})," or ",(0,s.jsx)(i.a,{href:"https://github.com/Jguer/yay",children:"yay"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["To install vapoursynth, simply install the ",(0,s.jsx)(i.code,{children:"vapoursynth"})," package from the official repositories using pacman or your preferred AUR helper."]}),"\n",(0,s.jsxs)(i.p,{children:["Plugins are all prefixed with ",(0,s.jsx)(i.code,{children:"vapoursynth-plugin-"}),", such as ",(0,s.jsx)(i.code,{children:"vapoursynth-plugin-lsmashsource-git"}),", and as such can be discovered easily."]}),"\n",(0,s.jsx)(i.h3,{id:"other-linux",children:"Other Linux"}),"\n",(0,s.jsx)(i.p,{children:"Vapoursynth is supported on all Linux distributions. Installation methods may vary by distribution."}),"\n",(0,s.jsx)(i.p,{children:"Contributions would be helpful to provide instructions for more distributions."}),"\n",(0,s.jsx)(i.h2,{id:"previewing",children:"Previewing"}),"\n",(0,s.jsx)(i.p,{children:"There are currently two leading previewers for Vapoursynth. If you want to preview your scripts with capabilities such as seeking,\nyou will need to use one of these applications."}),"\n",(0,s.jsxs)(i.p,{children:["The first is YomkioR's ",(0,s.jsx)(i.a,{href:"https://github.com/YomikoR/VapourSynth-Editor/",children:"Vapoursynth Editor"}),", which includes a built-in code editor alongside a video previewer.\nThis makes it extremely easy to set up for users who are new to Vapoursynth."]}),"\n",(0,s.jsxs)(i.p,{children:["The second is JET's fork of ",(0,s.jsx)(i.a,{href:"https://github.com/Jaded-Encoding-Thaumaturgy/vs-preview",children:"vs-preview"}),", which is a standalone previewer with utilities for\ntasks such as cropping, screenshotting, and uploading comparisons. This tool is more advanced than Vapoursynth Editor, but does not include an editor,\nso you will need to pair it with an editor such as Visual Studio Code. The Github for vs-preview includes instructions for setting this up."]}),"\n",(0,s.jsx)(i.h2,{id:"output",children:"Output"}),"\n",(0,s.jsxs)(i.p,{children:["Vapoursynth provides a command-line utility called ",(0,s.jsx)(i.code,{children:"vspipe"})," for outputting filtered video. Using this utility to pipe y4m video\nis the most common way to use Vapoursynth with an encoder."]}),"\n",(0,s.jsx)(i.p,{children:"For example, the following command would pipe the output from a Vapoursynth script into x264:"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.code,{children:"vspipe -c y4m input.vpy - | x264 --demuxer y4m -o output.mkv -"})}),"\n",(0,s.jsx)(i.h2,{id:"source-filters",children:"Source Filters"}),"\n",(0,s.jsx)(i.p,{children:"For Vapoursynth to produce output, it has to load a video in some way. This way is with source filters."}),"\n",(0,s.jsxs)(i.p,{children:["The most basic method is using ",(0,s.jsx)(i.code,{children:"BlankClip"})," to create a clip of a certain resolution and frame rate. For example, the following\nscript would give us a blank clip at 640x480:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"import vapoursynth as vs\n\ncore = vs.core\n\nclip = core.std.BlankClip(width=640, height=480)\n\nclip.set_output(0)\n"})}),"\n",(0,s.jsx)(i.p,{children:"But a plain black video isn't very useful, is it? We want to load real videos so we can do filtering on them.\nFor this, there are a few different source filters we can look at."}),"\n",(0,s.jsx)(i.h3,{id:"lsmashsource",children:"LSmashSource"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.a,{href:"https://github.com/HomeOfAviSynthPlusEvolution/L-SMASH-Works",children:"LSmashSource"})," is a source filter using lsmash as the underlying source library.\nIt is the most commonly used source filter, and is generally reliable for most source formats, though may have frame accuracy issues\nwhen seeking with certain input formats, such as VC-1. If this is a concern, it can be recommended to encode to lossless first before\nusing any encoding methods that require seeking, such as av1an."]}),"\n",(0,s.jsx)(i.p,{children:"Here is an example of loading a video file using LSmashSource:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\n\ncore = vs.core\n\nclip = core.lsmas.LWLibavSource(source="input.mkv")\n\nclip.set_output(0)\n'})}),"\n",(0,s.jsx)(i.h3,{id:"ffms2",children:"ffms2"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.a,{href:"https://github.com/FFMS/ffms2",children:"ffms2"})," is a source filter based on ffmpeg. It generally should give the same results as LSmashSource,\nespecially when using the git version which has fixed support for newer formats such as AV1. If having issues with a source file with LSmashSource,\nffms2 can be a good fallback to try."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\n\ncore = vs.core\n\nclip = core.ffms2.Source(source="input.mkv")\n\nclip.set_output(0)\n'})}),"\n",(0,s.jsx)(i.h3,{id:"bestsource",children:"BestSource"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.a,{href:"https://github.com/vapoursynth/bestsource/",children:"BestSource"})," is also based on ffmpeg, but uses additional techniques\nto ensure frame accuracy in all scenarios with all input formats. The downside is that it must decode the entire video\nduring indexing, which means the first load of a given video will take longer. Subsequent loads will be quick, because\nBestSource caches the index in a file."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\n\ncore = vs.core\n\nclip = core.bs.VideoSource(\n source="input.mkv",\n cachepath="/"\n)\n\nclip.set_output(0)\n'})}),"\n",(0,s.jsxs)(i.p,{children:["We add the ",(0,s.jsx)(i.code,{children:'cachepath="/"'})," setting to emulate the behavior of the other source filters, which is to place the index file next to the source video.\nThis helps with portability and cleaning up after ourselves. The default behavior is to place the index file in a temporary directory local to the machine."]})]})}function u(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>a});var t=n(6540);const s={},r=t.createContext(s);function o(e){const i=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/32987299.bfa90a0c.js b/assets/js/32987299.bfa90a0c.js deleted file mode 100644 index 321fefe7d..000000000 --- a/assets/js/32987299.bfa90a0c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7754],{5029:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var t=n(4848),s=n(8453);const r={title:"Vapoursynth",sidebar_position:2},o="Vapoursynth",a={id:"filtering/vapoursynth",title:"Vapoursynth",description:"VapourSynth is an application for video manipulation. Or a plugin. Or a library. It\u2019s hard to tell because it has a core library written in C++ and a Python module to allow video scripts to be created.",source:"@site/docs/filtering/vapoursynth.mdx",sourceDirName:"filtering",slug:"/filtering/vapoursynth",permalink:"/docs/filtering/vapoursynth",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/vapoursynth.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Vapoursynth",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"WebVTT",permalink:"/docs/subtitles/webvtt"},next:{title:"Basics of Filtering",permalink:"/docs/filtering/basics"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3},{value:"Arch Linux",id:"arch-linux",level:3},{value:"Other Linux",id:"other-linux",level:3},{value:"Previewing",id:"previewing",level:2},{value:"Output",id:"output",level:2},{value:"Source Filters",id:"source-filters",level:2},{value:"LSmashSource",id:"lsmashsource",level:3},{value:"ffms2",id:"ffms2",level:3},{value:"BestSource",id:"bestsource",level:3}];function h(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"vapoursynth",children:"Vapoursynth"})}),"\n",(0,t.jsxs)(i.blockquote,{children:["\n",(0,t.jsx)(i.p,{children:"VapourSynth is an application for video manipulation. Or a plugin. Or a library. It\u2019s hard to tell because it has a core library written in C++ and a Python module to allow video scripts to be created."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.em,{children:"Fredrik Mellbin, creator of VapourSynth"})}),"\n",(0,t.jsxs)("picture",{children:[(0,t.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/vs_edit_script.avif?token=GHSAT0AAAAAACEZPDXJ6SHSUQIMUOGQXQTEZHY7K4A",type:"image/avif"}),(0,t.jsx)("img",{src:"https://autumn.revolt.chat/attachments/g7DucEq3aRGWVH0MHQe-A21GkyDVln9IHzRlfjEYEh/vs_edit_script.png",alt:"Vapoursynth script",width:"520",height:"632"})]}),"\n"," ","\n",(0,t.jsx)(i.h1,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsx)(i.p,{children:"In the realm of video processing, one will frequently encounter media with various quality issues. These can range from minor imperfections to significant degradation, including:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Excessive film grain or noise that significantly increases bitrate due to its unpredictable nature"}),"\n",(0,t.jsx)(i.li,{children:"Visible banding artifacts"}),"\n",(0,t.jsx)(i.li,{children:"Unwanted halos around objects"}),"\n",(0,t.jsx)(i.li,{children:"Interlacing issues in older, unrestored footage"}),"\n",(0,t.jsx)(i.li,{children:"Telecine artifacts from improper film-to-video conversion"}),"\n",(0,t.jsxs)(i.li,{children:["And more, on our ",(0,t.jsx)(i.a,{href:"/docs/introduction/video-artifacts",children:"video artifacts"})," page."]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"To address these challenges, video filtering techniques are employed. Currently, there are three primary software frameworks used for video filtering:"}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://vapoursynth.com",children:"VapourSynth"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"http://avisynth.nl/index.php/Main_Page",children:"AviSynth"})}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"VapourSynth is designed as a 21st-century upgrade and rewrite of AviSynth, which was originally created by Ben Rudiak-Gould, Edwin van Eggelen, Klaus Post, Richard Berg, and Ian Brabham in May 2000. One of the most attractive features of this complete rewrite is its improved multithreading capability, an area where AviSynth struggled due to its aging infrastructure."}),"\n",(0,t.jsxs)(i.p,{children:["Some longtime AviSynth users are reluctant to switch to VapourSynth, preferring to stick with a familiar workflow. There is nothing wrong with this preference, as both tools have their merits in video processing; that being said, the Codec Wiki's ",(0,t.jsx)(i.em,{children:"Filtering"})," section focuses primarily on VapourSynth (and occaisonally FFmpeg). It is important to note that working with VapourSynth requires a basic understanding of Python, as the filtering process involves scripting."]}),"\n",(0,t.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(i.h3,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["At the time of writing, Python 3.12 is required. This will change in the future so consult from ",(0,t.jsx)(i.a,{href:"http://www.vapoursynth.com/doc/installation.html",children:"their website"})]}),"\n",(0,t.jsxs)(i.li,{children:["Download the installer (",(0,t.jsx)(i.code,{children:".exe"}),") unless you require portability"]}),"\n",(0,t.jsx)(i.li,{children:"Install it"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"arch-linux",children:"Arch Linux"}),"\n",(0,t.jsxs)(i.p,{children:["Currently, Arch is the best Linux distribution for working with Vapoursynth due to the fact that\nthe vast majority of filters and plugins are available in the AUR. This makes installing and updating filters easy.\nIf you are not already, we recommend using an AUR helper such as\n",(0,t.jsx)(i.a,{href:"https://github.com/Morganamilo/paru",children:"paru"})," or ",(0,t.jsx)(i.a,{href:"https://github.com/Jguer/yay",children:"yay"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["To install vapoursynth, simply install the ",(0,t.jsx)(i.code,{children:"vapoursynth"})," package from the official repositories using pacman or your preferred AUR helper."]}),"\n",(0,t.jsxs)(i.p,{children:["Plugins are all prefixed with ",(0,t.jsx)(i.code,{children:"vapoursynth-plugin-"}),", such as ",(0,t.jsx)(i.code,{children:"vapoursynth-plugin-lsmashsource-git"}),", and as such can be discovered easily."]}),"\n",(0,t.jsx)(i.h3,{id:"other-linux",children:"Other Linux"}),"\n",(0,t.jsx)(i.p,{children:"Vapoursynth is supported on all Linux distributions. Installation methods may vary by distribution."}),"\n",(0,t.jsx)(i.p,{children:"Contributions would be helpful to provide instructions for more distributions."}),"\n",(0,t.jsx)(i.h2,{id:"previewing",children:"Previewing"}),"\n",(0,t.jsx)(i.p,{children:"There are currently two leading previewers for Vapoursynth. If you want to preview your scripts with capabilities such as seeking,\nyou will need to use one of these applications."}),"\n",(0,t.jsxs)(i.p,{children:["The first is YomkioR's ",(0,t.jsx)(i.a,{href:"https://github.com/YomikoR/VapourSynth-Editor/",children:"Vapoursynth Editor"}),", which includes a built-in code editor alongside a video previewer.\nThis makes it extremely easy to set up for users who are new to Vapoursynth."]}),"\n",(0,t.jsxs)(i.p,{children:["The second is JET's fork of ",(0,t.jsx)(i.a,{href:"https://github.com/Jaded-Encoding-Thaumaturgy/vs-preview",children:"vs-preview"}),", which is a standalone previewer with utilities for\ntasks such as cropping, screenshotting, and uploading comparisons. This tool is more advanced than Vapoursynth Editor, but does not include an editor,\nso you will need to pair it with an editor such as Visual Studio Code. The Github for vs-preview includes instructions for setting this up."]}),"\n",(0,t.jsx)(i.h2,{id:"output",children:"Output"}),"\n",(0,t.jsxs)(i.p,{children:["Vapoursynth provides a command-line utility called ",(0,t.jsx)(i.code,{children:"vspipe"})," for outputting filtered video. Using this utility to pipe y4m video\nis the most common way to use Vapoursynth with an encoder."]}),"\n",(0,t.jsx)(i.p,{children:"For example, the following command would pipe the output from a Vapoursynth script into x264:"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.code,{children:"vspipe -c y4m input.vpy - | x264 --demuxer y4m -o output.mkv -"})}),"\n",(0,t.jsx)(i.h2,{id:"source-filters",children:"Source Filters"}),"\n",(0,t.jsx)(i.p,{children:"For Vapoursynth to produce output, it has to load a video in some way. This way is with source filters."}),"\n",(0,t.jsxs)(i.p,{children:["The most basic method is using ",(0,t.jsx)(i.code,{children:"BlankClip"})," to create a clip of a certain resolution and frame rate. For example, the following\nscript would give us a blank clip at 640x480:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-python",children:"import vapoursynth as vs\n\ncore = vs.core\n\nclip = core.std.BlankClip(width=640, height=480)\n\nclip.set_output(0)\n"})}),"\n",(0,t.jsx)(i.p,{children:"But a plain black video isn't very useful, is it? We want to load real videos so we can do filtering on them.\nFor this, there are a few different source filters we can look at."}),"\n",(0,t.jsx)(i.h3,{id:"lsmashsource",children:"LSmashSource"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://github.com/HomeOfAviSynthPlusEvolution/L-SMASH-Works",children:"LSmashSource"})," is a source filter using lsmash as the underlying source library.\nIt is the most commonly used source filter, and is generally reliable for most source formats, though may have frame accuracy issues\nwhen seeking with certain input formats, such as VC-1. If this is a concern, it can be recommended to encode to lossless first before\nusing any encoding methods that require seeking, such as av1an."]}),"\n",(0,t.jsx)(i.p,{children:"Here is an example of loading a video file using LSmashSource:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\n\ncore = vs.core\n\nclip = core.lsmas.LWLibavSource(source="input.mkv")\n\nclip.set_output(0)\n'})}),"\n",(0,t.jsx)(i.h3,{id:"ffms2",children:"ffms2"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://github.com/FFMS/ffms2",children:"ffms2"})," is a source filter based on ffmpeg. It generally should give the same results as LSmashSource,\nespecially when using the git version which has fixed support for newer formats such as AV1. If having issues with a source file with LSmashSource,\nffms2 can be a good fallback to try."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\n\ncore = vs.core\n\nclip = core.ffms2.Source(source="input.mkv")\n\nclip.set_output(0)\n'})}),"\n",(0,t.jsx)(i.h3,{id:"bestsource",children:"BestSource"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://github.com/vapoursynth/bestsource/",children:"BestSource"})," is also based on ffmpeg, but uses additional techniques\nto ensure frame accuracy in all scenarios with all input formats. The downside is that it must decode the entire video\nduring indexing, which means the first load of a given video will take longer. Subsequent loads will be quick, because\nBestSource caches the index in a file."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\n\ncore = vs.core\n\nclip = core.bs.VideoSource(\n source="input.mkv",\n cachepath="/"\n)\n\nclip.set_output(0)\n'})}),"\n",(0,t.jsxs)(i.p,{children:["We add the ",(0,t.jsx)(i.code,{children:'cachepath="/"'})," setting to emulate the behavior of the other source filters, which is to place the index file next to the source video.\nThis helps with portability and cleaning up after ourselves. The default behavior is to place the index file in a temporary directory local to the machine."]})]})}function u(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>a});var t=n(6540);const s={},r=t.createContext(s);function o(e){const i=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/345ef4f9.8c99b56f.js b/assets/js/345ef4f9.8c99b56f.js deleted file mode 100644 index 1dbebbda4..000000000 --- a/assets/js/345ef4f9.8c99b56f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6509],{5389:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var o=i(4848),n=i(8453);const s={title:"MKVToolNix",sidebar_position:4},r="MKVToolNix",l={id:"utilities/MKVToolNix",title:"MKVToolNix",description:"MKVToolNix is free and open source GUI frontend to a set of tools (mkvmerge, mkvinfo, mkvpropedit, mkvextract) to create, alter and inspect Matroska files under Linux, other \\*NIXes and Windows.",source:"@site/docs/utilities/MKVToolNix.mdx",sourceDirName:"utilities",slug:"/utilities/MKVToolNix",permalink:"/docs/utilities/MKVToolNix",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/MKVToolNix.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"MKVToolNix",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"ffmpeg",permalink:"/docs/utilities/ffmpeg"},next:{title:"rAV1ator",permalink:"/docs/utilities/rAV1ator"}},a={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Tips and tricks",id:"tips-and-tricks",level:2}];function c(t){const e={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,n.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"mkvtoolnix",children:"MKVToolNix"})}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/mkvtoolnix-gui-workload.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/mkvtoolnix-gui-workload.webp",alt:"MKVToolNix Workload"})]}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)(e.p,{children:"MKVToolNix is free and open source GUI frontend to a set of tools (mkvmerge, mkvinfo, mkvpropedit, mkvextract) to create, alter and inspect Matroska files under Linux, other *NIXes and Windows."}),"\n",(0,o.jsx)(e.p,{children:"MKVToolNix is built with Qt and written in C++."}),"\n",(0,o.jsx)(e.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(e.p,{children:"Fortunately, Moritz Bunkus (Creator) is sane enough to provide downloads for pretty much all popular desktop operating systems."}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsxs)(e.li,{children:["Windows & Mac: ",(0,o.jsx)(e.a,{href:"https://mkvtoolnix.download/downloads.html",children:"MKVToolNix site"}),"."]}),"\n",(0,o.jsxs)(e.li,{children:["Linux: ",(0,o.jsx)(e.a,{href:"https://flathub.org/apps/org.bunkus.mkvtoolnix-gui",children:"Install as a Flatpak"})," or check your package manager."]}),"\n"]}),"\n",(0,o.jsx)(e.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(e.p,{children:'Drag and drop media files (or use "Add source files") to the application and modify, remux, demux, add streams, drop streams, anything and when done set your output destination and click "Start multiplexing" to start writing the output.'}),"\n",(0,o.jsx)(e.h2,{id:"tips-and-tricks",children:"Tips and tricks"}),"\n",(0,o.jsxs)(e.ol,{children:["\n",(0,o.jsxs)(e.li,{children:["You can import unencrypted BDMV (",(0,o.jsx)(e.code,{children:"index.bdmv"}),") or Blu-ray playlist files into MKVToolNix and it will prompt you to select which stream you would want to import."]}),"\n",(0,o.jsx)(e.li,{children:'You can set a WebM output in Output > Miscellaneous > "Create WebM compliant file"'}),"\n",(0,o.jsx)(e.li,{children:"You can split videos in multiple ways in Output > Splitting. Best of all? No freeze frames unlike in FFmpeg and no re-encoding required."}),"\n",(0,o.jsx)(e.li,{children:'You can edit metadata without remuxing (Albeit rather limited) in the "Header Editor".'}),"\n"]})]})}function u(t={}){const{wrapper:e}={...(0,n.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(c,{...t})}):c(t)}},8453:(t,e,i)=>{i.d(e,{R:()=>r,x:()=>l});var o=i(6540);const n={},s=o.createContext(n);function r(t){const e=o.useContext(s);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function l(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:r(t.components),o.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/345ef4f9.9192bd69.js b/assets/js/345ef4f9.9192bd69.js new file mode 100644 index 000000000..4ef7038d7 --- /dev/null +++ b/assets/js/345ef4f9.9192bd69.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6509],{1183:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"utilities/MKVToolNix","title":"MKVToolNix","description":"MKVToolNix is free and open source GUI frontend to a set of tools (mkvmerge, mkvinfo, mkvpropedit, mkvextract) to create, alter and inspect Matroska files under Linux, other \\\\*NIXes and Windows.","source":"@site/docs/utilities/MKVToolNix.mdx","sourceDirName":"utilities","slug":"/utilities/MKVToolNix","permalink":"/docs/utilities/MKVToolNix","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/MKVToolNix.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"MKVToolNix","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"ffmpeg","permalink":"/docs/utilities/ffmpeg"},"next":{"title":"rAV1ator","permalink":"/docs/utilities/rAV1ator"}}');var n=i(4848),s=i(8453);const r={title:"MKVToolNix",sidebar_position:4},l="MKVToolNix",a={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Tips and tricks",id:"tips-and-tricks",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"mkvtoolnix",children:"MKVToolNix"})}),"\n",(0,n.jsxs)("picture",{children:[(0,n.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/mkvtoolnix-gui-workload.avif",type:"image/avif"}),(0,n.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/mkvtoolnix-gui-workload.webp",alt:"MKVToolNix Workload"})]}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)(t.p,{children:"MKVToolNix is free and open source GUI frontend to a set of tools (mkvmerge, mkvinfo, mkvpropedit, mkvextract) to create, alter and inspect Matroska files under Linux, other *NIXes and Windows."}),"\n",(0,n.jsx)(t.p,{children:"MKVToolNix is built with Qt and written in C++."}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsx)(t.p,{children:"Fortunately, Moritz Bunkus (Creator) is sane enough to provide downloads for pretty much all popular desktop operating systems."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Windows & Mac: ",(0,n.jsx)(t.a,{href:"https://mkvtoolnix.download/downloads.html",children:"MKVToolNix site"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Linux: ",(0,n.jsx)(t.a,{href:"https://flathub.org/apps/org.bunkus.mkvtoolnix-gui",children:"Install as a Flatpak"})," or check your package manager."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:'Drag and drop media files (or use "Add source files") to the application and modify, remux, demux, add streams, drop streams, anything and when done set your output destination and click "Start multiplexing" to start writing the output.'}),"\n",(0,n.jsx)(t.h2,{id:"tips-and-tricks",children:"Tips and tricks"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["You can import unencrypted BDMV (",(0,n.jsx)(t.code,{children:"index.bdmv"}),") or Blu-ray playlist files into MKVToolNix and it will prompt you to select which stream you would want to import."]}),"\n",(0,n.jsx)(t.li,{children:'You can set a WebM output in Output > Miscellaneous > "Create WebM compliant file"'}),"\n",(0,n.jsx)(t.li,{children:"You can split videos in multiple ways in Output > Splitting. Best of all? No freeze frames unlike in FFmpeg and no re-encoding required."}),"\n",(0,n.jsx)(t.li,{children:'You can edit metadata without remuxing (Albeit rather limited) in the "Header Editor".'}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>l});var o=i(6540);const n={},s=o.createContext(n);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/37c719d6.704969fd.js b/assets/js/37c719d6.704969fd.js deleted file mode 100644 index 919b726df..000000000 --- a/assets/js/37c719d6.704969fd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1227],{1165:(e,s,t)=>{t.d(s,{Ck:()=>u,kS:()=>h});var i=t(4848),n=t(8453),o=t(6540),r=t(4016),a=t(3517),c=t(3343),m=t(3864),l=t(8633),p=t(363);const u=({imageData:e,pixelsAbove:s,pixelsBelow:t})=>{const o={div:"div",...(0,n.R)()},m=({currentSlide:e,direction:s,slideCount:t,...n})=>"left"===s?(0,i.jsx)(l.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,i.jsx)(p.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!s||s<0)&&(s=0),(!t||t<0)&&(t=0),(0,i.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,i.jsx)(o.div,{style:{height:`${s}px`}}),(0,i.jsx)(a.A,{arrows:!0,prevArrow:(0,i.jsx)(m,{direction:"left"}),nextArrow:(0,i.jsx)(m,{direction:"right"}),children:e.map((e=>(0,i.jsx)(c.A,{src:e.src},e.src)))}),(0,i.jsx)(o.div,{style:{height:`${t}px`}})]})},h=({tabMap:e,pixelsAbove:s,pixelsBelow:t})=>{const a={div:"div",...(0,n.R)()},[c,l]=(0,o.useState)(Object.keys(e)[0]);return(!s||s<0)&&(s=0),(!t||t<0)&&(t=0),(0,i.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,i.jsx)(a.div,{style:{height:`${s}px`}}),(0,i.jsx)(m.A,{tabList:Object.entries(e).map((([e,s])=>({key:e,label:s.label}))),activeTabKey:c,onTabChange:e=>{l(e)},children:e[c].component}),(0,i.jsx)(a.div,{style:{height:`${t}px`}})]})}},1800:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>m,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=t(4848),n=t(8453),o=t(1165);const r={title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},a="Introduction",c={permalink:"/blog/svt-av1-second-deep-dive",source:"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx",title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",date:"2024-05-19T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"},{inline:!0,label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:35.215,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043",key:null,page:null}],frontMatter:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"AV1 for Dummies",permalink:"/blog/av1-for-dummies"},nextItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"}},m={authorsImageUrls:[void 0]},l=[{value:"Feedback",id:"feedback",level:2},{value:"Methodology",id:"methodology",level:2},{value:"Samples",id:"samples",level:2},{value:"Presets comparisons (-1 -> 13 12)",id:"presets-comparisons--1---13-12",level:2},{value:"Efficiency",id:"efficiency",level:3},{value:"Speed",id:"speed",level:3},{value:"Interpretation",id:"interpretation",level:3},{value:"TLDR",id:"tldr",level:3},{value:"SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:",id:"svt-av1-v200-vs-v210-presets-comparisons",level:2},{value:"preset -1: v2.0.0 vs v2.1.0",id:"preset--1-v200-vs-v210",level:3},{value:"preset 0: v2.0.0 vs v2.1.0",id:"preset-0-v200-vs-v210",level:3},{value:"preset 1: v2.0.0 vs v2.1.0",id:"preset-1-v200-vs-v210",level:3},{value:"preset 2: v2.0.0 vs v2.1.0",id:"preset-2-v200-vs-v210",level:3},{value:"preset 3: v2.0.0 vs v2.1.0",id:"preset-3-v200-vs-v210",level:3},{value:"preset 4: v2.0.0 vs v2.1.0",id:"preset-4-v200-vs-v210",level:3},{value:"preset 5: v2.0.0 vs v2.1.0",id:"preset-5-v200-vs-v210",level:3},{value:"preset 6: v2.0.0 vs v2.1.0",id:"preset-6-v200-vs-v210",level:3},{value:"preset 7: v2.0.0 vs v2.1.0",id:"preset-7-v200-vs-v210",level:3},{value:"preset 8: v2.0.0 vs v2.1.0",id:"preset-8-v200-vs-v210",level:3},{value:"preset 9: v2.0.0 vs v2.1.0",id:"preset-9-v200-vs-v210",level:3},{value:"preset 10: v2.0.0 vs v2.1.0",id:"preset-10-v200-vs-v210",level:3},{value:"preset 11: v2.0.0 vs v2.1.0",id:"preset-11-v200-vs-v210",level:3},{value:"preset 12: v2.0.0 vs v2.1.0",id:"preset-12-v200-vs-v210",level:3},{value:"TLDR",id:"tldr-1",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Future",id:"future",level:2}];function p(e){const s={a:"a",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.p,{children:"SVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips."}),"\n",(0,i.jsx)(s.h2,{id:"feedback",children:"Feedback"}),"\n",(0,i.jsx)(s.p,{children:"I unfortunately never got to update the previous blog post with the image comparisons, and some people expressed concerns that this testing may not be representative of live action content. For the former, I will have to ask for your patience again, because this blog post won't initially contain image comparisons either, but this time they are being actively worked on, along with a magnificent comparisons component and this page will get updated once that is done. As for the latter, please be reassured that this testing in its entirety is perfectly representative of any modern content people typically encode: the diversity of japanese animation is rich and the content specifically chosen for this benchmark is relatively complex. From 3DCG to extremely noisy clips, we are far from the easy-to-compress static scenes of some slice-of-life show."}),"\n",(0,i.jsx)(s.p,{children:"I have also decided to complement this benchmark of another psychovisually-driven metric (XPSNR) so that double-checking is made easier. Thus, each graph possesses a SSIMULACRA2 version and a XPSNR version. Don't hesitate to switch between one another!"}),"\n",(0,i.jsx)(s.h2,{id:"methodology",children:"Methodology"}),"\n",(0,i.jsxs)(s.p,{children:["The resources available will range from ",(0,i.jsx)(s.em,{children:(0,i.jsx)(s.strong,{children:"graphs"})})," to ",(0,i.jsx)(s.del,{children:(0,i.jsx)(s.strong,{children:"image comparisons"})})," (WIP, for real this time). The ",(0,i.jsx)(s.em,{children:(0,i.jsx)(s.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,i.jsx)(s.strong,{children:"latter"})," are image samples from the files encoded during the tests that enable you to check quality for yourself, adding another layer of subjective interpretation to these comparisons."]}),"\n",(0,i.jsxs)(s.p,{children:["The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with ",(0,i.jsx)(s.code,{children:"x264 --qp 0"})," for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp ",(0,i.jsx)(s.em,{children:"directly"}),", meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the ",(0,i.jsx)(s.a,{href:"https://github.com/dnjulek/vapoursynth-ssimulacra2",children:"Zig implementation"}),", XPSNR scores on the other hand are calculated using a ",(0,i.jsx)(s.a,{href:"https://github.com/fraunhoferhhi/xpsnr",children:"ffmpeg filter"}),", and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and metrics scores. Bits per pixel scores (BPP) are calculated so that the ",(0,i.jsx)(s.code,{children:"Metric / BPP"})," graphs may represent the closest we have to real efficiency."]}),"\n",(0,i.jsx)(s.p,{children:"The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy."}),"\n",(0,i.jsxs)(s.p,{children:["SvtAv1EncApp was compiled directly from the ",(0,i.jsx)(s.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/",children:"v2.0.0 and v2.1.0 source code"})," using the provided ",(0,i.jsx)(s.code,{children:"Build/linux/build.sh"})," script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i3 12100 with 16GB of 3200MHz CL14 DDR4 RAM in Arch Linux with kernel 6.7.7 and the performance governor enabled. All encodes have been made in the same session without rebooting."]}),"\n",(0,i.jsxs)(s.p,{children:["This testing was conducted within the ",(0,i.jsx)(s.a,{href:"https://discord.gg/83dRFDFDp7",children:"AV1 Weeb Edition"})," Discord server, which is focused on encoding animated content in AV1."]}),"\n",(0,i.jsx)(s.h2,{id:"samples",children:"Samples"}),"\n",(0,i.jsx)(s.p,{children:"The samples are as follows:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["11s ",(0,i.jsx)(s.code,{children:"Blame!"})," clip which sports 3DCG action with lots of grain, effects and high-contrast elements."]}),"\n",(0,i.jsxs)(s.li,{children:["13s ",(0,i.jsx)(s.code,{children:"Blue Lock"})," clip which sports rapid camera movements, complex geometry and high-contrast elements."]}),"\n",(0,i.jsxs)(s.li,{children:["5s ",(0,i.jsx)(s.code,{children:"Spy x Family"})," first ending sequence with an extremely high amount of dynamic noise. New most complex source of this set."]}),"\n",(0,i.jsxs)(s.li,{children:["12s ",(0,i.jsx)(s.code,{children:"Jigokuraku (Hell's Paradise)"})," flashback clip with huge static grain in a very dark scenery and some action."]}),"\n",(0,i.jsxs)(s.li,{children:["5s ",(0,i.jsx)(s.code,{children:"The Garden of Sinners"})," clean but fast-paced 3DCG scene with explosions."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"The resolution of every clip is 1080p, except for the first one which is 1920x804."}),"\n",(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.strong,{children:["All clips have been encoded in a wide quality range, from ",(0,i.jsx)(s.code,{children:"--crf 6"})," to ",(0,i.jsx)(s.code,{children:"--crf 46"}),", by increments of 4."]})}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Without further ado, let's start with the first comparisons!"}),"\n",(0,i.jsxs)(s.h2,{id:"presets-comparisons--1---13-12",children:["Presets comparisons (-1 -> ",(0,i.jsx)(s.del,{children:"13"})," 12)"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.strong,{children:["In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest ",(0,i.jsx)(s.code,{children:"--preset -1"})," to the fastest ",(0,i.jsx)(s.code,{children:"--preset 12"}),"."]})}),"\n",(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["Yes, you heard that right. Preset 7 and 13 are no more in ",(0,i.jsx)(s.strong,{children:"v2.1.0"}),". This new update, like the previous one, mostly consisted of optimizing the presets trade-offs. The devs have made the choice to map ",(0,i.jsx)(s.code,{children:"preset 7"})," to ",(0,i.jsx)(s.code,{children:"preset 6"})," and ",(0,i.jsx)(s.code,{children:"preset 13"})," to ",(0,i.jsx)(s.code,{children:"preset 12"})," due to the lack of spacing between the new presets. We will discuss the implications of this further ahead."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"--preset X"})," is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--tune 1"}),": tune PSNR"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--aq-mode 2"}),": variance deltaq"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--enable-qm 0"}),": quantisation matrices disabled"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--irefresh-type 2"}),": closed GOP"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"--enable-tf 1"}),": temporal filtering enabled"]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"And more, like CDEF and restoration enabled, overlays and film-grain disabled..."}),"\n",(0,i.jsx)(s.h3,{id:"efficiency",children:"Efficiency"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"First of all, here are the full efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"This is all very cool, but visually bloated."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'Now the same graphs but focusing on the "high quality" range (CRF6 -> 22):'}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'Same, but now focusing on the "low quality" range (CRF26 -> 46):'}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If we now focus on ",(0,i.jsx)(s.strong,{children:"presets 4"}),' and below, where it\'s more difficult to discern the differences between presets, we get this at "high quality":']}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'And the following at "low quality":'}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.h3,{id:"speed",children:"Speed"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Let's now see speed comparisons between all presets:"})}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Once is not custom, ",(0,i.jsx)(s.strong,{children:"preset -1"})," is so abysmally slow it makes the graph unusable."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Same, but without the placebo ",(0,i.jsx)(s.strong,{children:"preset -1"}),":"]}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Lastly, here is what it looks like with a logarithmic scale:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.h3,{id:"interpretation",children:"Interpretation"}),"\n",(0,i.jsxs)(s.p,{children:["As for interpreting the results, it would seem like ",(0,i.jsx)(s.strong,{children:"preset 2"})," and ",(0,i.jsx)(s.strong,{children:"preset 4"})," remain all-around very balanced presets, with ",(0,i.jsx)(s.strong,{children:"preset 3"})," being in a nice in-between spot, an improvement over v2.0.0's ",(0,i.jsx)(s.strong,{children:"preset 3"})," in a way. We will better understand the reasons for this when we'll compare the new version to the last, a bit after."]}),"\n",(0,i.jsxs)(s.p,{children:["The quality gap between ",(0,i.jsx)(s.strong,{children:"preset 2"})," and ",(0,i.jsx)(s.strong,{children:"preset 1"})," is usually pretty narrow, however the speed penalty from going to ",(0,i.jsx)(s.strong,{children:"preset 1"})," is ~2x, when the penalty of going from ",(0,i.jsx)(s.strong,{children:"preset 3"})," to ",(0,i.jsx)(s.strong,{children:"preset 2"})," is closer to ~1.5x. As such, ",(0,i.jsx)(s.strong,{children:"preset 1"})," enters placebo territory, and considering the very little benefits of going any lower than it, compared to the huge performance loss of even lower presets, I advise you not to waste encoding resources on ",(0,i.jsx)(s.strong,{children:"preset 0"})," and ",(0,i.jsx)(s.strong,{children:"preset -1"}),". This applies especially at medium to high quality, however at extremely low quality like the CRF40 range, we can still see some small gains from these placebo presets."]}),"\n",(0,i.jsxs)(s.p,{children:["When we start talking about faster presets though, things are pretty different from previous versions: ",(0,i.jsx)(s.strong,{children:"presets 5 to 9"})," behave similarly on the graphs and seem to stand apart from their slower counterparts by just a bit. If you can bear the speed of ",(0,i.jsx)(s.strong,{children:"preset 4"}),", you should definitely be going for it, however if fast encoding is a necessity, for example in the case of realtime transcoding or streaming, ",(0,i.jsx)(s.strong,{children:"presets 5 through 9"})," will serve you right with great efficiency/speed trade-offs between one another. No preset in that range particularly stands out from the others, so simply pick one depending on your performance needs."]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Presets 10 to 12"})," are pretty inefficient, and to be avoided if possible. They can still be of use in a convex-hull scenario, but in the case of realtime transcoding, you may be better off with a hardware encoder like the ones found in RTX 4000 or Arc GPUs, especially since SVT-AV1's target bitrate mode is even less efficient than CRF mode."]}),"\n",(0,i.jsx)(s.h3,{id:"tldr",children:"TLDR"}),"\n",(0,i.jsxs)(s.p,{children:["The same conclusions as the previous blog post can be made:\n",(0,i.jsxs)(s.strong,{children:["clear quality gains can be observed as we decrease presets, until ",(0,i.jsx)(s.strong,{children:"preset 2"}),", however the effectiveness of dropping presets is noticeably less and less important as quality is increased."]})]}),"\n",(0,i.jsx)(s.p,{children:"In the next part, we will evaluate the differences in efficiency and speed of every presets when updating from SVT-AV1 2.0.0 to 2.1.0, which should enable an increase of nuance from the previous results alone."}),"\n",(0,i.jsx)(s.h2,{id:"svt-av1-v200-vs-v210-presets-comparisons",children:"SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:"}),"\n",(0,i.jsxs)(s.p,{children:["Two months ago, I conducted a similar test to this one to compare the presets evolution between versions ",(0,i.jsx)(s.strong,{children:"1.8.0"})," and ",(0,i.jsx)(s.strong,{children:"2.0.0"}),". The results were pretty unsatisfying: I noticed that ",(0,i.jsx)(s.strong,{children:"presets -1 to 8"})," in ",(0,i.jsx)(s.strong,{children:"v2.0.0"})," performed like the old ",(0,i.jsx)(s.strong,{children:"presets 0 to 9"})," did in ",(0,i.jsx)(s.strong,{children:"v1.8.0"}),". We basically saw an efficiency regression at a given preset, and speedups did not follow suit as well as we would have anticipated. All in all, it wasn't all that bad, it suffice to say you could simply drop a preset from before and you were good to go again. What was more concerning however is that the release note claimed important speedups that did not impact efficiency and my testing proved otherwise. My theory is that due to the dev team testing methodology, which consist of mostly pretty low resolution clips and non-psychovisual metrics like PSNR, SSIM or bad psychovisual metrics like VMAF, it's very well possible they were tricked into thinking they introduced improvements as they tweaked the presets when in reality the metrics simply didn't notice the quality degradation. Such issue is an additional reason why the industry should adopt more competent metrics, ones that better correlate with the human vision, to improve encoders in more impactful ways and better avoid pointless regressions."]}),"\n",(0,i.jsx)(s.p,{children:"So the question for today's testing is: have the SVT-AV1 devs redeemed themselves and actually improved the presets trade-offs this time around? Let's find out!"}),"\n",(0,i.jsxs)(s.h3,{id:"preset--1-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset -1"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:'Let\'s start off with a battle of the placebos, with the efficiency at "high quality":'})}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'And the efficiency at "low quality":'}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Yes, this is a bit underwhelming, but you can't just improve the best an encoder has to offer with just tweaking right?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Now, let's compare their respective speeds:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Let's be grateful it became ever so slightly faster, I guess."}),"\n",(0,i.jsxs)(s.h3,{id:"preset-0-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 0"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Overall, efficiency wise, this new ",(0,i.jsx)(s.strong,{children:"preset 0"})," places itself in-between old ",(0,i.jsx)(s.strong,{children:"preset -1"})," and ",(0,i.jsx)(s.strong,{children:"0"})]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Interestingly enough, its speed is much closer to the old ",(0,i.jsx)(s.strong,{children:"preset 0"})," than to the old ",(0,i.jsx)(s.strong,{children:"preset -1"}),". This means ",(0,i.jsx)(s.strong,{children:"preset 0"})," was genuinely improved over v2.0.0!"]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-1-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 1"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["In efficiency, this new ",(0,i.jsx)(s.strong,{children:"preset 1"})," is often equal to old ",(0,i.jsx)(s.strong,{children:"preset 0"}),", else in-between old ",(0,i.jsx)(s.strong,{children:"preset 0 and 1"}),"."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["We observe that the new preset is a bit closer to old ",(0,i.jsx)(s.strong,{children:"preset 1"})," speeds than it is to old ",(0,i.jsx)(s.strong,{children:"preset 0"})," speeds. Good news!"]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-2-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 2"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Oh well, that's awkward."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Speed was left untouched too, meaning ",(0,i.jsx)(s.strong,{children:"preset 2"})," is unchanged in v2.1.0."]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-3-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 3"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["The new ",(0,i.jsx)(s.strong,{children:"preset 3"}),"'s efficiency is the same as the old one."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"However, the preset got slightly faster, so this is a speedup!"}),"\n",(0,i.jsxs)(s.h3,{id:"preset-4-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 4"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["We can observe that ",(0,i.jsx)(s.strong,{children:"preset 4"})," got slightly to moderately worse efficiency wise."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Fortunately, the consequence of that slight efficiency decrease is a big performance improvement!"}),"\n",(0,i.jsxs)(s.h3,{id:"preset-5-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 5"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 5"})," seems to have gotten ever so slightly worse efficiency wise."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Yet it became slightly faster, this is overall a good trade-off."}),"\n",(0,i.jsxs)(s.h3,{id:"preset-6-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 6"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["The new ",(0,i.jsx)(s.strong,{children:"preset 6"})," has a huge responsibility: being able to compensate in the absence of its ",(0,i.jsx)(s.strong,{children:"preset 7"})," sibling. It seems to performs in-between old ",(0,i.jsx)(s.strong,{children:"preset 6 and 7"}),", usually closer to old ",(0,i.jsx)(s.strong,{children:"7"}),"."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 6"})," is now ever so slightly slower to old ",(0,i.jsx)(s.strong,{children:"7"}),", this is an interesting trade-off, overall a win over old ",(0,i.jsx)(s.strong,{children:"7"}),"."]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-7-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 7"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.p,{children:["Again, there is no preset 7. Actually, it's preset 6 that disappeared but I'm not remaking the graphs just for fun. If you select preset 6, you will be granted the following message: ",(0,i.jsx)(s.code,{children:"Svt[warn]: Preset M6 is mapped to M7."})]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"always_has_been",src:t(9502).A+"",width:"833",height:"466"})}),"\n",(0,i.jsxs)(s.h3,{id:"preset-8-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 8"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["In efficiency, this new ",(0,i.jsx)(s.strong,{children:"preset 8"})," is sometimes equal or slightly worse to the old ",(0,i.jsx)(s.strong,{children:"8"}),", and sometimes equal or slightly worse than old ",(0,i.jsx)(s.strong,{children:"7"}),"..."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Overall, the speed is pretty much unchanged from old ",(0,i.jsx)(s.strong,{children:"8"}),". It looks like a slight regression, that's pretty disappointing."]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-9-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 9"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["The new ",(0,i.jsx)(s.strong,{children:"preset 9"})," is the same as ever, ever so slightly better in some scenario but nothing groundbreaking."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Its speed remains the same, sometimes ever so slightly slower. Basically the preset is pretty much unchanged, which may as well be a relief, as the last usable preset of the encoder."}),"\n",(0,i.jsxs)(s.h3,{id:"preset-10-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 10"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 10"})," is slightly to moderately worse efficiency wise."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"Its speed is mostly the same, sometimes ever so slightly faster. It's a wash, avoid this preset at all costs!"}),"\n",(0,i.jsxs)(s.h3,{id:"preset-11-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 11"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 11"}),"'s efficiency is untouched."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Preset 11"}),"'s speed is unchanged as well."]}),"\n",(0,i.jsxs)(s.h3,{id:"preset-12-v200-vs-v210",children:[(0,i.jsx)(s.code,{children:"preset 12"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(s.p,{children:["Just as ",(0,i.jsx)(s.strong,{children:"preset 6"}),", ",(0,i.jsx)(s.strong,{children:"preset 12"})," is now mapped to ",(0,i.jsx)(s.strong,{children:"13"}),", and unsurprisingly, its efficiency is equal to old ",(0,i.jsx)(s.strong,{children:"13"}),"."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(s.p,{children:"The speeds seem to be in-between old 12 and 13, so potentially a slight speedup. Still, nothing to get excited at."}),"\n",(0,i.jsx)(s.h3,{id:"tldr-1",children:"TLDR"}),"\n",(0,i.jsxs)(s.p,{children:["From these extensive comparisons, it appears that some presets have received genuine improvements in their respective efficiency/speed trade-off.\nSome presets, like ",(0,i.jsx)(s.strong,{children:"-1"}),", ",(0,i.jsx)(s.strong,{children:"0"}),", ",(0,i.jsx)(s.strong,{children:"1"})," and ",(0,i.jsx)(s.strong,{children:"3"}),", received the most significant improvements, followed by ",(0,i.jsx)(s.strong,{children:"4"}),", ",(0,i.jsx)(s.strong,{children:"5"})," and ",(0,i.jsx)(s.strong,{children:"6"})," with overall beneficial new trade-offs. ",(0,i.jsx)(s.strong,{children:"Preset 12"})," got slightly faster too. On the other hand, ",(0,i.jsx)(s.strong,{children:"presets 8 and 10"})," seemed to have regressed slightly, and ",(0,i.jsx)(s.strong,{children:"presets 2 and 9"})," are perfectly unchanged from v2.0.0."]}),"\n",(0,i.jsx)(s.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsxs)(s.p,{children:["SVT-AV1 2.1.0 introduced some welcomed improvements. ",(0,i.jsx)(s.strong,{children:"Presets 2 through 4"})," remain the king of optimal AV1 encoding, while ",(0,i.jsx)(s.strong,{children:"presets 5 through 9"})," stand as good options for the people that find ",(0,i.jsx)(s.strong,{children:"2-4"})," to be too slow for their liking."]}),"\n",(0,i.jsx)(s.p,{children:"Let's be honest a second, not much as changed in SVT-AV1 since the first blog post. There was no need to redo all the parameter testing for the simple reason that their behavior remained the same, as did the conclusions drawn from them. I hope this article wasn't disappointing in a sense... Still, be reassured, this was just an appetizer, there will be more in the near future!"}),"\n",(0,i.jsxs)(s.p,{children:["By the way, did you know that the ",(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.a,{href:"https://github.com/gianni-rosato/svt-av1-psy/",children:"SVT-AV1-PSY project"})})," was initiated a few months ago? Its defaults were tailored according to the testing done in the last blog post, allowing a free efficiency boost for anyone not keen to tweak their encoders. Furthermore, SVT-AV1-PSY introduced a sharpness parameter to control distortion, a quarter-step quantizer for more CRF precision, a new subjective SSIM tune, Dolby Vision support, frame luma bias, and some other knobs to improve the appeal and consistency of your encodes. It is actively maintained by a group of talented people, including the main dev of the aom-av1-lavish fork of aomenc. Some of the changes are being backported to mainline SVT-AV1 due to the increased interest of the mainline devs. Please check it out!"]}),"\n",(0,i.jsx)(s.p,{children:"Hopefully, this comprehensive second deep dive should give you a helpful new starting point for choosing settings when encoding with the latest SVT-AV1(-PSY) 2.1.0."}),"\n",(0,i.jsx)(s.h2,{id:"future",children:"Future"}),"\n",(0,i.jsx)(s.p,{children:"My plans for the future regarding the blog post include:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"polishing this blog post and aggrementing it of image comparisons."}),"\n",(0,i.jsx)(s.li,{children:"a follow-up article in the relatively near future about giving you encoding tips and explaining common AV1 encoding knowlegde, for instance showcasing why film grain synthesis is a game-changer or why chunked encoding can prove beneficial to your encoding pipeline."}),"\n",(0,i.jsx)(s.li,{children:"an article focused on observing the evolution of SVT-AV1 since the beginning of its development, as well as comparisons with current aomenc, rav1e and SVT-AV1-PSY, including a quick look at the current state of AVM (development ground for AV2) in comparison to VVC's state."}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Thanks for reading!"}),"\n"]})}function u(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},9502:(e,s,t)=>{t.d(s,{A:()=>i});const i=t.p+"assets/images/preset_7_meme-db92f83a118086187f0de0dea1362caf.webp"}}]); \ No newline at end of file diff --git a/assets/js/37c719d6.da20abad.js b/assets/js/37c719d6.da20abad.js new file mode 100644 index 000000000..774b5471a --- /dev/null +++ b/assets/js/37c719d6.da20abad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1227],{1165:(e,s,t)=>{t.d(s,{Ck:()=>u,kS:()=>h});var i=t(4848),n=t(8453),o=t(6540),r=t(4016),a=t(3517),c=t(3343),m=t(3864),l=t(8633),p=t(363);const u=({imageData:e,pixelsAbove:s,pixelsBelow:t})=>{const o={div:"div",...(0,n.R)()},m=({currentSlide:e,direction:s,slideCount:t,...n})=>"left"===s?(0,i.jsx)(l.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,i.jsx)(p.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!s||s<0)&&(s=0),(!t||t<0)&&(t=0),(0,i.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,i.jsx)(o.div,{style:{height:`${s}px`}}),(0,i.jsx)(a.A,{arrows:!0,prevArrow:(0,i.jsx)(m,{direction:"left"}),nextArrow:(0,i.jsx)(m,{direction:"right"}),children:e.map((e=>(0,i.jsx)(c.A,{src:e.src},e.src)))}),(0,i.jsx)(o.div,{style:{height:`${t}px`}})]})},h=({tabMap:e,pixelsAbove:s,pixelsBelow:t})=>{const a={div:"div",...(0,n.R)()},[c,l]=(0,o.useState)(Object.keys(e)[0]);return(!s||s<0)&&(s=0),(!t||t<0)&&(t=0),(0,i.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,i.jsx)(a.div,{style:{height:`${s}px`}}),(0,i.jsx)(m.A,{tabList:Object.entries(e).map((([e,s])=>({key:e,label:s.label}))),activeTabKey:c,onTabChange:e=>{l(e)},children:e[c].component}),(0,i.jsx)(a.div,{style:{height:`${t}px`}})]})}},1800:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>m,contentTitle:()=>c,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var i=t(3165),n=t(4848),o=t(8453),r=t(1165);const a={title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},c="Introduction",m={authorsImageUrls:[void 0]},l=[{value:"Feedback",id:"feedback",level:2},{value:"Methodology",id:"methodology",level:2},{value:"Samples",id:"samples",level:2},{value:"Presets comparisons (-1 -> 13 12)",id:"presets-comparisons--1---13-12",level:2},{value:"Efficiency",id:"efficiency",level:3},{value:"Speed",id:"speed",level:3},{value:"Interpretation",id:"interpretation",level:3},{value:"TLDR",id:"tldr",level:3},{value:"SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:",id:"svt-av1-v200-vs-v210-presets-comparisons",level:2},{value:"preset -1: v2.0.0 vs v2.1.0",id:"preset--1-v200-vs-v210",level:3},{value:"preset 0: v2.0.0 vs v2.1.0",id:"preset-0-v200-vs-v210",level:3},{value:"preset 1: v2.0.0 vs v2.1.0",id:"preset-1-v200-vs-v210",level:3},{value:"preset 2: v2.0.0 vs v2.1.0",id:"preset-2-v200-vs-v210",level:3},{value:"preset 3: v2.0.0 vs v2.1.0",id:"preset-3-v200-vs-v210",level:3},{value:"preset 4: v2.0.0 vs v2.1.0",id:"preset-4-v200-vs-v210",level:3},{value:"preset 5: v2.0.0 vs v2.1.0",id:"preset-5-v200-vs-v210",level:3},{value:"preset 6: v2.0.0 vs v2.1.0",id:"preset-6-v200-vs-v210",level:3},{value:"preset 7: v2.0.0 vs v2.1.0",id:"preset-7-v200-vs-v210",level:3},{value:"preset 8: v2.0.0 vs v2.1.0",id:"preset-8-v200-vs-v210",level:3},{value:"preset 9: v2.0.0 vs v2.1.0",id:"preset-9-v200-vs-v210",level:3},{value:"preset 10: v2.0.0 vs v2.1.0",id:"preset-10-v200-vs-v210",level:3},{value:"preset 11: v2.0.0 vs v2.1.0",id:"preset-11-v200-vs-v210",level:3},{value:"preset 12: v2.0.0 vs v2.1.0",id:"preset-12-v200-vs-v210",level:3},{value:"TLDR",id:"tldr-1",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Future",id:"future",level:2}];function p(e){const s={a:"a",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.p,{children:"SVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips."}),"\n",(0,n.jsx)(s.h2,{id:"feedback",children:"Feedback"}),"\n",(0,n.jsx)(s.p,{children:"I unfortunately never got to update the previous blog post with the image comparisons, and some people expressed concerns that this testing may not be representative of live action content. For the former, I will have to ask for your patience again, because this blog post won't initially contain image comparisons either, but this time they are being actively worked on, along with a magnificent comparisons component and this page will get updated once that is done. As for the latter, please be reassured that this testing in its entirety is perfectly representative of any modern content people typically encode: the diversity of japanese animation is rich and the content specifically chosen for this benchmark is relatively complex. From 3DCG to extremely noisy clips, we are far from the easy-to-compress static scenes of some slice-of-life show."}),"\n",(0,n.jsx)(s.p,{children:"I have also decided to complement this benchmark of another psychovisually-driven metric (XPSNR) so that double-checking is made easier. Thus, each graph possesses a SSIMULACRA2 version and a XPSNR version. Don't hesitate to switch between one another!"}),"\n",(0,n.jsx)(s.h2,{id:"methodology",children:"Methodology"}),"\n",(0,n.jsxs)(s.p,{children:["The resources available will range from ",(0,n.jsx)(s.em,{children:(0,n.jsx)(s.strong,{children:"graphs"})})," to ",(0,n.jsx)(s.del,{children:(0,n.jsx)(s.strong,{children:"image comparisons"})})," (WIP, for real this time). The ",(0,n.jsx)(s.em,{children:(0,n.jsx)(s.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,n.jsx)(s.strong,{children:"latter"})," are image samples from the files encoded during the tests that enable you to check quality for yourself, adding another layer of subjective interpretation to these comparisons."]}),"\n",(0,n.jsxs)(s.p,{children:["The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with ",(0,n.jsx)(s.code,{children:"x264 --qp 0"})," for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp ",(0,n.jsx)(s.em,{children:"directly"}),", meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the ",(0,n.jsx)(s.a,{href:"https://github.com/dnjulek/vapoursynth-ssimulacra2",children:"Zig implementation"}),", XPSNR scores on the other hand are calculated using a ",(0,n.jsx)(s.a,{href:"https://github.com/fraunhoferhhi/xpsnr",children:"ffmpeg filter"}),", and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and metrics scores. Bits per pixel scores (BPP) are calculated so that the ",(0,n.jsx)(s.code,{children:"Metric / BPP"})," graphs may represent the closest we have to real efficiency."]}),"\n",(0,n.jsx)(s.p,{children:"The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy."}),"\n",(0,n.jsxs)(s.p,{children:["SvtAv1EncApp was compiled directly from the ",(0,n.jsx)(s.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/",children:"v2.0.0 and v2.1.0 source code"})," using the provided ",(0,n.jsx)(s.code,{children:"Build/linux/build.sh"})," script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i3 12100 with 16GB of 3200MHz CL14 DDR4 RAM in Arch Linux with kernel 6.7.7 and the performance governor enabled. All encodes have been made in the same session without rebooting."]}),"\n",(0,n.jsxs)(s.p,{children:["This testing was conducted within the ",(0,n.jsx)(s.a,{href:"https://discord.gg/83dRFDFDp7",children:"AV1 Weeb Edition"})," Discord server, which is focused on encoding animated content in AV1."]}),"\n",(0,n.jsx)(s.h2,{id:"samples",children:"Samples"}),"\n",(0,n.jsx)(s.p,{children:"The samples are as follows:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["11s ",(0,n.jsx)(s.code,{children:"Blame!"})," clip which sports 3DCG action with lots of grain, effects and high-contrast elements."]}),"\n",(0,n.jsxs)(s.li,{children:["13s ",(0,n.jsx)(s.code,{children:"Blue Lock"})," clip which sports rapid camera movements, complex geometry and high-contrast elements."]}),"\n",(0,n.jsxs)(s.li,{children:["5s ",(0,n.jsx)(s.code,{children:"Spy x Family"})," first ending sequence with an extremely high amount of dynamic noise. New most complex source of this set."]}),"\n",(0,n.jsxs)(s.li,{children:["12s ",(0,n.jsx)(s.code,{children:"Jigokuraku (Hell's Paradise)"})," flashback clip with huge static grain in a very dark scenery and some action."]}),"\n",(0,n.jsxs)(s.li,{children:["5s ",(0,n.jsx)(s.code,{children:"The Garden of Sinners"})," clean but fast-paced 3DCG scene with explosions."]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"The resolution of every clip is 1080p, except for the first one which is 1920x804."}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsxs)(s.strong,{children:["All clips have been encoded in a wide quality range, from ",(0,n.jsx)(s.code,{children:"--crf 6"})," to ",(0,n.jsx)(s.code,{children:"--crf 46"}),", by increments of 4."]})}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"Without further ado, let's start with the first comparisons!"}),"\n",(0,n.jsxs)(s.h2,{id:"presets-comparisons--1---13-12",children:["Presets comparisons (-1 -> ",(0,n.jsx)(s.del,{children:"13"})," 12)"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsxs)(s.strong,{children:["In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest ",(0,n.jsx)(s.code,{children:"--preset -1"})," to the fastest ",(0,n.jsx)(s.code,{children:"--preset 12"}),"."]})}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["Yes, you heard that right. Preset 7 and 13 are no more in ",(0,n.jsx)(s.strong,{children:"v2.1.0"}),". This new update, like the previous one, mostly consisted of optimizing the presets trade-offs. The devs have made the choice to map ",(0,n.jsx)(s.code,{children:"preset 7"})," to ",(0,n.jsx)(s.code,{children:"preset 6"})," and ",(0,n.jsx)(s.code,{children:"preset 13"})," to ",(0,n.jsx)(s.code,{children:"preset 12"})," due to the lack of spacing between the new presets. We will discuss the implications of this further ahead."]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"--preset X"})," is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"--tune 1"}),": tune PSNR"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"--aq-mode 2"}),": variance deltaq"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"--enable-qm 0"}),": quantisation matrices disabled"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"--irefresh-type 2"}),": closed GOP"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"--enable-tf 1"}),": temporal filtering enabled"]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"And more, like CDEF and restoration enabled, overlays and film-grain disabled..."}),"\n",(0,n.jsx)(s.h3,{id:"efficiency",children:"Efficiency"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"First of all, here are the full efficiency graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"This is all very cool, but visually bloated."}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:'Now the same graphs but focusing on the "high quality" range (CRF6 -> 22):'}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:'Same, but now focusing on the "low quality" range (CRF26 -> 46):'}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["If we now focus on ",(0,n.jsx)(s.strong,{children:"presets 4"}),' and below, where it\'s more difficult to discern the differences between presets, we get this at "high quality":']}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:'And the following at "low quality":'}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.h3,{id:"speed",children:"Speed"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.strong,{children:"Let's now see speed comparisons between all presets:"})}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["Once is not custom, ",(0,n.jsx)(s.strong,{children:"preset -1"})," is so abysmally slow it makes the graph unusable."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Same, but without the placebo ",(0,n.jsx)(s.strong,{children:"preset -1"}),":"]}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Lastly, here is what it looks like with a logarithmic scale:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.h3,{id:"interpretation",children:"Interpretation"}),"\n",(0,n.jsxs)(s.p,{children:["As for interpreting the results, it would seem like ",(0,n.jsx)(s.strong,{children:"preset 2"})," and ",(0,n.jsx)(s.strong,{children:"preset 4"})," remain all-around very balanced presets, with ",(0,n.jsx)(s.strong,{children:"preset 3"})," being in a nice in-between spot, an improvement over v2.0.0's ",(0,n.jsx)(s.strong,{children:"preset 3"})," in a way. We will better understand the reasons for this when we'll compare the new version to the last, a bit after."]}),"\n",(0,n.jsxs)(s.p,{children:["The quality gap between ",(0,n.jsx)(s.strong,{children:"preset 2"})," and ",(0,n.jsx)(s.strong,{children:"preset 1"})," is usually pretty narrow, however the speed penalty from going to ",(0,n.jsx)(s.strong,{children:"preset 1"})," is ~2x, when the penalty of going from ",(0,n.jsx)(s.strong,{children:"preset 3"})," to ",(0,n.jsx)(s.strong,{children:"preset 2"})," is closer to ~1.5x. As such, ",(0,n.jsx)(s.strong,{children:"preset 1"})," enters placebo territory, and considering the very little benefits of going any lower than it, compared to the huge performance loss of even lower presets, I advise you not to waste encoding resources on ",(0,n.jsx)(s.strong,{children:"preset 0"})," and ",(0,n.jsx)(s.strong,{children:"preset -1"}),". This applies especially at medium to high quality, however at extremely low quality like the CRF40 range, we can still see some small gains from these placebo presets."]}),"\n",(0,n.jsxs)(s.p,{children:["When we start talking about faster presets though, things are pretty different from previous versions: ",(0,n.jsx)(s.strong,{children:"presets 5 to 9"})," behave similarly on the graphs and seem to stand apart from their slower counterparts by just a bit. If you can bear the speed of ",(0,n.jsx)(s.strong,{children:"preset 4"}),", you should definitely be going for it, however if fast encoding is a necessity, for example in the case of realtime transcoding or streaming, ",(0,n.jsx)(s.strong,{children:"presets 5 through 9"})," will serve you right with great efficiency/speed trade-offs between one another. No preset in that range particularly stands out from the others, so simply pick one depending on your performance needs."]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Presets 10 to 12"})," are pretty inefficient, and to be avoided if possible. They can still be of use in a convex-hull scenario, but in the case of realtime transcoding, you may be better off with a hardware encoder like the ones found in RTX 4000 or Arc GPUs, especially since SVT-AV1's target bitrate mode is even less efficient than CRF mode."]}),"\n",(0,n.jsx)(s.h3,{id:"tldr",children:"TLDR"}),"\n",(0,n.jsxs)(s.p,{children:["The same conclusions as the previous blog post can be made:\n",(0,n.jsxs)(s.strong,{children:["clear quality gains can be observed as we decrease presets, until ",(0,n.jsx)(s.strong,{children:"preset 2"}),", however the effectiveness of dropping presets is noticeably less and less important as quality is increased."]})]}),"\n",(0,n.jsx)(s.p,{children:"In the next part, we will evaluate the differences in efficiency and speed of every presets when updating from SVT-AV1 2.0.0 to 2.1.0, which should enable an increase of nuance from the previous results alone."}),"\n",(0,n.jsx)(s.h2,{id:"svt-av1-v200-vs-v210-presets-comparisons",children:"SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:"}),"\n",(0,n.jsxs)(s.p,{children:["Two months ago, I conducted a similar test to this one to compare the presets evolution between versions ",(0,n.jsx)(s.strong,{children:"1.8.0"})," and ",(0,n.jsx)(s.strong,{children:"2.0.0"}),". The results were pretty unsatisfying: I noticed that ",(0,n.jsx)(s.strong,{children:"presets -1 to 8"})," in ",(0,n.jsx)(s.strong,{children:"v2.0.0"})," performed like the old ",(0,n.jsx)(s.strong,{children:"presets 0 to 9"})," did in ",(0,n.jsx)(s.strong,{children:"v1.8.0"}),". We basically saw an efficiency regression at a given preset, and speedups did not follow suit as well as we would have anticipated. All in all, it wasn't all that bad, it suffice to say you could simply drop a preset from before and you were good to go again. What was more concerning however is that the release note claimed important speedups that did not impact efficiency and my testing proved otherwise. My theory is that due to the dev team testing methodology, which consist of mostly pretty low resolution clips and non-psychovisual metrics like PSNR, SSIM or bad psychovisual metrics like VMAF, it's very well possible they were tricked into thinking they introduced improvements as they tweaked the presets when in reality the metrics simply didn't notice the quality degradation. Such issue is an additional reason why the industry should adopt more competent metrics, ones that better correlate with the human vision, to improve encoders in more impactful ways and better avoid pointless regressions."]}),"\n",(0,n.jsx)(s.p,{children:"So the question for today's testing is: have the SVT-AV1 devs redeemed themselves and actually improved the presets trade-offs this time around? Let's find out!"}),"\n",(0,n.jsxs)(s.h3,{id:"preset--1-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset -1"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.strong,{children:'Let\'s start off with a battle of the placebos, with the efficiency at "high quality":'})}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:'And the efficiency at "low quality":'}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"Yes, this is a bit underwhelming, but you can't just improve the best an encoder has to offer with just tweaking right?"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Now, let's compare their respective speeds:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"Let's be grateful it became ever so slightly faster, I guess."}),"\n",(0,n.jsxs)(s.h3,{id:"preset-0-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 0"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["Overall, efficiency wise, this new ",(0,n.jsx)(s.strong,{children:"preset 0"})," places itself in-between old ",(0,n.jsx)(s.strong,{children:"preset -1"})," and ",(0,n.jsx)(s.strong,{children:"0"})]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["Interestingly enough, its speed is much closer to the old ",(0,n.jsx)(s.strong,{children:"preset 0"})," than to the old ",(0,n.jsx)(s.strong,{children:"preset -1"}),". This means ",(0,n.jsx)(s.strong,{children:"preset 0"})," was genuinely improved over v2.0.0!"]}),"\n",(0,n.jsxs)(s.h3,{id:"preset-1-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 1"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["In efficiency, this new ",(0,n.jsx)(s.strong,{children:"preset 1"})," is often equal to old ",(0,n.jsx)(s.strong,{children:"preset 0"}),", else in-between old ",(0,n.jsx)(s.strong,{children:"preset 0 and 1"}),"."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["We observe that the new preset is a bit closer to old ",(0,n.jsx)(s.strong,{children:"preset 1"})," speeds than it is to old ",(0,n.jsx)(s.strong,{children:"preset 0"})," speeds. Good news!"]}),"\n",(0,n.jsxs)(s.h3,{id:"preset-2-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 2"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"Oh well, that's awkward."}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["Speed was left untouched too, meaning ",(0,n.jsx)(s.strong,{children:"preset 2"})," is unchanged in v2.1.0."]}),"\n",(0,n.jsxs)(s.h3,{id:"preset-3-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 3"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["The new ",(0,n.jsx)(s.strong,{children:"preset 3"}),"'s efficiency is the same as the old one."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"However, the preset got slightly faster, so this is a speedup!"}),"\n",(0,n.jsxs)(s.h3,{id:"preset-4-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 4"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["We can observe that ",(0,n.jsx)(s.strong,{children:"preset 4"})," got slightly to moderately worse efficiency wise."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"Fortunately, the consequence of that slight efficiency decrease is a big performance improvement!"}),"\n",(0,n.jsxs)(s.h3,{id:"preset-5-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 5"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Preset 5"})," seems to have gotten ever so slightly worse efficiency wise."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"Yet it became slightly faster, this is overall a good trade-off."}),"\n",(0,n.jsxs)(s.h3,{id:"preset-6-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 6"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["The new ",(0,n.jsx)(s.strong,{children:"preset 6"})," has a huge responsibility: being able to compensate in the absence of its ",(0,n.jsx)(s.strong,{children:"preset 7"})," sibling. It seems to performs in-between old ",(0,n.jsx)(s.strong,{children:"preset 6 and 7"}),", usually closer to old ",(0,n.jsx)(s.strong,{children:"7"}),"."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Preset 6"})," is now ever so slightly slower to old ",(0,n.jsx)(s.strong,{children:"7"}),", this is an interesting trade-off, overall a win over old ",(0,n.jsx)(s.strong,{children:"7"}),"."]}),"\n",(0,n.jsxs)(s.h3,{id:"preset-7-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 7"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.p,{children:["Again, there is no preset 7. Actually, it's preset 6 that disappeared but I'm not remaking the graphs just for fun. If you select preset 6, you will be granted the following message: ",(0,n.jsx)(s.code,{children:"Svt[warn]: Preset M6 is mapped to M7."})]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"always_has_been",src:t(1759).A+"",width:"833",height:"466"})}),"\n",(0,n.jsxs)(s.h3,{id:"preset-8-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 8"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["In efficiency, this new ",(0,n.jsx)(s.strong,{children:"preset 8"})," is sometimes equal or slightly worse to the old ",(0,n.jsx)(s.strong,{children:"8"}),", and sometimes equal or slightly worse than old ",(0,n.jsx)(s.strong,{children:"7"}),"..."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["Overall, the speed is pretty much unchanged from old ",(0,n.jsx)(s.strong,{children:"8"}),". It looks like a slight regression, that's pretty disappointing."]}),"\n",(0,n.jsxs)(s.h3,{id:"preset-9-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 9"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["The new ",(0,n.jsx)(s.strong,{children:"preset 9"})," is the same as ever, ever so slightly better in some scenario but nothing groundbreaking."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"Its speed remains the same, sometimes ever so slightly slower. Basically the preset is pretty much unchanged, which may as well be a relief, as the last usable preset of the encoder."}),"\n",(0,n.jsxs)(s.h3,{id:"preset-10-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 10"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Preset 10"})," is slightly to moderately worse efficiency wise."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"Its speed is mostly the same, sometimes ever so slightly faster. It's a wash, avoid this preset at all costs!"}),"\n",(0,n.jsxs)(s.h3,{id:"preset-11-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 11"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Preset 11"}),"'s efficiency is untouched."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Preset 11"}),"'s speed is unchanged as well."]}),"\n",(0,n.jsxs)(s.h3,{id:"preset-12-v200-vs-v210",children:[(0,n.jsx)(s.code,{children:"preset 12"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsxs)(s.p,{children:["Just as ",(0,n.jsx)(s.strong,{children:"preset 6"}),", ",(0,n.jsx)(s.strong,{children:"preset 12"})," is now mapped to ",(0,n.jsx)(s.strong,{children:"13"}),", and unsurprisingly, its efficiency is equal to old ",(0,n.jsx)(s.strong,{children:"13"}),"."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,n.jsx)(r.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,n.jsx)(r.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}},pixelsAbove:0,pixelsBelow:24}),"\n",(0,n.jsx)(s.p,{children:"The speeds seem to be in-between old 12 and 13, so potentially a slight speedup. Still, nothing to get excited at."}),"\n",(0,n.jsx)(s.h3,{id:"tldr-1",children:"TLDR"}),"\n",(0,n.jsxs)(s.p,{children:["From these extensive comparisons, it appears that some presets have received genuine improvements in their respective efficiency/speed trade-off.\nSome presets, like ",(0,n.jsx)(s.strong,{children:"-1"}),", ",(0,n.jsx)(s.strong,{children:"0"}),", ",(0,n.jsx)(s.strong,{children:"1"})," and ",(0,n.jsx)(s.strong,{children:"3"}),", received the most significant improvements, followed by ",(0,n.jsx)(s.strong,{children:"4"}),", ",(0,n.jsx)(s.strong,{children:"5"})," and ",(0,n.jsx)(s.strong,{children:"6"})," with overall beneficial new trade-offs. ",(0,n.jsx)(s.strong,{children:"Preset 12"})," got slightly faster too. On the other hand, ",(0,n.jsx)(s.strong,{children:"presets 8 and 10"})," seemed to have regressed slightly, and ",(0,n.jsx)(s.strong,{children:"presets 2 and 9"})," are perfectly unchanged from v2.0.0."]}),"\n",(0,n.jsx)(s.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsxs)(s.p,{children:["SVT-AV1 2.1.0 introduced some welcomed improvements. ",(0,n.jsx)(s.strong,{children:"Presets 2 through 4"})," remain the king of optimal AV1 encoding, while ",(0,n.jsx)(s.strong,{children:"presets 5 through 9"})," stand as good options for the people that find ",(0,n.jsx)(s.strong,{children:"2-4"})," to be too slow for their liking."]}),"\n",(0,n.jsx)(s.p,{children:"Let's be honest a second, not much as changed in SVT-AV1 since the first blog post. There was no need to redo all the parameter testing for the simple reason that their behavior remained the same, as did the conclusions drawn from them. I hope this article wasn't disappointing in a sense... Still, be reassured, this was just an appetizer, there will be more in the near future!"}),"\n",(0,n.jsxs)(s.p,{children:["By the way, did you know that the ",(0,n.jsx)(s.strong,{children:(0,n.jsx)(s.a,{href:"https://github.com/gianni-rosato/svt-av1-psy/",children:"SVT-AV1-PSY project"})})," was initiated a few months ago? Its defaults were tailored according to the testing done in the last blog post, allowing a free efficiency boost for anyone not keen to tweak their encoders. Furthermore, SVT-AV1-PSY introduced a sharpness parameter to control distortion, a quarter-step quantizer for more CRF precision, a new subjective SSIM tune, Dolby Vision support, frame luma bias, and some other knobs to improve the appeal and consistency of your encodes. It is actively maintained by a group of talented people, including the main dev of the aom-av1-lavish fork of aomenc. Some of the changes are being backported to mainline SVT-AV1 due to the increased interest of the mainline devs. Please check it out!"]}),"\n",(0,n.jsx)(s.p,{children:"Hopefully, this comprehensive second deep dive should give you a helpful new starting point for choosing settings when encoding with the latest SVT-AV1(-PSY) 2.1.0."}),"\n",(0,n.jsx)(s.h2,{id:"future",children:"Future"}),"\n",(0,n.jsx)(s.p,{children:"My plans for the future regarding the blog post include:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"polishing this blog post and aggrementing it of image comparisons."}),"\n",(0,n.jsx)(s.li,{children:"a follow-up article in the relatively near future about giving you encoding tips and explaining common AV1 encoding knowlegde, for instance showcasing why film grain synthesis is a game-changer or why chunked encoding can prove beneficial to your encoding pipeline."}),"\n",(0,n.jsx)(s.li,{children:"an article focused on observing the evolution of SVT-AV1 since the beginning of its development, as well as comparisons with current aomenc, rav1e and SVT-AV1-PSY, including a quick look at the current state of AVM (development ground for AV2) in comparison to VVC's state."}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"Thanks for reading!"}),"\n"]})}function u(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},1759:(e,s,t)=>{t.d(s,{A:()=>i});const i=t.p+"assets/images/preset_7_meme-db92f83a118086187f0de0dea1362caf.webp"},3165:e=>{e.exports=JSON.parse('{"permalink":"/blog/svt-av1-second-deep-dive","source":"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx","title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","description":"SVT-AV1 2.1.0 just released, how does it compare to the previous version?","date":"2024-05-19T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"},{"inline":true,"label":"benchmarks","permalink":"/blog/tags/benchmarks"}],"readingTime":35.215,"hasTruncateMarker":true,"authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","description":"SVT-AV1 2.1.0 just released, how does it compare to the previous version?","slug":"svt-av1-second-deep-dive","authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043"}],"tags":["video","compression","benchmarks"],"image":"/img/svt-2.1.0-testing-blog-image.webp","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"AV1 for Dummies","permalink":"/blog/av1-for-dummies"},"nextItem":{"title":"Encoding Animation with SVT-AV1: A Deep Dive","permalink":"/blog/svt-av1-deep-dive"}}')}}]); \ No newline at end of file diff --git a/assets/js/3a2db09e.17e906d8.js b/assets/js/3a2db09e.17e906d8.js new file mode 100644 index 000000000..ef1e8fd0e --- /dev/null +++ b/assets/js/3a2db09e.17e906d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8121],{8070:e=>{e.exports=JSON.parse('{"tags":[{"label":"video","permalink":"/blog/tags/video","count":6},{"label":"compression","permalink":"/blog/tags/compression","count":6},{"label":"benchmarks","permalink":"/blog/tags/benchmarks","count":3},{"label":"anniversary","permalink":"/blog/tags/anniversary","count":1},{"label":"history","permalink":"/blog/tags/history","count":1},{"label":"discord","permalink":"/blog/tags/discord","count":1},{"label":"image","permalink":"/blog/tags/image","count":1},{"label":"web","permalink":"/blog/tags/web","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/3a2db09e.1d6d5d92.js b/assets/js/3a2db09e.1d6d5d92.js deleted file mode 100644 index 7eab3df5f..000000000 --- a/assets/js/3a2db09e.1d6d5d92.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8121],{8070:e=>{e.exports=JSON.parse('{"tags":[{"label":"anniversary","permalink":"/blog/tags/anniversary","count":1},{"label":"history","permalink":"/blog/tags/history","count":1},{"label":"video","permalink":"/blog/tags/video","count":5},{"label":"compression","permalink":"/blog/tags/compression","count":5},{"label":"benchmarks","permalink":"/blog/tags/benchmarks","count":2},{"label":"discord","permalink":"/blog/tags/discord","count":1},{"label":"image","permalink":"/blog/tags/image","count":1},{"label":"web","permalink":"/blog/tags/web","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/3d6cf458.13b149a4.js b/assets/js/3d6cf458.13b149a4.js new file mode 100644 index 000000000..c579b51ae --- /dev/null +++ b/assets/js/3d6cf458.13b149a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2614],{8284:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"video/VC-1","title":"VC-1","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/VC-1.mdx","sourceDirName":"video","slug":"/video/VC-1","permalink":"/docs/video/VC-1","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VC-1.mdx","tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"title":"VC-1","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"AVS3","permalink":"/docs/video/AVS3"},"next":{"title":"Theora","permalink":"/docs/video/Theora"}}');var t=i(4848),d=i(8453);const s={title:"VC-1",sidebar_position:8},c="VC-1",r={},a=[{value:"Encoding",id:"encoding",level:2},{value:"Decoding",id:"decoding",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,d.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"vc-1",children:"VC-1"})}),"\n",(0,t.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(n.p,{children:["VC-1 is video codec created by Microsoft and released in 2006. It largely aimed to compete with ",(0,t.jsx)(n.a,{href:"/docs/video/AVC",children:"AVC"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsxs)(n.p,{children:["VC-1 can be contained in ",(0,t.jsx)(n.code,{children:".mp4"}),", ",(0,t.jsx)(n.code,{children:".mkv"}),", and ",(0,t.jsx)(n.code,{children:".avi"})," containers.\nTo be filled"]}),"\n",(0,t.jsx)(n.h2,{id:"decoding",children:"Decoding"}),"\n",(0,t.jsxs)(n.p,{children:["VC-1 can be decoded by ",(0,t.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),", ",(0,t.jsx)(n.a,{href:"/docs/video-players",children:"VLC"}),", ",(0,t.jsx)(n.a,{href:"/docs/video-players",children:"MPV"}),", and any device that supports blu-ray."]})]})}function u(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var o=i(6540);const t={},d=o.createContext(t);function s(e){const n=o.useContext(d);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3d6cf458.ade3502e.js b/assets/js/3d6cf458.ade3502e.js deleted file mode 100644 index b1924e7bb..000000000 --- a/assets/js/3d6cf458.ade3502e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2614],{6396:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>s,contentTitle:()=>c,default:()=>u,frontMatter:()=>d,metadata:()=>r,toc:()=>a});var o=n(4848),t=n(8453);const d={title:"VC-1",sidebar_position:8},c="VC-1",r={id:"video/VC-1",title:"VC-1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VC-1.mdx",sourceDirName:"video",slug:"/video/VC-1",permalink:"/docs/video/VC-1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VC-1.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"VC-1",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"AVS3",permalink:"/docs/video/AVS3"},next:{title:"Theora",permalink:"/docs/video/Theora"}},s={},a=[{value:"Encoding",id:"encoding",level:2},{value:"Decoding",id:"decoding",level:2}];function l(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"vc-1",children:"VC-1"})}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(i.p,{children:["VC-1 is video codec created by Microsoft and released in 2006. It largely aimed to compete with ",(0,o.jsx)(i.a,{href:"/docs/video/AVC",children:"AVC"}),"."]}),"\n",(0,o.jsx)(i.h2,{id:"encoding",children:"Encoding"}),"\n",(0,o.jsxs)(i.p,{children:["VC-1 can be contained in ",(0,o.jsx)(i.code,{children:".mp4"}),", ",(0,o.jsx)(i.code,{children:".mkv"}),", and ",(0,o.jsx)(i.code,{children:".avi"})," containers.\nTo be filled"]}),"\n",(0,o.jsx)(i.h2,{id:"decoding",children:"Decoding"}),"\n",(0,o.jsxs)(i.p,{children:["VC-1 can be decoded by ",(0,o.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),", ",(0,o.jsx)(i.a,{href:"/docs/video-players",children:"VLC"}),", ",(0,o.jsx)(i.a,{href:"/docs/video-players",children:"MPV"}),", and any device that supports blu-ray."]})]})}function u(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>c,x:()=>r});var o=n(6540);const t={},d=o.createContext(t);function c(e){const i=o.useContext(d);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),o.createElement(d.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43624f55.62b1a6b4.js b/assets/js/43624f55.62b1a6b4.js new file mode 100644 index 000000000..c285cef41 --- /dev/null +++ b/assets/js/43624f55.62b1a6b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7844],{697:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"filtering/ivtc","title":"Inverse Telecine","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/filtering/ivtc.mdx","sourceDirName":"filtering","slug":"/filtering/ivtc","permalink":"/docs/filtering/ivtc","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/ivtc.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Inverse Telecine","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Basics of Filtering","permalink":"/docs/filtering/basics"},"next":{"title":"Deinterlace","permalink":"/docs/filtering/deinterlace"}}');var o=i(4848),r=i(8453);const s={title:"Inverse Telecine",sidebar_position:4},c="Inverse Telecine",a={},l=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"inverse-telecine",children:"Inverse Telecine"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>c});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43624f55.f9414b4d.js b/assets/js/43624f55.f9414b4d.js deleted file mode 100644 index 327701287..000000000 --- a/assets/js/43624f55.f9414b4d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7844],{3676:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var n=i(4848),o=i(8453);const r={title:"Inverse Telecine",sidebar_position:4},s="Inverse Telecine",c={id:"filtering/ivtc",title:"Inverse Telecine",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/ivtc.mdx",sourceDirName:"filtering",slug:"/filtering/ivtc",permalink:"/docs/filtering/ivtc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/ivtc.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Inverse Telecine",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Basics of Filtering",permalink:"/docs/filtering/basics"},next:{title:"Deinterlace",permalink:"/docs/filtering/deinterlace"}},a={},l=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"inverse-telecine",children:"Inverse Telecine"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>c});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/44e37655.804c7bd9.js b/assets/js/44e37655.804c7bd9.js deleted file mode 100644 index 16a82f6fe..000000000 --- a/assets/js/44e37655.804c7bd9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5958],{6147:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var r=n(4848),i=n(8453),s=n(1470),a=n(9365);const o={title:"SSIMULACRA2",sidebar_position:1},l="SSIMULACRA2",c={id:"metrics/SSIMULACRA2",title:"SSIMULACRA2",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/SSIMULACRA2.mdx",sourceDirName:"metrics",slug:"/metrics/SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIMULACRA2.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"SSIMULACRA2",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIM",permalink:"/docs/metrics/SSIM"},next:{title:"VMAF",permalink:"/docs/metrics/VMAF"}},u={},d=[{value:"Installing",id:"installing",level:2},{value:"Running",id:"running",level:2},{value:"On Images",id:"on-images",level:3},{value:"On Videos",id:"on-videos",level:3},{value:"Multithreading",id:"multithreading",level:4},{value:"Frame skipping",id:"frame-skipping",level:4},{value:"Scoring",id:"scoring",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"ssimulacra2",children:"SSIMULACRA2"})}),"\n",(0,r.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,r.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,r.jsxs)(t.p,{children:["SSIMULACRA 2 is a visual fidelity metric based on the concept of the multi-scale structural similarity index measure (MS-SSIM), computed in a perceptually relevant color space, adding two other (asymmetric) error maps, and aggregating using two different norms. It is currently the most reputable visual quality metric according to its correlation with subjective results, and is considered a very robust means of comparing encoders. It is debatable whether ",(0,r.jsx)(t.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"})," is better for very high fidelity, but SSIMULACRA 2 is considered the best for medium/low fidelity comparisons. Although it does not feature any inter-frame temporal awareness, it is still considered a very strong metric for video fidelity comparison nonetheless."]}),"\n",(0,r.jsxs)(t.p,{children:["While a ",(0,r.jsx)(t.a,{href:"https://github.com/cloudinary/ssimulacra2",children:"reference implementation by Cloudinary"})," exists,\nmost people will want to use ",(0,r.jsxs)(t.a,{href:"https://github.com/rust-av/ssimulacra2",children:["the rust implementation ",(0,r.jsx)(t.code,{children:"ssimulacra2_rs"})]}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"installing",children:"Installing"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsxs)(a.A,{value:"cargo",label:"Cargo",default:!0,children:[(0,r.jsx)(t.p,{children:"To install ssimulacra2_rs using cargo, run this:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cargo install ssimulacra2_rs\n"})})]}),(0,r.jsxs)(a.A,{value:"archlinux",label:"Archlinux AUR",children:[(0,r.jsxs)(t.p,{children:["On archlinux, you may use the ",(0,r.jsx)(t.a,{href:"https://wiki.archlinux.org/title/Arch_User_Repository",children:"AUR"})," to install.\nSimply use your favorite AUR helper to install ",(0,r.jsx)(t.code,{children:"ssimulacra2_bin-git"})]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"paru -S ssimulacra2_bin-git\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"running",children:"Running"}),"\n",(0,r.jsx)(t.h3,{id:"on-images",children:"On Images"}),"\n",(0,r.jsx)(t.p,{children:"Comparing images is simple, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs image source.png distorted.png\n"})}),"\n",(0,r.jsx)(t.h3,{id:"on-videos",children:"On Videos"}),"\n",(0,r.jsx)(t.p,{children:"If you want to compare videos, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv\n"})}),"\n",(0,r.jsxs)(t.admonition,{title:"Graphical visualization",type:"tip",children:[(0,r.jsxs)(t.p,{children:["You can optionally output a graph using the ",(0,r.jsx)(t.code,{children:"-g"})," parameter:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -g\n"})})]}),"\n",(0,r.jsx)(t.h4,{id:"multithreading",children:"Multithreading"}),"\n",(0,r.jsx)(t.p,{children:"Multithreading with ssimulacra2_rs works, but it scales badly.\nThis is likely due to memory bandwidth limitations.\nHowever, the speedup is worth it."}),"\n",(0,r.jsxs)(t.p,{children:["To run multithreaded, use the ",(0,r.jsx)(t.code,{children:"--frame-threads"})," or ",(0,r.jsx)(t.code,{children:"-f"})," parameters.\nFor example, to run with 16 threads:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -f 16\n"})}),"\n",(0,r.jsx)(t.admonition,{title:"Thread amount",type:"info",children:(0,r.jsx)(t.p,{children:"You should set the amount of threads to half of your actual thread count, as going any higher won't make a difference."})}),"\n",(0,r.jsx)(t.admonition,{title:"Memory limitation",type:"warning",children:(0,r.jsx)(t.p,{children:"If you have a small amount of system memory, you may encounter out of memory errors while running with multi-threading.\nIf that's the case, you need to lower the amount of threads."})}),"\n",(0,r.jsx)(t.h4,{id:"frame-skipping",children:"Frame skipping"}),"\n",(0,r.jsx)(t.p,{children:"SSIMULACRA 2 is, at its core, an image quality assessment metric, not a video quality one.\nThis means that it does not use any temporal information when applied to videos; just the independent scores of each individual frame.\nConsequently, it can be applied to a subset of a video's frames, instead of to all of them, to obtain a meaningful estimate of the score in a reduced time."}),"\n",(0,r.jsxs)(t.p,{children:["To run ssimulacra2_rs with frame skip enabled, use the ",(0,r.jsx)(t.code,{children:"--increment"})," or ",(0,r.jsx)(t.code,{children:"-i"})," parameters.\nFor example, to compute the score for every 3rd frame:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -i 3\n"})}),"\n",(0,r.jsxs)(t.admonition,{title:"Frame skip amount",type:"info",children:[(0,r.jsx)(t.p,{children:"To avoid biased score estimates, it is recommended to sample frames using an odd value as increment.\nPrime numbers further reduce the likelihood of sampling bias.\nThus increments of 3, 5, 7, 11 or 13 frames are good options to compute score estimates with little deviation to the true score."}),(0,r.jsx)(t.p,{children:"In any case, powers of two (2, 4, 8, 16...) should be avoided as increment, due to the way video encoders deal with temporal layers."})]}),"\n",(0,r.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,r.jsx)(t.p,{children:"The score that SSIMULACRA 2 outputs is simple: a number in range -inf..100. According to the developers of the metric, for image quality assessment, SSIMULACRA 2 scores correlate to subjective visual quality as follows:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Very high quality: ",(0,r.jsx)(t.code,{children:"90"})," and above"]}),"\n",(0,r.jsxs)(t.li,{children:["High quality: ",(0,r.jsx)(t.code,{children:"70"})," to ",(0,r.jsx)(t.code,{children:"90"})]}),"\n",(0,r.jsxs)(t.li,{children:["Medium quality: ",(0,r.jsx)(t.code,{children:"50"})," to ",(0,r.jsx)(t.code,{children:"70"})]}),"\n",(0,r.jsxs)(t.li,{children:["Low quality: Below ",(0,r.jsx)(t.code,{children:"50"})]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["For video quality assessment, however, the scores need not be as high for similar subjective visual quality correlation.\nFor example, it is believed that an average score of around ",(0,r.jsx)(t.code,{children:"80"}),' corresponds to a "visually lossless" video.\nNevertheless, this has not been thoroughly verified.']})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var r=n(4164);const i={tabItem:"tabItem_Ymn6"};var s=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(6540),i=n(4164),s=n(3104),a=n(6347),o=n(205),l=n(7485),c=n(1682),u=n(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:i}}=e;return{value:t,label:n,attributes:r,default:i}}))}(n);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:n}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:i}=e,s=h(e),[a,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:s}))),[c,d]=p({queryString:n,groupId:i}),[f,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,u.Dv)(n);return[i,(0,r.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:i}),v=(()=>{const e=c??f;return m({value:e,tabValues:s})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,s]),tabValues:s}}var g=n(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(4848);function x(e){let{className:t,block:n,selectedValue:r,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),u=e=>{const t=e.currentTarget,n=l.indexOf(t),i=o[n].value;i!==r&&(c(t),a(i))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>l.push(e),onKeyDown:d,onClick:u,...s,className:(0,i.A)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:s}=e;const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,r.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=f(e);return(0,b.jsxs)("div",{className:(0,i.A)("tabs-container",v.tabList),children:[(0,b.jsx)(x,{...t,...e}),(0,b.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,b.jsx)(y,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var r=n(6540);const i={},s=r.createContext(i);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/44e37655.8123b1c7.js b/assets/js/44e37655.8123b1c7.js new file mode 100644 index 000000000..057f0dfec --- /dev/null +++ b/assets/js/44e37655.8123b1c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5958],{3453:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"metrics/SSIMULACRA2","title":"SSIMULACRA2","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/metrics/SSIMULACRA2.mdx","sourceDirName":"metrics","slug":"/metrics/SSIMULACRA2","permalink":"/docs/metrics/SSIMULACRA2","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIMULACRA2.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"SSIMULACRA2","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"SSIM","permalink":"/docs/metrics/SSIM"},"next":{"title":"VMAF","permalink":"/docs/metrics/VMAF"}}');var i=n(4848),s=n(8453),a=n(1470),o=n(9365);const l={title:"SSIMULACRA2",sidebar_position:1},c="SSIMULACRA2",u={},d=[{value:"Installing",id:"installing",level:2},{value:"Running",id:"running",level:2},{value:"On Images",id:"on-images",level:3},{value:"On Videos",id:"on-videos",level:3},{value:"Multithreading",id:"multithreading",level:4},{value:"Frame skipping",id:"frame-skipping",level:4},{value:"Scoring",id:"scoring",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"ssimulacra2",children:"SSIMULACRA2"})}),"\n",(0,i.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsxs)(t.p,{children:["SSIMULACRA 2 is a visual fidelity metric based on the concept of the multi-scale structural similarity index measure (MS-SSIM), computed in a perceptually relevant color space, adding two other (asymmetric) error maps, and aggregating using two different norms. It is currently the most reputable visual quality metric according to its correlation with subjective results, and is considered a very robust means of comparing encoders. It is debatable whether ",(0,i.jsx)(t.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"})," is better for very high fidelity, but SSIMULACRA 2 is considered the best for medium/low fidelity comparisons. Although it does not feature any inter-frame temporal awareness, it is still considered a very strong metric for video fidelity comparison nonetheless."]}),"\n",(0,i.jsxs)(t.p,{children:["While a ",(0,i.jsx)(t.a,{href:"https://github.com/cloudinary/ssimulacra2",children:"reference implementation by Cloudinary"})," exists,\nmost people will want to use ",(0,i.jsxs)(t.a,{href:"https://github.com/rust-av/ssimulacra2",children:["the rust implementation ",(0,i.jsx)(t.code,{children:"ssimulacra2_rs"})]}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"installing",children:"Installing"}),"\n",(0,i.jsxs)(a.A,{children:[(0,i.jsxs)(o.A,{value:"cargo",label:"Cargo",default:!0,children:[(0,i.jsx)(t.p,{children:"To install ssimulacra2_rs using cargo, run this:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"cargo install ssimulacra2_rs\n"})})]}),(0,i.jsxs)(o.A,{value:"archlinux",label:"Archlinux AUR",children:[(0,i.jsxs)(t.p,{children:["On archlinux, you may use the ",(0,i.jsx)(t.a,{href:"https://wiki.archlinux.org/title/Arch_User_Repository",children:"AUR"})," to install.\nSimply use your favorite AUR helper to install ",(0,i.jsx)(t.code,{children:"ssimulacra2_bin-git"})]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"paru -S ssimulacra2_bin-git\n"})})]})]}),"\n",(0,i.jsx)(t.h2,{id:"running",children:"Running"}),"\n",(0,i.jsx)(t.h3,{id:"on-images",children:"On Images"}),"\n",(0,i.jsx)(t.p,{children:"Comparing images is simple, run this:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs image source.png distorted.png\n"})}),"\n",(0,i.jsx)(t.h3,{id:"on-videos",children:"On Videos"}),"\n",(0,i.jsx)(t.p,{children:"If you want to compare videos, run this:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv\n"})}),"\n",(0,i.jsxs)(t.admonition,{title:"Graphical visualization",type:"tip",children:[(0,i.jsxs)(t.p,{children:["You can optionally output a graph using the ",(0,i.jsx)(t.code,{children:"-g"})," parameter:"]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -g\n"})})]}),"\n",(0,i.jsx)(t.h4,{id:"multithreading",children:"Multithreading"}),"\n",(0,i.jsx)(t.p,{children:"Multithreading with ssimulacra2_rs works, but it scales badly.\nThis is likely due to memory bandwidth limitations.\nHowever, the speedup is worth it."}),"\n",(0,i.jsxs)(t.p,{children:["To run multithreaded, use the ",(0,i.jsx)(t.code,{children:"--frame-threads"})," or ",(0,i.jsx)(t.code,{children:"-f"})," parameters.\nFor example, to run with 16 threads:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -f 16\n"})}),"\n",(0,i.jsx)(t.admonition,{title:"Thread amount",type:"info",children:(0,i.jsx)(t.p,{children:"You should set the amount of threads to half of your actual thread count, as going any higher won't make a difference."})}),"\n",(0,i.jsx)(t.admonition,{title:"Memory limitation",type:"warning",children:(0,i.jsx)(t.p,{children:"If you have a small amount of system memory, you may encounter out of memory errors while running with multi-threading.\nIf that's the case, you need to lower the amount of threads."})}),"\n",(0,i.jsx)(t.h4,{id:"frame-skipping",children:"Frame skipping"}),"\n",(0,i.jsx)(t.p,{children:"SSIMULACRA 2 is, at its core, an image quality assessment metric, not a video quality one.\nThis means that it does not use any temporal information when applied to videos; just the independent scores of each individual frame.\nConsequently, it can be applied to a subset of a video's frames, instead of to all of them, to obtain a meaningful estimate of the score in a reduced time."}),"\n",(0,i.jsxs)(t.p,{children:["To run ssimulacra2_rs with frame skip enabled, use the ",(0,i.jsx)(t.code,{children:"--increment"})," or ",(0,i.jsx)(t.code,{children:"-i"})," parameters.\nFor example, to compute the score for every 3rd frame:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -i 3\n"})}),"\n",(0,i.jsxs)(t.admonition,{title:"Frame skip amount",type:"info",children:[(0,i.jsx)(t.p,{children:"To avoid biased score estimates, it is recommended to sample frames using an odd value as increment.\nPrime numbers further reduce the likelihood of sampling bias.\nThus increments of 3, 5, 7, 11 or 13 frames are good options to compute score estimates with little deviation to the true score."}),(0,i.jsx)(t.p,{children:"In any case, powers of two (2, 4, 8, 16...) should be avoided as increment, due to the way video encoders deal with temporal layers."})]}),"\n",(0,i.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,i.jsx)(t.p,{children:"The score that SSIMULACRA 2 outputs is simple: a number in range -inf..100. According to the developers of the metric, for image quality assessment, SSIMULACRA 2 scores correlate to subjective visual quality as follows:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Very high quality: ",(0,i.jsx)(t.code,{children:"90"})," and above"]}),"\n",(0,i.jsxs)(t.li,{children:["High quality: ",(0,i.jsx)(t.code,{children:"70"})," to ",(0,i.jsx)(t.code,{children:"90"})]}),"\n",(0,i.jsxs)(t.li,{children:["Medium quality: ",(0,i.jsx)(t.code,{children:"50"})," to ",(0,i.jsx)(t.code,{children:"70"})]}),"\n",(0,i.jsxs)(t.li,{children:["Low quality: Below ",(0,i.jsx)(t.code,{children:"50"})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["For video quality assessment, however, the scores need not be as high for similar subjective visual quality correlation.\nFor example, it is believed that an average score of around ",(0,i.jsx)(t.code,{children:"80"}),' corresponds to a "visually lossless" video.\nNevertheless, this has not been thoroughly verified.']})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var r=n(4164);const i={tabItem:"tabItem_Ymn6"};var s=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(6540),i=n(4164),s=n(3104),a=n(6347),o=n(205),l=n(7485),c=n(1682),u=n(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:i}}=e;return{value:t,label:n,attributes:r,default:i}}))}(n);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:n}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:i}=e,s=h(e),[a,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:s}))),[c,d]=p({queryString:n,groupId:i}),[f,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,u.Dv)(n);return[i,(0,r.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:i}),v=(()=>{const e=c??f;return m({value:e,tabValues:s})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,s]),tabValues:s}}var g=n(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(4848);function x(e){let{className:t,block:n,selectedValue:r,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),u=e=>{const t=e.currentTarget,n=l.indexOf(t),i=o[n].value;i!==r&&(c(t),a(i))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>l.push(e),onKeyDown:d,onClick:u,...s,className:(0,i.A)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:s}=e;const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,r.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=f(e);return(0,b.jsxs)("div",{className:(0,i.A)("tabs-container",v.tabList),children:[(0,b.jsx)(x,{...t,...e}),(0,b.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,b.jsx)(y,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var r=n(6540);const i={},s=r.createContext(i);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/45f4020c.350d0fe8.js b/assets/js/45f4020c.350d0fe8.js new file mode 100644 index 000000000..023907a78 --- /dev/null +++ b/assets/js/45f4020c.350d0fe8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4897],{2962:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>d,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"encoders_hw/videotoolbox","title":"VideoToolbox","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/encoders_hw/videotoolbox.mdx","sourceDirName":"encoders_hw","slug":"/encoders_hw/videotoolbox","permalink":"/docs/encoders_hw/videotoolbox","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/videotoolbox.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"VideoToolbox","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"AMF","permalink":"/docs/encoders_hw/amf"},"next":{"title":"Mediacodec","permalink":"/docs/encoders_hw/mediacodec"}}');var s=i(4848),t=i(8453);const d={title:"VideoToolbox",sidebar_position:4},r="VideoToolbox",c={},a=[{value:"Usage",id:"usage",level:2},{value:"FFmpeg",id:"ffmpeg",level:3},{value:"Handbrake",id:"handbrake",level:3}];function l(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"videotoolbox",children:"VideoToolbox"})}),"\n",(0,s.jsx)(o.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(o.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsx)(o.p,{children:"Apple's VideoToolbox is a low-level framework that provides direct access to hardware encoders and decoders. It offers services for video compression and decompression, as well as conversion between raster image formats stored in CoreVideo pixel buffers. The VideoToolbox encoder works by compressing video data for various applications such as low-latency conferencing, live streaming, and offline transcoding. It supports hardware encoding on most Macs from 2011 and later, and uses Apple's Media Engine on devices with Apple T2 chips or Apple Silicon."}),"\n",(0,s.jsxs)(o.p,{children:["The encoder can be configured to optimize encoding for specific applications, and it supports various video codecs including ",(0,s.jsx)(o.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,s.jsx)(o.a,{href:"/docs/video/HEVC",children:"H.265"}),", with support for H.265 8-bit and 10-bit encoding. It is worth noting that the VideoToolbox encoder is designed for applications that require direct access to hardware encoders and decoders."]}),"\n",(0,s.jsxs)(o.p,{children:["Apple's VideoToolbox framework also supports hardware accelerated video decoding for a number of video codecs. As of the Apple M3, these include ",(0,s.jsx)(o.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,s.jsx)(o.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,s.jsx)(o.a,{href:"/docs/video/prores",children:"ProRes"}),", ProRes RAW, and ",(0,s.jsx)(o.a,{href:"/docs/video/AV1",children:"AV1"}),"."]}),"\n",(0,s.jsx)(o.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsxs)(o.p,{children:["Encoding with Videotoolbox on macOS is possible via ",(0,s.jsx)(o.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),", a versatile command line utility, or Handbrake, a GUI for video encoding."]}),"\n",(0,s.jsx)(o.h3,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(o.p,{children:["To use H.264 or H.265 (HEVC) hardware encoding in macOS via VideoToolbox, just use the encoder ",(0,s.jsx)(o.code,{children:"-c:v h264_videotoolbox"})," or ",(0,s.jsx)(o.code,{children:"-c:v hevc_videotoolbox"})," for H.264 or HEVC respectively."]}),"\n",(0,s.jsx)(o.p,{children:"Here are some example commands for encoding with VideoToolbox on Apple Silicon via FFmpeg:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",metastring:'title="H.264 encoding (high profile)"',children:"ffmpeg -i input.mkv -c:v h264_videotoolbox -profile 100 -q:v [0-100] output.mp4\n"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",metastring:'title="8-bit HEVC encoding (main profile)"',children:"ffmpeg -i input.mkv -c:v hevc_videotoolbox -profile 1 -q:v [0-100] -tag:v hvc1 output.mp4\n"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",metastring:'title="10-bit HEVC encoding (main10 profile)"',children:"ffmpeg -i input.mkv -c:v hevc_videotoolbox -profile 2 -q:v [0-100] -tag:v hvc1 output.mp4\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Just run ",(0,s.jsx)(o.code,{children:"ffmpeg -help encoder=hevc_videotoolbox"})," or ",(0,s.jsx)(o.code,{children:"ffmpeg -help encoder=h264_videotoolbox"})," for more info."]}),"\n",(0,s.jsx)(o.h3,{id:"handbrake",children:"Handbrake"}),"\n",(0,s.jsx)(o.p,{children:"To be filled."}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.em,{children:"Sources"}),"\n(1) Video Toolbox | Apple Developer Documentation. ",(0,s.jsx)(o.a,{href:"https://developer.apple.com/documentation/videotoolbox",children:"https://developer.apple.com/documentation/videotoolbox"}),".\n(2) HandBrake Documentation \u2014 Apple VideoToolbox. ",(0,s.jsx)(o.a,{href:"https://handbrake.fr/docs/en/latest/technical/video-videotoolbox.html",children:"https://handbrake.fr/docs/en/latest/technical/video-videotoolbox.html"}),".\n(3) Apple's T2 chip makes a giant difference in video encoding for most .... ",(0,s.jsx)(o.a,{href:"https://appleinsider.com/articles/19/04/09/apples-t2-chip-makes-a-giant-difference-in-video-encoding-for-most-users",children:"https://appleinsider.com/articles/19/04/09/apples-t2-chip-makes-a-giant-difference-in-video-encoding-for-most-users"}),"."]})]})}function p(e={}){const{wrapper:o}={...(0,t.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,o,i)=>{i.d(o,{R:()=>d,x:()=>r});var n=i(6540);const s={},t=n.createContext(s);function d(e){const o=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/45f4020c.7ec68f38.js b/assets/js/45f4020c.7ec68f38.js deleted file mode 100644 index 3569b4586..000000000 --- a/assets/js/45f4020c.7ec68f38.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4897],{9493:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>t,metadata:()=>s,toc:()=>a});var n=i(4848),d=i(8453);const t={title:"VideoToolbox",sidebar_position:4},r="VideoToolbox",s={id:"encoders_hw/videotoolbox",title:"VideoToolbox",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders_hw/videotoolbox.mdx",sourceDirName:"encoders_hw",slug:"/encoders_hw/videotoolbox",permalink:"/docs/encoders_hw/videotoolbox",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/videotoolbox.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"VideoToolbox",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"AMF",permalink:"/docs/encoders_hw/amf"},next:{title:"Mediacodec",permalink:"/docs/encoders_hw/mediacodec"}},c={},a=[{value:"Usage",id:"usage",level:2},{value:"FFmpeg",id:"ffmpeg",level:3},{value:"Handbrake",id:"handbrake",level:3}];function l(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"videotoolbox",children:"VideoToolbox"})}),"\n",(0,n.jsx)(o.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(o.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsx)(o.p,{children:"Apple's VideoToolbox is a low-level framework that provides direct access to hardware encoders and decoders. It offers services for video compression and decompression, as well as conversion between raster image formats stored in CoreVideo pixel buffers. The VideoToolbox encoder works by compressing video data for various applications such as low-latency conferencing, live streaming, and offline transcoding. It supports hardware encoding on most Macs from 2011 and later, and uses Apple's Media Engine on devices with Apple T2 chips or Apple Silicon."}),"\n",(0,n.jsxs)(o.p,{children:["The encoder can be configured to optimize encoding for specific applications, and it supports various video codecs including ",(0,n.jsx)(o.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,n.jsx)(o.a,{href:"/docs/video/HEVC",children:"H.265"}),", with support for H.265 8-bit and 10-bit encoding. It is worth noting that the VideoToolbox encoder is designed for applications that require direct access to hardware encoders and decoders."]}),"\n",(0,n.jsxs)(o.p,{children:["Apple's VideoToolbox framework also supports hardware accelerated video decoding for a number of video codecs. As of the Apple M3, these include ",(0,n.jsx)(o.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,n.jsx)(o.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,n.jsx)(o.a,{href:"/docs/video/prores",children:"ProRes"}),", ProRes RAW, and ",(0,n.jsx)(o.a,{href:"/docs/video/AV1",children:"AV1"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsxs)(o.p,{children:["Encoding with Videotoolbox on macOS is possible via ",(0,n.jsx)(o.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),", a versatile command line utility, or Handbrake, a GUI for video encoding."]}),"\n",(0,n.jsx)(o.h3,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(o.p,{children:["To use H.264 or H.265 (HEVC) hardware encoding in macOS via VideoToolbox, just use the encoder ",(0,n.jsx)(o.code,{children:"-c:v h264_videotoolbox"})," or ",(0,n.jsx)(o.code,{children:"-c:v hevc_videotoolbox"})," for H.264 or HEVC respectively."]}),"\n",(0,n.jsx)(o.p,{children:"Here are some example commands for encoding with VideoToolbox on Apple Silicon via FFmpeg:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",metastring:'title="H.264 encoding (high profile)"',children:"ffmpeg -i input.mkv -c:v h264_videotoolbox -profile 100 -q:v [0-100] output.mp4\n"})}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",metastring:'title="8-bit HEVC encoding (main profile)"',children:"ffmpeg -i input.mkv -c:v hevc_videotoolbox -profile 1 -q:v [0-100] -tag:v hvc1 output.mp4\n"})}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",metastring:'title="10-bit HEVC encoding (main10 profile)"',children:"ffmpeg -i input.mkv -c:v hevc_videotoolbox -profile 2 -q:v [0-100] -tag:v hvc1 output.mp4\n"})}),"\n",(0,n.jsxs)(o.p,{children:["Just run ",(0,n.jsx)(o.code,{children:"ffmpeg -help encoder=hevc_videotoolbox"})," or ",(0,n.jsx)(o.code,{children:"ffmpeg -help encoder=h264_videotoolbox"})," for more info."]}),"\n",(0,n.jsx)(o.h3,{id:"handbrake",children:"Handbrake"}),"\n",(0,n.jsx)(o.p,{children:"To be filled."}),"\n",(0,n.jsxs)(o.p,{children:[(0,n.jsx)(o.em,{children:"Sources"}),"\n(1) Video Toolbox | Apple Developer Documentation. ",(0,n.jsx)(o.a,{href:"https://developer.apple.com/documentation/videotoolbox",children:"https://developer.apple.com/documentation/videotoolbox"}),".\n(2) HandBrake Documentation \u2014 Apple VideoToolbox. ",(0,n.jsx)(o.a,{href:"https://handbrake.fr/docs/en/latest/technical/video-videotoolbox.html",children:"https://handbrake.fr/docs/en/latest/technical/video-videotoolbox.html"}),".\n(3) Apple's T2 chip makes a giant difference in video encoding for most .... ",(0,n.jsx)(o.a,{href:"https://appleinsider.com/articles/19/04/09/apples-t2-chip-makes-a-giant-difference-in-video-encoding-for-most-users",children:"https://appleinsider.com/articles/19/04/09/apples-t2-chip-makes-a-giant-difference-in-video-encoding-for-most-users"}),"."]})]})}function p(e={}){const{wrapper:o}={...(0,d.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,o,i)=>{i.d(o,{R:()=>r,x:()=>s});var n=i(6540);const d={},t=n.createContext(d);function r(e){const o=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),n.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/467a109f.87b8ee9a.js b/assets/js/467a109f.53fb113a.js similarity index 68% rename from assets/js/467a109f.87b8ee9a.js rename to assets/js/467a109f.53fb113a.js index 67d196830..a5b9b2beb 100644 --- a/assets/js/467a109f.87b8ee9a.js +++ b/assets/js/467a109f.53fb113a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7431],{891:a=>{a.exports=JSON.parse('{"tag":{"label":"benchmarks","permalink":"/blog/tags/benchmarks","allTagsPath":"/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/benchmarks","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7431],{891:a=>{a.exports=JSON.parse('{"tag":{"label":"benchmarks","permalink":"/blog/tags/benchmarks","allTagsPath":"/blog/tags","count":3,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/benchmarks","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/489.ac3cadbd.js b/assets/js/489.ac3cadbd.js deleted file mode 100644 index 6ad47144f..000000000 --- a/assets/js/489.ac3cadbd.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 489.ac3cadbd.js.LICENSE.txt */ -(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[489],{489:(t,e,n)=>{"use strict";t.exports=n(810)},2542:(t,e,n)=>{"use strict";var i=n(6573),s={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:"0"},defaultClasses:{root:"algolia-autocomplete",prefix:"aa",noPrefix:!1,dropdownMenu:"dropdown-menu",input:"input",hint:"hint",suggestions:"suggestions",suggestion:"suggestion",cursor:"cursor",dataset:"dataset",empty:"empty"},appendTo:{wrapper:{position:"absolute",zIndex:"100",display:"none"},input:{},inputWithNoHint:{},dropdown:{display:"block"}}};i.isMsie()&&i.mixin(s.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),i.isMsie()&&i.isMsie()<=7&&i.mixin(s.input,{marginTop:"-1px"}),t.exports=s},897:(t,e,n)=>{"use strict";var i="aaDataset",s="aaValue",r="aaDatum",o=n(6573),a=n(1348),u=n(9272),c=n(2542),l=n(4436);function h(t){var e;(t=t||{}).templates=t.templates||{},t.source||o.error("missing source"),t.name&&(e=t.name,!/^[_a-zA-Z0-9-]+$/.test(e))&&o.error("invalid dataset name: "+t.name),this.query=null,this._isEmpty=!0,this.highlight=!!t.highlight,this.name=void 0===t.name||null===t.name?o.getUniqueId():t.name,this.source=t.source,this.displayFn=function(t){return t=t||"value",o.isFunction(t)?t:e;function e(e){return e[t]}}(t.display||t.displayKey),this.debounce=t.debounce,this.cache=!1!==t.cache,this.templates=function(t,e){return{empty:t.empty&&o.templatify(t.empty),header:t.header&&o.templatify(t.header),footer:t.footer&&o.templatify(t.footer),suggestion:t.suggestion||n};function n(t){return"

"+e(t)+"

"}}(t.templates,this.displayFn),this.css=o.mixin({},c,t.appendTo?c.appendTo:{}),this.cssClasses=t.cssClasses=o.mixin({},c.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix||o.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix);var n=o.className(this.cssClasses.prefix,this.cssClasses.dataset);this.$el=t.$menu&&t.$menu.find(n+"-"+this.name).length>0?a.element(t.$menu.find(n+"-"+this.name)[0]):a.element(u.dataset.replace("%CLASS%",this.name).replace("%PREFIX%",this.cssClasses.prefix).replace("%DATASET%",this.cssClasses.dataset)),this.$menu=t.$menu,this.clearCachedSuggestions()}h.extractDatasetName=function(t){return a.element(t).data(i)},h.extractValue=function(t){return a.element(t).data(s)},h.extractDatum=function(t){var e=a.element(t).data(r);return"string"==typeof e&&(e=JSON.parse(e)),e},o.mixin(h.prototype,l,{_render:function(t,e){if(this.$el){var n,c=this,l=[].slice.call(arguments,2);if(this.$el.empty(),n=e&&e.length,this._isEmpty=!n,!n&&this.templates.empty)this.$el.html(function(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!0}].concat(e),c.templates.empty.apply(this,e)}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(n)this.$el.html(function(){var t,n,l=[].slice.call(arguments,0),h=this,p=u.suggestions.replace("%PREFIX%",this.cssClasses.prefix).replace("%SUGGESTIONS%",this.cssClasses.suggestions);return t=a.element(p).css(this.css.suggestions),n=o.map(e,f),t.append.apply(t,n),t;function f(t){var e,n=u.suggestion.replace("%PREFIX%",h.cssClasses.prefix).replace("%SUGGESTION%",h.cssClasses.suggestion);return(e=a.element(n).attr({role:"option",id:["option",Math.floor(1e8*Math.random())].join("-")}).append(c.templates.suggestion.apply(this,[t].concat(l)))).data(i,c.name),e.data(s,c.displayFn(t)||void 0),e.data(r,JSON.stringify(t)),e.children().each((function(){a.element(this).css(h.css.suggestionChild)})),e}}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(e&&!Array.isArray(e))throw new TypeError("suggestions must be an array");this.$menu&&this.$menu.addClass(this.cssClasses.prefix+(n?"with":"without")+"-"+this.name).removeClass(this.cssClasses.prefix+(n?"without":"with")+"-"+this.name),this.trigger("rendered",t)}function h(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!n}].concat(e),c.templates.header.apply(this,e)}function p(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!n}].concat(e),c.templates.footer.apply(this,e)}},getRoot:function(){return this.$el},update:function(t){function e(e){if(!this.canceled&&t===this.query){var n=[].slice.call(arguments,1);this.cacheSuggestions(t,e,n),this._render.apply(this,[t,e].concat(n))}}if(this.query=t,this.canceled=!1,this.shouldFetchFromCache(t))e.apply(this,[this.cachedSuggestions].concat(this.cachedRenderExtraArgs));else{var n=this,i=function(){n.canceled||n.source(t,e.bind(n))};if(this.debounce){clearTimeout(this.debounceTimeout),this.debounceTimeout=setTimeout((function(){n.debounceTimeout=null,i()}),this.debounce)}else i()}},cacheSuggestions:function(t,e,n){this.cachedQuery=t,this.cachedSuggestions=e,this.cachedRenderExtraArgs=n},shouldFetchFromCache:function(t){return this.cache&&this.cachedQuery===t&&this.cachedSuggestions&&this.cachedSuggestions.length},clearCachedSuggestions:function(){delete this.cachedQuery,delete this.cachedSuggestions,delete this.cachedRenderExtraArgs},cancel:function(){this.canceled=!0},clear:function(){this.$el&&(this.cancel(),this.$el.empty(),this.trigger("rendered",""))},isEmpty:function(){return this._isEmpty},destroy:function(){this.clearCachedSuggestions(),this.$el=null}}),t.exports=h},1540:(t,e,n)=>{"use strict";var i=n(6573),s=n(1348),r=n(4436),o=n(897),a=n(2542);function u(t){var e,n,r,o=this;(t=t||{}).menu||i.error("menu is required"),i.isArray(t.datasets)||i.isObject(t.datasets)||i.error("1 or more datasets required"),t.datasets||i.error("datasets is required"),this.isOpen=!1,this.isEmpty=!0,this.minLength=t.minLength||0,this.templates={},this.appendTo=t.appendTo||!1,this.css=i.mixin({},a,t.appendTo?a.appendTo:{}),this.cssClasses=t.cssClasses=i.mixin({},a.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix||i.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),e=i.bind(this._onSuggestionClick,this),n=i.bind(this._onSuggestionMouseEnter,this),r=i.bind(this._onSuggestionMouseLeave,this);var c=i.className(this.cssClasses.prefix,this.cssClasses.suggestion);this.$menu=s.element(t.menu).on("mouseenter.aa",c,n).on("mouseleave.aa",c,r).on("click.aa",c,e),this.$container=t.appendTo?t.wrapper:this.$menu,t.templates&&t.templates.header&&(this.templates.header=i.templatify(t.templates.header),this.$menu.prepend(this.templates.header())),t.templates&&t.templates.empty&&(this.templates.empty=i.templatify(t.templates.empty),this.$empty=s.element('
'),this.$menu.append(this.$empty),this.$empty.hide()),this.datasets=i.map(t.datasets,(function(e){return function(t,e,n){return new u.Dataset(i.mixin({$menu:t,cssClasses:n},e))}(o.$menu,e,t.cssClasses)})),i.each(this.datasets,(function(t){var e=t.getRoot();e&&0===e.parent().length&&o.$menu.append(e),t.onSync("rendered",o._onRendered,o)})),t.templates&&t.templates.footer&&(this.templates.footer=i.templatify(t.templates.footer),this.$menu.append(this.templates.footer()));var l=this;s.element(window).resize((function(){l._redraw()}))}i.mixin(u.prototype,r,{_onSuggestionClick:function(t){this.trigger("suggestionClicked",s.element(t.currentTarget))},_onSuggestionMouseEnter:function(t){var e=s.element(t.currentTarget);if(!e.hasClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0))){this._removeCursor();var n=this;setTimeout((function(){n._setCursor(e,!1)}),0)}},_onSuggestionMouseLeave:function(t){if(t.relatedTarget&&s.element(t.relatedTarget).closest("."+i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).length>0)return;this._removeCursor(),this.trigger("cursorRemoved")},_onRendered:function(t,e){if(this.isEmpty=i.every(this.datasets,(function(t){return t.isEmpty()})),this.isEmpty)if(e.length>=this.minLength&&this.trigger("empty"),this.$empty)if(e.length=this.minLength?this._show():this._hide());this.trigger("datasetRendered")},_hide:function(){this.$container.hide()},_show:function(){this.$container.css("display","block"),this._redraw(),this.trigger("shown")},_redraw:function(){this.isOpen&&this.appendTo&&this.trigger("redrawn")},_getSuggestions:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.suggestion))},_getCursor:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.cursor)).first()},_setCursor:function(t,e){t.first().addClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).attr("aria-selected","true"),this.trigger("cursorMoved",e)},_removeCursor:function(){this._getCursor().removeClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).removeAttr("aria-selected")},_moveCursor:function(t){var e,n,i,s;this.isOpen&&(n=this._getCursor(),e=this._getSuggestions(),this._removeCursor(),-1!==(i=((i=e.index(n)+t)+1)%(e.length+1)-1)?(i<-1&&(i=e.length-1),this._setCursor(s=e.eq(i),!0),this._ensureVisible(s)):this.trigger("cursorRemoved"))},_ensureVisible:function(t){var e,n,i,s;n=(e=t.position().top)+t.height()+parseInt(t.css("margin-top"),10)+parseInt(t.css("margin-bottom"),10),i=this.$menu.scrollTop(),s=this.$menu.height()+parseInt(this.$menu.css("padding-top"),10)+parseInt(this.$menu.css("padding-bottom"),10),e<0?this.$menu.scrollTop(i+e):s{"use strict";var i=n(6573),s=n(1348);function r(t){t&&t.el||i.error("EventBus initialized without el"),this.$el=s.element(t.el)}i.mixin(r.prototype,{trigger:function(t,e,n,s){var r=i.Event("autocomplete:"+t);return this.$el.trigger(r,[e,n,s]),r}}),t.exports=r},4436:(t,e,n)=>{"use strict";var i=n(874),s=/\s+/;function r(t,e,n,i){var r;if(!n)return this;for(e=e.split(s),n=i?function(t,e){return t.bind?t.bind(e):function(){t.apply(e,[].slice.call(arguments,0))}}(n,i):n,this._callbacks=this._callbacks||{};r=e.shift();)this._callbacks[r]=this._callbacks[r]||{sync:[],async:[]},this._callbacks[r][t].push(n);return this}function o(t,e,n){return function(){for(var i,s=0,r=t.length;!i&&s{"use strict";t.exports={wrapper:'',dropdown:'',dataset:'
',suggestions:'',suggestion:'
'}},9629:(t,e,n)=>{"use strict";var i;i={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"};var s=n(6573),r=n(1348),o=n(4436);function a(t){var e,n,o,a,u,c=this;(t=t||{}).input||s.error("input is missing"),e=s.bind(this._onBlur,this),n=s.bind(this._onFocus,this),o=s.bind(this._onKeydown,this),a=s.bind(this._onInput,this),this.$hint=r.element(t.hint),this.$input=r.element(t.input).on("blur.aa",e).on("focus.aa",n).on("keydown.aa",o),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=s.noop),s.isMsie()?this.$input.on("keydown.aa keypress.aa cut.aa paste.aa",(function(t){i[t.which||t.keyCode]||s.defer(s.bind(c._onInput,c,t))})):this.$input.on("input.aa",a),this.query=this.$input.val(),this.$overflowHelper=(u=this.$input,r.element('').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:u.css("font-family"),fontSize:u.css("font-size"),fontStyle:u.css("font-style"),fontVariant:u.css("font-variant"),fontWeight:u.css("font-weight"),wordSpacing:u.css("word-spacing"),letterSpacing:u.css("letter-spacing"),textIndent:u.css("text-indent"),textRendering:u.css("text-rendering"),textTransform:u.css("text-transform")}).insertAfter(u))}function u(t){return t.altKey||t.ctrlKey||t.metaKey||t.shiftKey}a.normalizeQuery=function(t){return(t||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},s.mixin(a.prototype,o,{_onBlur:function(){this.resetInputValue(),this.$input.removeAttr("aria-activedescendant"),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(t){var e=i[t.which||t.keyCode];this._managePreventDefault(e,t),e&&this._shouldTrigger(e,t)&&this.trigger(e+"Keyed",t)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(t,e){var n,i,s;switch(t){case"tab":i=this.getHint(),s=this.getInputValue(),n=i&&i!==s&&!u(e);break;case"up":case"down":n=!u(e);break;default:n=!1}n&&e.preventDefault()},_shouldTrigger:function(t,e){var n;if("tab"===t)n=!u(e);else n=!0;return n},_checkInputValue:function(){var t,e,n,i,s;t=this.getInputValue(),i=t,s=this.query,n=!(!(e=a.normalizeQuery(i)===a.normalizeQuery(s))||!this.query)&&this.query.length!==t.length,this.query=t,e?n&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(t){this.query=t},getInputValue:function(){return this.$input.val()},setInputValue:function(t,e){void 0===t&&(t=this.query),this.$input.val(t),e?this.clearHint():this._checkInputValue()},expand:function(){this.$input.attr("aria-expanded","true")},collapse:function(){this.$input.attr("aria-expanded","false")},setActiveDescendant:function(t){this.$input.attr("aria-activedescendant",t)},removeActiveDescendant:function(){this.$input.removeAttr("aria-activedescendant")},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(t){this.$hint.val(t)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var t,e,n;n=(t=this.getInputValue())!==(e=this.getHint())&&0===e.indexOf(t),""!==t&&n&&!this.hasOverflow()||this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var t=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=t},isCursorAtEnd:function(){var t,e,n;return t=this.$input.val().length,e=this.$input[0].selectionStart,s.isNumber(e)?e===t:!document.selection||((n=document.selection.createRange()).moveStart("character",-t),t===n.text.length)},destroy:function(){this.$hint.off(".aa"),this.$input.off(".aa"),this.$hint=this.$input=this.$overflowHelper=null}}),t.exports=a},7360:(t,e,n)=>{"use strict";var i="aaAttrs",s=n(6573),r=n(1348),o=n(2324),a=n(9629),u=n(1540),c=n(9272),l=n(2542);function h(t){var e,n;if((t=t||{}).input||s.error("missing input"),this.isActivated=!1,this.debug=!!t.debug,this.autoselect=!!t.autoselect,this.autoselectOnBlur=!!t.autoselectOnBlur,this.openOnFocus=!!t.openOnFocus,this.minLength=s.isNumber(t.minLength)?t.minLength:1,this.autoWidth=void 0===t.autoWidth||!!t.autoWidth,this.clearOnSelected=!!t.clearOnSelected,this.tabAutocomplete=void 0===t.tabAutocomplete||!!t.tabAutocomplete,t.hint=!!t.hint,t.hint&&t.appendTo)throw new Error("[autocomplete.js] hint and appendTo options can't be used at the same time");this.css=t.css=s.mixin({},l,t.appendTo?l.appendTo:{}),this.cssClasses=t.cssClasses=s.mixin({},l.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix=s.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),this.listboxId=t.listboxId=[this.cssClasses.root,"listbox",s.getUniqueId()].join("-");var a=function(t){var e,n,o,a;e=r.element(t.input),n=r.element(c.wrapper.replace("%ROOT%",t.cssClasses.root)).css(t.css.wrapper),t.appendTo||"block"!==e.css("display")||"table"!==e.parent().css("display")||n.css("display","table-cell");var u=c.dropdown.replace("%PREFIX%",t.cssClasses.prefix).replace("%DROPDOWN_MENU%",t.cssClasses.dropdownMenu);o=r.element(u).css(t.css.dropdown).attr({role:"listbox",id:t.listboxId}),t.templates&&t.templates.dropdownMenu&&o.html(s.templatify(t.templates.dropdownMenu)());a=e.clone().css(t.css.hint).css(function(t){return{backgroundAttachment:t.css("background-attachment"),backgroundClip:t.css("background-clip"),backgroundColor:t.css("background-color"),backgroundImage:t.css("background-image"),backgroundOrigin:t.css("background-origin"),backgroundPosition:t.css("background-position"),backgroundRepeat:t.css("background-repeat"),backgroundSize:t.css("background-size")}}(e)),a.val("").addClass(s.className(t.cssClasses.prefix,t.cssClasses.hint,!0)).removeAttr("id name placeholder required").prop("readonly",!0).attr({"aria-hidden":"true",autocomplete:"off",spellcheck:"false",tabindex:-1}),a.removeData&&a.removeData();e.data(i,{"aria-autocomplete":e.attr("aria-autocomplete"),"aria-expanded":e.attr("aria-expanded"),"aria-owns":e.attr("aria-owns"),autocomplete:e.attr("autocomplete"),dir:e.attr("dir"),role:e.attr("role"),spellcheck:e.attr("spellcheck"),style:e.attr("style"),type:e.attr("type")}),e.addClass(s.className(t.cssClasses.prefix,t.cssClasses.input,!0)).attr({autocomplete:"off",spellcheck:!1,role:"combobox","aria-autocomplete":t.datasets&&t.datasets[0]&&t.datasets[0].displayKey?"both":"list","aria-expanded":"false","aria-label":t.ariaLabel,"aria-owns":t.listboxId}).css(t.hint?t.css.input:t.css.inputWithNoHint);try{e.attr("dir")||e.attr("dir","auto")}catch(l){}return n=t.appendTo?n.appendTo(r.element(t.appendTo).eq(0)).eq(0):e.wrap(n).parent(),n.prepend(t.hint?a:null).append(o),{wrapper:n,input:e,hint:a,menu:o}}(t);this.$node=a.wrapper;var u=this.$input=a.input;e=a.menu,n=a.hint,t.dropdownMenuContainer&&r.element(t.dropdownMenuContainer).css("position","relative").append(e.css("top","0")),u.on("blur.aa",(function(t){var n=document.activeElement;s.isMsie()&&(e[0]===n||e[0].contains(n))&&(t.preventDefault(),t.stopImmediatePropagation(),s.defer((function(){u.focus()})))})),e.on("mousedown.aa",(function(t){t.preventDefault()})),this.eventBus=t.eventBus||new o({el:u}),this.dropdown=new h.Dropdown({appendTo:t.appendTo,wrapper:this.$node,menu:e,datasets:t.datasets,templates:t.templates,cssClasses:t.cssClasses,minLength:this.minLength}).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onSync("shown",this._onShown,this).onSync("empty",this._onEmpty,this).onSync("redrawn",this._onRedrawn,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=new h.Input({input:u,hint:n}).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._bindKeyboardShortcuts(t),this._setLanguageDirection()}s.mixin(h.prototype,{_bindKeyboardShortcuts:function(t){if(t.keyboardShortcuts){var e=this.$input,n=[];s.each(t.keyboardShortcuts,(function(t){"string"==typeof t&&(t=t.toUpperCase().charCodeAt(0)),n.push(t)})),r.element(document).keydown((function(t){var i=t.target||t.srcElement,s=i.tagName;if(!i.isContentEditable&&"INPUT"!==s&&"SELECT"!==s&&"TEXTAREA"!==s){var r=t.which||t.keyCode;-1!==n.indexOf(r)&&(e.focus(),t.stopPropagation(),t.preventDefault())}}))}},_onSuggestionClicked:function(t,e){var n;(n=this.dropdown.getDatumForSuggestion(e))&&this._select(n,{selectionMethod:"click"})},_onCursorMoved:function(t,e){var n=this.dropdown.getDatumForCursor(),i=this.dropdown.getCurrentCursor().attr("id");this.input.setActiveDescendant(i),n&&(e&&this.input.setInputValue(n.value,!0),this.eventBus.trigger("cursorchanged",n.raw,n.datasetName))},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint(),this.eventBus.trigger("cursorremoved")},_onDatasetRendered:function(){this._updateHint(),this.eventBus.trigger("updated")},_onOpened:function(){this._updateHint(),this.input.expand(),this.eventBus.trigger("opened")},_onEmpty:function(){this.eventBus.trigger("empty")},_onRedrawn:function(){this.$node.css("top","0px"),this.$node.css("left","0px");var t=this.$input[0].getBoundingClientRect();this.autoWidth&&this.$node.css("width",t.width+"px");var e=this.$node[0].getBoundingClientRect(),n=t.bottom-e.top;this.$node.css("top",n+"px");var i=t.left-e.left;this.$node.css("left",i+"px"),this.eventBus.trigger("redrawn")},_onShown:function(){this.eventBus.trigger("shown"),this.autoselect&&this.dropdown.cursorTopSuggestion()},_onClosed:function(){this.input.clearHint(),this.input.removeActiveDescendant(),this.input.collapse(),this.eventBus.trigger("closed")},_onFocused:function(){if(this.isActivated=!0,this.openOnFocus){var t=this.input.getQuery();t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty(),this.dropdown.open()}},_onBlurred:function(){var t,e;t=this.dropdown.getDatumForCursor(),e=this.dropdown.getDatumForTopSuggestion();var n={selectionMethod:"blur"};this.debug||(this.autoselectOnBlur&&t?this._select(t,n):this.autoselectOnBlur&&e?this._select(e,n):(this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()))},_onEnterKeyed:function(t,e){var n,i;n=this.dropdown.getDatumForCursor(),i=this.dropdown.getDatumForTopSuggestion();var s={selectionMethod:"enterKey"};n?(this._select(n,s),e.preventDefault()):this.autoselect&&i&&(this._select(i,s),e.preventDefault())},_onTabKeyed:function(t,e){if(this.tabAutocomplete){var n;(n=this.dropdown.getDatumForCursor())?(this._select(n,{selectionMethod:"tabKey"}),e.preventDefault()):this._autocomplete(!0)}else this.dropdown.close()},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){"rtl"===this.dir&&this._autocomplete()},_onRightKeyed:function(){"ltr"===this.dir&&this._autocomplete()},_onQueryChanged:function(t,e){this.input.clearHintIfInvalid(),e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var t=this.input.getLanguageDirection();this.dir!==t&&(this.dir=t,this.$node.css("direction",t),this.dropdown.setLanguageDirection(t))},_updateHint:function(){var t,e,n,i,r;(t=this.dropdown.getDatumForTopSuggestion())&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(e=this.input.getInputValue(),n=a.normalizeQuery(e),i=s.escapeRegExChars(n),(r=new RegExp("^(?:"+i+")(.+$)","i").exec(t.value))?this.input.setHint(e+r[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(t){var e,n,i,s;e=this.input.getHint(),n=this.input.getQuery(),i=t||this.input.isCursorAtEnd(),e&&n!==e&&i&&((s=this.dropdown.getDatumForTopSuggestion())&&this.input.setInputValue(s.value),this.eventBus.trigger("autocompleted",s.raw,s.datasetName))},_select:function(t,e){void 0!==t.value&&this.input.setQuery(t.value),this.clearOnSelected?this.setVal(""):this.input.setInputValue(t.value,!0),this._setLanguageDirection(),!1===this.eventBus.trigger("selected",t.raw,t.datasetName,e).isDefaultPrevented()&&(this.dropdown.close(),s.defer(s.bind(this.dropdown.empty,this.dropdown)))},open:function(){if(!this.isActivated){var t=this.input.getInputValue();t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty()}this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(t){t=s.toStr(t),this.isActivated?this.input.setInputValue(t):(this.input.setQuery(t),this.input.setInputValue(t,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){this.input.destroy(),this.dropdown.destroy(),function(t,e){var n=t.find(s.className(e.prefix,e.input));s.each(n.data(i),(function(t,e){void 0===t?n.removeAttr(e):n.attr(e,t)})),n.detach().removeClass(s.className(e.prefix,e.input,!0)).insertAfter(t),n.removeData&&n.removeData(i);t.remove()}(this.$node,this.cssClasses),this.$node=null},getWrapper:function(){return this.dropdown.$container[0]}}),h.Dropdown=u,h.Input=a,h.sources=n(6353),t.exports=h},1348:t=>{"use strict";t.exports={element:null}},9715:t=>{"use strict";t.exports=function(t){var e=t.match(/Algolia for JavaScript \((\d+\.)(\d+\.)(\d+)\)/)||t.match(/Algolia for vanilla JavaScript (\d+\.)(\d+\.)(\d+)/);if(e)return[e[1],e[2],e[3]]}},6573:(t,e,n)=>{"use strict";var i,s=n(8937),r=n(1348);function o(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(t){if(void 0===t&&(t=navigator.userAgent),/(msie|trident)/i.test(t)){var e=t.match(/(msie |rv:)(\d+(.\d+)?)/i);if(e)return e[2]}return!1},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return null==t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,(function(t,i){t&&(n.isArray(t)?e[i]=[].concat(t):n.isObject(t)&&(e[i]=n.cloneDeep(t)))})),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,(function(i,s){n&&(n=e.call(null,i,s,t)&&n)})),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,(function(i,s){if(e.call(null,i,s,t))return n=!0,!1})),n):n},getUniqueId:(i=0,function(){return i++}),templatify:function(t){if(this.isFunction(t))return t;var e=r.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return n?t+e:"."+s(t+e,{isIdentifier:!0})},escapeHighlightedString:function(t,e,n){e=e||"";var i=document.createElement("div");i.appendChild(document.createTextNode(e)),n=n||"";var s=document.createElement("div");s.appendChild(document.createTextNode(n));var r=document.createElement("div");return r.appendChild(document.createTextNode(t)),r.innerHTML.replace(RegExp(o(i.innerHTML),"g"),e).replace(RegExp(o(s.innerHTML),"g"),n)}}},6903:(t,e,n)=>{"use strict";var i=n(6573),s=n(2281),r=n(9715);var o,a,u=(o=[],a=window.Promise.resolve(),function(t,e){return function(n,s){(function(t,e){return window.Promise.resolve().then((function(){return o.length&&(a=t.search(o),o=[]),a})).then((function(t){if(t)return t.results[e]}))})(t.as,o.push({indexName:t.indexName,query:n,params:e})-1).then((function(t){t&&s(t.hits,t)})).catch((function(t){i.error(t.message)}))}});t.exports=function(t,e){var n=r(t.as._ua);if(n&&n[0]>=3&&n[1]>20){var i="autocomplete.js "+s;-1===t.as._ua.indexOf(i)&&(t.as._ua+="; "+i)}return u(t,e)}},6353:(t,e,n)=>{"use strict";t.exports={hits:n(6903),popularIn:n(6839)}},6839:(t,e,n)=>{"use strict";var i=n(6573),s=n(2281),r=n(9715);t.exports=function(t,e,n,o){var a=r(t.as._ua);if(a&&a[0]>=3&&a[1]>20&&((e=e||{}).additionalUA="autocomplete.js "+s),!n.source)return i.error("Missing 'source' key");var u=i.isFunction(n.source)?n.source:function(t){return t[n.source]};if(!n.index)return i.error("Missing 'index' key");var c=n.index;return o=o||{},function(a,l){t.search(a,e,(function(t,a){if(t)i.error(t.message);else{if(a.hits.length>0){var h=a.hits[0],p=i.mixin({hitsPerPage:0},n);delete p.source,delete p.index;var f=r(c.as._ua);return f&&f[0]>=3&&f[1]>20&&(e.additionalUA="autocomplete.js "+s),void c.search(u(h),p,(function(t,e){if(t)i.error(t.message);else{var n=[];if(o.includeAll){var s=o.allTitle||"All departments";n.push(i.mixin({facet:{value:s,count:e.nbHits}},i.cloneDeep(h)))}i.each(e.facets,(function(t,e){i.each(t,(function(t,s){n.push(i.mixin({facet:{facet:e,value:s,count:t}},i.cloneDeep(h)))}))}));for(var r=1;r{"use strict";var i=n(9539);n(1348).element=i;var s=n(6573);s.isArray=i.isArray,s.isFunction=i.isFunction,s.isObject=i.isPlainObject,s.bind=i.proxy,s.each=function(t,e){i.each(t,(function(t,n){return e(n,t)}))},s.map=i.map,s.mixin=i.extend,s.Event=i.Event;var r="aaAutocomplete",o=n(7360),a=n(2324);function u(t,e,n,u){n=s.isArray(n)?n:[].slice.call(arguments,2);var c=i(t).each((function(t,s){var c=i(s),l=new a({el:c}),h=u||new o({input:c,eventBus:l,dropdownMenuContainer:e.dropdownMenuContainer,hint:void 0===e.hint||!!e.hint,minLength:e.minLength,autoselect:e.autoselect,autoselectOnBlur:e.autoselectOnBlur,tabAutocomplete:e.tabAutocomplete,openOnFocus:e.openOnFocus,templates:e.templates,debug:e.debug,clearOnSelected:e.clearOnSelected,cssClasses:e.cssClasses,datasets:n,keyboardShortcuts:e.keyboardShortcuts,appendTo:e.appendTo,autoWidth:e.autoWidth,ariaLabel:e.ariaLabel||s.getAttribute("aria-label")});c.data(r,h)}));return c.autocomplete={},s.each(["open","close","getVal","setVal","destroy","getWrapper"],(function(t){c.autocomplete[t]=function(){var e,n=arguments;return c.each((function(s,o){var a=i(o).data(r);e=a[t].apply(a,n)})),e}})),c}u.sources=o.sources,u.escapeHighlightedString=s.escapeHighlightedString;var c="autocomplete"in window,l=window.autocomplete;u.noConflict=function(){return c?window.autocomplete=l:delete window.autocomplete,u},t.exports=u},2281:t=>{t.exports="0.38.1"},9539:t=>{var e;e=window,t.exports=function(t){var e,n,i=function(){var e,n,i,s,r,o,a=[],u=a.concat,c=a.filter,l=a.slice,h=t.document,p={},f={},d={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},g=/^\s*<(\w+|!)[^>]*>/,m=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,y=/^(?:body|html)$/i,w=/([A-Z])/g,b=["val","css","html","text","data","width","height","offset"],C=["after","prepend","before","append"],x=h.createElement("table"),_=h.createElement("tr"),S={tr:h.createElement("tbody"),tbody:x,thead:x,tfoot:x,td:_,th:_,"*":h.createElement("div")},E=/complete|loaded|interactive/,A=/^[\w-]*$/,$={},T=$.toString,O={},D=h.createElement("div"),N={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},k=Array.isArray||function(t){return t instanceof Array};function I(t){return null==t?String(t):$[T.call(t)]||"object"}function P(t){return"function"==I(t)}function L(t){return null!=t&&t==t.window}function M(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function F(t){return"object"==I(t)}function R(t){return F(t)&&!L(t)&&Object.getPrototypeOf(t)==Object.prototype}function q(t){var e=!!t&&"length"in t&&t.length,n=i.type(t);return"function"!=n&&!L(t)&&("array"==n||0===e||"number"==typeof e&&e>0&&e-1 in t)}function V(t){return c.call(t,(function(t){return null!=t}))}function H(t){return t.length>0?i.fn.concat.apply([],t):t}function B(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function K(t){return t in f?f[t]:f[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function j(t,e){return"number"!=typeof e||d[B(t)]?e:e+"px"}function z(t){var e,n;return p[t]||(e=h.createElement(t),h.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),p[t]=n),p[t]}function U(t){return"children"in t?l.call(t.children):i.map(t.childNodes,(function(t){if(1==t.nodeType)return t}))}function Q(t,e){var n,i=t?t.length:0;for(n=0;n")),n===e&&(n=g.test(t)&&RegExp.$1),n in S||(n="*"),(a=S[n]).innerHTML=""+t,r=i.each(l.call(a.childNodes),(function(){a.removeChild(this)}))),R(s)&&(o=i(r),i.each(s,(function(t,e){b.indexOf(t)>-1?o[t](e):o.attr(t,e)}))),r},O.Z=function(t,e){return new Q(t,e)},O.isZ=function(t){return t instanceof O.Z},O.init=function(t,n){var s;if(!t)return O.Z();if("string"==typeof t)if("<"==(t=t.trim())[0]&&g.test(t))s=O.fragment(t,RegExp.$1,n),t=null;else{if(n!==e)return i(n).find(t);s=O.qsa(h,t)}else{if(P(t))return i(h).ready(t);if(O.isZ(t))return t;if(k(t))s=V(t);else if(F(t))s=[t],t=null;else if(g.test(t))s=O.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==e)return i(n).find(t);s=O.qsa(h,t)}}return O.Z(s,t)},(i=function(t,e){return O.init(t,e)}).extend=function(t){var e,n=l.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach((function(n){W(t,n,e)})),t},O.qsa=function(t,e){var n,i="#"==e[0],s=!i&&"."==e[0],r=i||s?e.slice(1):e,o=A.test(r);return t.getElementById&&o&&i?(n=t.getElementById(r))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:l.call(o&&!i&&t.getElementsByClassName?s?t.getElementsByClassName(r):t.getElementsByTagName(e):t.querySelectorAll(e))},i.contains=h.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},i.type=I,i.isFunction=P,i.isWindow=L,i.isArray=k,i.isPlainObject=R,i.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},i.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},i.inArray=function(t,e,n){return a.indexOf.call(e,t,n)},i.camelCase=r,i.trim=function(t){return null==t?"":String.prototype.trim.call(t)},i.uuid=0,i.support={},i.expr={},i.noop=function(){},i.map=function(t,e){var n,i,s,r=[];if(q(t))for(i=0;i=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each((function(){null!=this.parentNode&&this.parentNode.removeChild(this)}))},each:function(t){return a.every.call(this,(function(e,n){return!1!==t.call(e,n,e)})),this},filter:function(t){return P(t)?this.not(this.not(t)):i(c.call(this,(function(e){return O.matches(e,t)})))},add:function(t,e){return i(o(this.concat(i(t,e))))},is:function(t){return this.length>0&&O.matches(this[0],t)},not:function(t){var n=[];if(P(t)&&t.call!==e)this.each((function(e){t.call(this,e)||n.push(this)}));else{var s="string"==typeof t?this.filter(t):q(t)&&P(t.item)?l.call(t):i(t);this.forEach((function(t){s.indexOf(t)<0&&n.push(t)}))}return i(n)},has:function(t){return this.filter((function(){return F(t)?i.contains(this,t):i(this).find(t).size()}))},eq:function(t){return-1===t?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!F(t)?t:i(t)},last:function(){var t=this[this.length-1];return t&&!F(t)?t:i(t)},find:function(t){var e=this;return t?"object"==typeof t?i(t).filter((function(){var t=this;return a.some.call(e,(function(e){return i.contains(e,t)}))})):1==this.length?i(O.qsa(this[0],t)):this.map((function(){return O.qsa(this,t)})):i()},closest:function(t,e){var n=[],s="object"==typeof t&&i(t);return this.each((function(i,r){for(;r&&!(s?s.indexOf(r)>=0:O.matches(r,t));)r=r!==e&&!M(r)&&r.parentNode;r&&n.indexOf(r)<0&&n.push(r)})),i(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=i.map(n,(function(t){if((t=t.parentNode)&&!M(t)&&e.indexOf(t)<0)return e.push(t),t}));return Z(e,t)},parent:function(t){return Z(o(this.pluck("parentNode")),t)},children:function(t){return Z(this.map((function(){return U(this)})),t)},contents:function(){return this.map((function(){return this.contentDocument||l.call(this.childNodes)}))},siblings:function(t){return Z(this.map((function(t,e){return c.call(U(e.parentNode),(function(t){return t!==e}))})),t)},empty:function(){return this.each((function(){this.innerHTML=""}))},pluck:function(t){return i.map(this,(function(e){return e[t]}))},show:function(){return this.each((function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=z(this.nodeName))}))},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var e=P(t);if(this[0]&&!e)var n=i(t).get(0),s=n.parentNode||this.length>1;return this.each((function(r){i(this).wrapAll(e?t.call(this,r):s?n.cloneNode(!0):n)}))},wrapAll:function(t){if(this[0]){var e;for(i(this[0]).before(t=i(t));(e=t.children()).length;)t=e.first();i(t).append(this)}return this},wrapInner:function(t){var e=P(t);return this.each((function(n){var s=i(this),r=s.contents(),o=e?t.call(this,n):t;r.length?r.wrapAll(o):s.append(o)}))},unwrap:function(){return this.parent().each((function(){i(this).replaceWith(i(this).children())})),this},clone:function(){return this.map((function(){return this.cloneNode(!0)}))},hide:function(){return this.css("display","none")},toggle:function(t){return this.each((function(){var n=i(this);(t===e?"none"==n.css("display"):t)?n.show():n.hide()}))},prev:function(t){return i(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return i(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each((function(e){var n=this.innerHTML;i(this).empty().append(X(this,t,e,n))})):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each((function(e){var n=X(this,t,e,this.textContent);this.textContent=null==n?"":""+n})):0 in this?this.pluck("textContent").join(""):null},attr:function(t,i){var s;return"string"!=typeof t||1 in arguments?this.each((function(e){if(1===this.nodeType)if(F(t))for(n in t)G(this,n,t[n]);else G(this,t,X(this,i,e,this.getAttribute(t)))})):0 in this&&1==this[0].nodeType&&null!=(s=this[0].getAttribute(t))?s:e},removeAttr:function(t){return this.each((function(){1===this.nodeType&&t.split(" ").forEach((function(t){G(this,t)}),this)}))},prop:function(t,e){return t=N[t]||t,1 in arguments?this.each((function(n){this[t]=X(this,e,n,this[t])})):this[0]&&this[0][t]},removeProp:function(t){return t=N[t]||t,this.each((function(){delete this[t]}))},data:function(t,n){var i="data-"+t.replace(w,"-$1").toLowerCase(),s=1 in arguments?this.attr(i,n):this.attr(i);return null!==s?Y(s):e},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each((function(e){this.value=X(this,t,e,this.value)}))):this[0]&&(this[0].multiple?i(this[0]).find("option").filter((function(){return this.selected})).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each((function(t){var n=i(this),s=X(this,e,t,n.offset()),r=n.offsetParent().offset(),o={top:s.top-r.top,left:s.left-r.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)}));if(!this.length)return null;if(h.documentElement!==this[0]&&!i.contains(h.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+t.pageXOffset,top:n.top+t.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(t,e){if(arguments.length<2){var s=this[0];if("string"==typeof t){if(!s)return;return s.style[r(t)]||getComputedStyle(s,"").getPropertyValue(t)}if(k(t)){if(!s)return;var o={},a=getComputedStyle(s,"");return i.each(t,(function(t,e){o[e]=s.style[r(e)]||a.getPropertyValue(e)})),o}}var u="";if("string"==I(t))e||0===e?u=B(t)+":"+j(t,e):this.each((function(){this.style.removeProperty(B(t))}));else for(n in t)t[n]||0===t[n]?u+=B(n)+":"+j(n,t[n])+";":this.each((function(){this.style.removeProperty(B(n))}));return this.each((function(){this.style.cssText+=";"+u}))},index:function(t){return t?this.indexOf(i(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&a.some.call(this,(function(t){return this.test(J(t))}),K(t))},addClass:function(t){return t?this.each((function(e){if("className"in this){s=[];var n=J(this);X(this,t,e,n).split(/\s+/g).forEach((function(t){i(this).hasClass(t)||s.push(t)}),this),s.length&&J(this,n+(n?" ":"")+s.join(" "))}})):this},removeClass:function(t){return this.each((function(n){if("className"in this){if(t===e)return J(this,"");s=J(this),X(this,t,n,s).split(/\s+/g).forEach((function(t){s=s.replace(K(t)," ")})),J(this,s.trim())}}))},toggleClass:function(t,n){return t?this.each((function(s){var r=i(this);X(this,t,s,J(this)).split(/\s+/g).forEach((function(t){(n===e?!r.hasClass(t):n)?r.addClass(t):r.removeClass(t)}))})):this},scrollTop:function(t){if(this.length){var n="scrollTop"in this[0];return t===e?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var n="scrollLeft"in this[0];return t===e?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),s=y.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(i(t).css("margin-top"))||0,n.left-=parseFloat(i(t).css("margin-left"))||0,s.top+=parseFloat(i(e[0]).css("border-top-width"))||0,s.left+=parseFloat(i(e[0]).css("border-left-width"))||0,{top:n.top-s.top,left:n.left-s.left}}},offsetParent:function(){return this.map((function(){for(var t=this.offsetParent||h.body;t&&!y.test(t.nodeName)&&"static"==i(t).css("position");)t=t.offsetParent;return t}))}},i.fn.detach=i.fn.remove,["width","height"].forEach((function(t){var n=t.replace(/./,(function(t){return t[0].toUpperCase()}));i.fn[t]=function(s){var r,o=this[0];return s===e?L(o)?o["inner"+n]:M(o)?o.documentElement["scroll"+n]:(r=this.offset())&&r[t]:this.each((function(e){(o=i(this)).css(t,X(this,s,e,o[t]()))}))}})),C.forEach((function(n,s){var r=s%2;i.fn[n]=function(){var n,o,a=i.map(arguments,(function(t){var s=[];return"array"==(n=I(t))?(t.forEach((function(t){return t.nodeType!==e?s.push(t):i.zepto.isZ(t)?s=s.concat(t.get()):void(s=s.concat(O.fragment(t)))})),s):"object"==n||null==t?t:O.fragment(t)})),u=this.length>1;return a.length<1?this:this.each((function(e,n){o=r?n:n.parentNode,n=0==s?n.nextSibling:1==s?n.firstChild:2==s?n:null;var c=i.contains(h.documentElement,o);a.forEach((function(e){if(u)e=e.cloneNode(!0);else if(!o)return i(e).remove();o.insertBefore(e,n),c&&tt(e,(function(e){if(!(null==e.nodeName||"SCRIPT"!==e.nodeName.toUpperCase()||e.type&&"text/javascript"!==e.type||e.src)){var n=e.ownerDocument?e.ownerDocument.defaultView:t;n.eval.call(n,e.innerHTML)}}))}))}))},i.fn[r?n+"To":"insert"+(s?"Before":"After")]=function(t){return i(t)[n](this),this}})),O.Z.prototype=Q.prototype=i.fn,O.uniq=o,O.deserializeValue=Y,i.zepto=O,i}();return function(e){var n,i=1,s=Array.prototype.slice,r=e.isFunction,o=function(t){return"string"==typeof t},a={},u={},c="onfocusin"in t,l={focus:"focusin",blur:"focusout"},h={mouseenter:"mouseover",mouseleave:"mouseout"};function p(t){return t._zid||(t._zid=i++)}function f(t,e,n,i){if((e=d(e)).ns)var s=g(e.ns);return(a[p(t)]||[]).filter((function(t){return t&&(!e.e||t.e==e.e)&&(!e.ns||s.test(t.ns))&&(!n||p(t.fn)===p(n))&&(!i||t.sel==i)}))}function d(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function g(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function m(t,e){return t.del&&!c&&t.e in l||!!e}function v(t){return h[t]||c&&l[t]||t}function y(t,i,s,r,o,u,c){var l=p(t),f=a[l]||(a[l]=[]);i.split(/\s/).forEach((function(i){if("ready"==i)return e(document).ready(s);var a=d(i);a.fn=s,a.sel=o,a.e in h&&(s=function(t){var n=t.relatedTarget;if(!n||n!==this&&!e.contains(this,n))return a.fn.apply(this,arguments)}),a.del=u;var l=u||s;a.proxy=function(e){if(!(e=S(e)).isImmediatePropagationStopped()){try{var i=Object.getOwnPropertyDescriptor(e,"data");i&&!i.writable||(e.data=r)}catch(e){}var s=l.apply(t,e._args==n?[e]:[e].concat(e._args));return!1===s&&(e.preventDefault(),e.stopPropagation()),s}},a.i=f.length,f.push(a),"addEventListener"in t&&t.addEventListener(v(a.e),a.proxy,m(a,c))}))}function w(t,e,n,i,s){var r=p(t);(e||"").split(/\s/).forEach((function(e){f(t,e,n,i).forEach((function(e){delete a[r][e.i],"removeEventListener"in t&&t.removeEventListener(v(e.e),e.proxy,m(e,s))}))}))}u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",e.event={add:y,remove:w},e.proxy=function(t,n){var i=2 in arguments&&s.call(arguments,2);if(r(t)){var a=function(){return t.apply(n,i?i.concat(s.call(arguments)):arguments)};return a._zid=p(t),a}if(o(n))return i?(i.unshift(t[n],t),e.proxy.apply(null,i)):e.proxy(t[n],t);throw new TypeError("expected function")},e.fn.bind=function(t,e,n){return this.on(t,e,n)},e.fn.unbind=function(t,e){return this.off(t,e)},e.fn.one=function(t,e,n,i){return this.on(t,e,n,i,1)};var b=function(){return!0},C=function(){return!1},x=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,_={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};function S(t,i){if(i||!t.isDefaultPrevented){i||(i=t),e.each(_,(function(e,n){var s=i[e];t[e]=function(){return this[n]=b,s&&s.apply(i,arguments)},t[n]=C}));try{t.timeStamp||(t.timeStamp=Date.now())}catch(s){}(i.defaultPrevented!==n?i.defaultPrevented:"returnValue"in i?!1===i.returnValue:i.getPreventDefault&&i.getPreventDefault())&&(t.isDefaultPrevented=b)}return t}function E(t){var e,i={originalEvent:t};for(e in t)x.test(e)||t[e]===n||(i[e]=t[e]);return S(i,t)}e.fn.delegate=function(t,e,n){return this.on(e,t,n)},e.fn.undelegate=function(t,e,n){return this.off(e,t,n)},e.fn.live=function(t,n){return e(document.body).delegate(this.selector,t,n),this},e.fn.die=function(t,n){return e(document.body).undelegate(this.selector,t,n),this},e.fn.on=function(t,i,a,u,c){var l,h,p=this;return t&&!o(t)?(e.each(t,(function(t,e){p.on(t,i,a,e,c)})),p):(o(i)||r(u)||!1===u||(u=a,a=i,i=n),u!==n&&!1!==a||(u=a,a=n),!1===u&&(u=C),p.each((function(n,r){c&&(l=function(t){return w(r,t.type,u),u.apply(this,arguments)}),i&&(h=function(t){var n,o=e(t.target).closest(i,r).get(0);if(o&&o!==r)return n=e.extend(E(t),{currentTarget:o,liveFired:r}),(l||u).apply(o,[n].concat(s.call(arguments,1)))}),y(r,t,u,a,i,h||l)})))},e.fn.off=function(t,i,s){var a=this;return t&&!o(t)?(e.each(t,(function(t,e){a.off(t,i,e)})),a):(o(i)||r(s)||!1===s||(s=i,i=n),!1===s&&(s=C),a.each((function(){w(this,t,s,i)})))},e.fn.trigger=function(t,n){return(t=o(t)||e.isPlainObject(t)?e.Event(t):S(t))._args=n,this.each((function(){t.type in l&&"function"==typeof this[t.type]?this[t.type]():"dispatchEvent"in this?this.dispatchEvent(t):e(this).triggerHandler(t,n)}))},e.fn.triggerHandler=function(t,n){var i,s;return this.each((function(r,a){(i=E(o(t)?e.Event(t):t))._args=n,i.target=a,e.each(f(a,t.type||t),(function(t,e){if(s=e.proxy(i),i.isImmediatePropagationStopped())return!1}))})),s},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach((function(t){e.fn[t]=function(e){return 0 in arguments?this.bind(t,e):this.trigger(t)}})),e.Event=function(t,e){o(t)||(t=(e=t).type);var n=document.createEvent(u[t]||"Events"),i=!0;if(e)for(var s in e)"bubbles"==s?i=!!e[s]:n[s]=e[s];return n.initEvent(t,i,!0),S(n)}}(i),n=[],i.fn.remove=function(){return this.each((function(){this.parentNode&&("IMG"===this.tagName&&(n.push(this),this.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",e&&clearTimeout(e),e=setTimeout((function(){n=[]}),6e4)),this.parentNode.removeChild(this))}))},function(t){var e={},n=t.fn.data,i=t.camelCase,s=t.expando="Zepto"+ +new Date,r=[];function o(r,o){var u=r[s],c=u&&e[u];if(void 0===o)return c||a(r);if(c){if(o in c)return c[o];var l=i(o);if(l in c)return c[l]}return n.call(t(r),o)}function a(n,r,o){var a=n[s]||(n[s]=++t.uuid),c=e[a]||(e[a]=u(n));return void 0!==r&&(c[i(r)]=o),c}function u(e){var n={};return t.each(e.attributes||r,(function(e,s){0==s.name.indexOf("data-")&&(n[i(s.name.replace("data-",""))]=t.zepto.deserializeValue(s.value))})),n}t.fn.data=function(e,n){return void 0===n?t.isPlainObject(e)?this.each((function(n,i){t.each(e,(function(t,e){a(i,t,e)}))})):0 in this?o(this[0],e):void 0:this.each((function(){a(this,e,n)}))},t.data=function(e,n,i){return t(e).data(n,i)},t.hasData=function(n){var i=n[s],r=i&&e[i];return!!r&&!t.isEmptyObject(r)},t.fn.removeData=function(n){return"string"==typeof n&&(n=n.split(/\s+/)),this.each((function(){var r=this[s],o=r&&e[r];o&&t.each(n||o,(function(t){delete o[n?i(this):t]}))}))},["remove","empty"].forEach((function(e){var n=t.fn[e];t.fn[e]=function(){var t=this.find("*");return"remove"===e&&(t=t.add(this)),t.removeData(),n.call(this)}}))}(i),i}(e)},8937:t=>{"use strict";var e={}.hasOwnProperty,n=/[ -,\.\/:-@\[-\^`\{-~]/,i=/[ -,\.\/:-@\[\]\^`\{-~]/,s=/(^|\\+)?(\\[A-F0-9]{1,6})\x20(?![a-fA-F0-9\x20])/g,r=function t(r,o){"single"!=(o=function(t,n){if(!t)return n;var i={};for(var s in n)i[s]=e.call(t,s)?t[s]:n[s];return i}(o,t.options)).quotes&&"double"!=o.quotes&&(o.quotes="single");for(var a="double"==o.quotes?'"':"'",u=o.isIdentifier,c=r.charAt(0),l="",h=0,p=r.length;h126){if(d>=55296&&d<=56319&&h{"use strict";var i,s,r,o=[n(5741),n(1856),n(1015),n(6486),n(5723),n(6345)],a=-1,u=[],c=!1;function l(){i&&s&&(i=!1,s.length?u=s.concat(u):a=-1,u.length&&h())}function h(){if(!i){c=!1,i=!0;for(var t=u.length,e=setTimeout(l);t;){for(s=u,u=[];s&&++a1)for(var n=1;n{"use strict";e.test=function(){return!n.g.setImmediate&&void 0!==n.g.MessageChannel},e.install=function(t){var e=new n.g.MessageChannel;return e.port1.onmessage=t,function(){e.port2.postMessage(0)}}},1015:(t,e,n)=>{"use strict";var i=n.g.MutationObserver||n.g.WebKitMutationObserver;e.test=function(){return i},e.install=function(t){var e=0,s=new i(t),r=n.g.document.createTextNode("");return s.observe(r,{characterData:!0}),function(){r.data=e=++e%2}}},1856:(t,e,n)=>{"use strict";e.test=function(){return"function"==typeof n.g.queueMicrotask},e.install=function(t){return function(){n.g.queueMicrotask(t)}}},5723:(t,e,n)=>{"use strict";e.test=function(){return"document"in n.g&&"onreadystatechange"in n.g.document.createElement("script")},e.install=function(t){return function(){var e=n.g.document.createElement("script");return e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},n.g.document.documentElement.appendChild(e),t}}},6345:(t,e)=>{"use strict";e.test=function(){return!0},e.install=function(t){return function(){setTimeout(t,0)}}}}]); \ No newline at end of file diff --git a/assets/js/489.d07863ea.js b/assets/js/489.d07863ea.js new file mode 100644 index 000000000..bc7cca159 --- /dev/null +++ b/assets/js/489.d07863ea.js @@ -0,0 +1,2 @@ +/*! For license information please see 489.d07863ea.js.LICENSE.txt */ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[489],{2870:(t,e,n)=>{"use strict";t.exports=n(810)},2542:(t,e,n)=>{"use strict";var i=n(6573),s={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:"0"},defaultClasses:{root:"algolia-autocomplete",prefix:"aa",noPrefix:!1,dropdownMenu:"dropdown-menu",input:"input",hint:"hint",suggestions:"suggestions",suggestion:"suggestion",cursor:"cursor",dataset:"dataset",empty:"empty"},appendTo:{wrapper:{position:"absolute",zIndex:"100",display:"none"},input:{},inputWithNoHint:{},dropdown:{display:"block"}}};i.isMsie()&&i.mixin(s.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),i.isMsie()&&i.isMsie()<=7&&i.mixin(s.input,{marginTop:"-1px"}),t.exports=s},897:(t,e,n)=>{"use strict";var i="aaDataset",s="aaValue",r="aaDatum",o=n(6573),a=n(1348),u=n(9272),c=n(2542),l=n(4436);function h(t){var e;(t=t||{}).templates=t.templates||{},t.source||o.error("missing source"),t.name&&(e=t.name,!/^[_a-zA-Z0-9-]+$/.test(e))&&o.error("invalid dataset name: "+t.name),this.query=null,this._isEmpty=!0,this.highlight=!!t.highlight,this.name=void 0===t.name||null===t.name?o.getUniqueId():t.name,this.source=t.source,this.displayFn=function(t){return t=t||"value",o.isFunction(t)?t:e;function e(e){return e[t]}}(t.display||t.displayKey),this.debounce=t.debounce,this.cache=!1!==t.cache,this.templates=function(t,e){return{empty:t.empty&&o.templatify(t.empty),header:t.header&&o.templatify(t.header),footer:t.footer&&o.templatify(t.footer),suggestion:t.suggestion||n};function n(t){return"

"+e(t)+"

"}}(t.templates,this.displayFn),this.css=o.mixin({},c,t.appendTo?c.appendTo:{}),this.cssClasses=t.cssClasses=o.mixin({},c.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix||o.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix);var n=o.className(this.cssClasses.prefix,this.cssClasses.dataset);this.$el=t.$menu&&t.$menu.find(n+"-"+this.name).length>0?a.element(t.$menu.find(n+"-"+this.name)[0]):a.element(u.dataset.replace("%CLASS%",this.name).replace("%PREFIX%",this.cssClasses.prefix).replace("%DATASET%",this.cssClasses.dataset)),this.$menu=t.$menu,this.clearCachedSuggestions()}h.extractDatasetName=function(t){return a.element(t).data(i)},h.extractValue=function(t){return a.element(t).data(s)},h.extractDatum=function(t){var e=a.element(t).data(r);return"string"==typeof e&&(e=JSON.parse(e)),e},o.mixin(h.prototype,l,{_render:function(t,e){if(this.$el){var n,c=this,l=[].slice.call(arguments,2);if(this.$el.empty(),n=e&&e.length,this._isEmpty=!n,!n&&this.templates.empty)this.$el.html(function(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!0}].concat(e),c.templates.empty.apply(this,e)}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(n)this.$el.html(function(){var t,n,l=[].slice.call(arguments,0),h=this,p=u.suggestions.replace("%PREFIX%",this.cssClasses.prefix).replace("%SUGGESTIONS%",this.cssClasses.suggestions);return t=a.element(p).css(this.css.suggestions),n=o.map(e,f),t.append.apply(t,n),t;function f(t){var e,n=u.suggestion.replace("%PREFIX%",h.cssClasses.prefix).replace("%SUGGESTION%",h.cssClasses.suggestion);return(e=a.element(n).attr({role:"option",id:["option",Math.floor(1e8*Math.random())].join("-")}).append(c.templates.suggestion.apply(this,[t].concat(l)))).data(i,c.name),e.data(s,c.displayFn(t)||void 0),e.data(r,JSON.stringify(t)),e.children().each((function(){a.element(this).css(h.css.suggestionChild)})),e}}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(e&&!Array.isArray(e))throw new TypeError("suggestions must be an array");this.$menu&&this.$menu.addClass(this.cssClasses.prefix+(n?"with":"without")+"-"+this.name).removeClass(this.cssClasses.prefix+(n?"without":"with")+"-"+this.name),this.trigger("rendered",t)}function h(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!n}].concat(e),c.templates.header.apply(this,e)}function p(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!n}].concat(e),c.templates.footer.apply(this,e)}},getRoot:function(){return this.$el},update:function(t){function e(e){if(!this.canceled&&t===this.query){var n=[].slice.call(arguments,1);this.cacheSuggestions(t,e,n),this._render.apply(this,[t,e].concat(n))}}if(this.query=t,this.canceled=!1,this.shouldFetchFromCache(t))e.apply(this,[this.cachedSuggestions].concat(this.cachedRenderExtraArgs));else{var n=this,i=function(){n.canceled||n.source(t,e.bind(n))};if(this.debounce){clearTimeout(this.debounceTimeout),this.debounceTimeout=setTimeout((function(){n.debounceTimeout=null,i()}),this.debounce)}else i()}},cacheSuggestions:function(t,e,n){this.cachedQuery=t,this.cachedSuggestions=e,this.cachedRenderExtraArgs=n},shouldFetchFromCache:function(t){return this.cache&&this.cachedQuery===t&&this.cachedSuggestions&&this.cachedSuggestions.length},clearCachedSuggestions:function(){delete this.cachedQuery,delete this.cachedSuggestions,delete this.cachedRenderExtraArgs},cancel:function(){this.canceled=!0},clear:function(){this.$el&&(this.cancel(),this.$el.empty(),this.trigger("rendered",""))},isEmpty:function(){return this._isEmpty},destroy:function(){this.clearCachedSuggestions(),this.$el=null}}),t.exports=h},1540:(t,e,n)=>{"use strict";var i=n(6573),s=n(1348),r=n(4436),o=n(897),a=n(2542);function u(t){var e,n,r,o=this;(t=t||{}).menu||i.error("menu is required"),i.isArray(t.datasets)||i.isObject(t.datasets)||i.error("1 or more datasets required"),t.datasets||i.error("datasets is required"),this.isOpen=!1,this.isEmpty=!0,this.minLength=t.minLength||0,this.templates={},this.appendTo=t.appendTo||!1,this.css=i.mixin({},a,t.appendTo?a.appendTo:{}),this.cssClasses=t.cssClasses=i.mixin({},a.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix||i.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),e=i.bind(this._onSuggestionClick,this),n=i.bind(this._onSuggestionMouseEnter,this),r=i.bind(this._onSuggestionMouseLeave,this);var c=i.className(this.cssClasses.prefix,this.cssClasses.suggestion);this.$menu=s.element(t.menu).on("mouseenter.aa",c,n).on("mouseleave.aa",c,r).on("click.aa",c,e),this.$container=t.appendTo?t.wrapper:this.$menu,t.templates&&t.templates.header&&(this.templates.header=i.templatify(t.templates.header),this.$menu.prepend(this.templates.header())),t.templates&&t.templates.empty&&(this.templates.empty=i.templatify(t.templates.empty),this.$empty=s.element('
'),this.$menu.append(this.$empty),this.$empty.hide()),this.datasets=i.map(t.datasets,(function(e){return function(t,e,n){return new u.Dataset(i.mixin({$menu:t,cssClasses:n},e))}(o.$menu,e,t.cssClasses)})),i.each(this.datasets,(function(t){var e=t.getRoot();e&&0===e.parent().length&&o.$menu.append(e),t.onSync("rendered",o._onRendered,o)})),t.templates&&t.templates.footer&&(this.templates.footer=i.templatify(t.templates.footer),this.$menu.append(this.templates.footer()));var l=this;s.element(window).resize((function(){l._redraw()}))}i.mixin(u.prototype,r,{_onSuggestionClick:function(t){this.trigger("suggestionClicked",s.element(t.currentTarget))},_onSuggestionMouseEnter:function(t){var e=s.element(t.currentTarget);if(!e.hasClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0))){this._removeCursor();var n=this;setTimeout((function(){n._setCursor(e,!1)}),0)}},_onSuggestionMouseLeave:function(t){if(t.relatedTarget&&s.element(t.relatedTarget).closest("."+i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).length>0)return;this._removeCursor(),this.trigger("cursorRemoved")},_onRendered:function(t,e){if(this.isEmpty=i.every(this.datasets,(function(t){return t.isEmpty()})),this.isEmpty)if(e.length>=this.minLength&&this.trigger("empty"),this.$empty)if(e.length=this.minLength?this._show():this._hide());this.trigger("datasetRendered")},_hide:function(){this.$container.hide()},_show:function(){this.$container.css("display","block"),this._redraw(),this.trigger("shown")},_redraw:function(){this.isOpen&&this.appendTo&&this.trigger("redrawn")},_getSuggestions:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.suggestion))},_getCursor:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.cursor)).first()},_setCursor:function(t,e){t.first().addClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).attr("aria-selected","true"),this.trigger("cursorMoved",e)},_removeCursor:function(){this._getCursor().removeClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).removeAttr("aria-selected")},_moveCursor:function(t){var e,n,i,s;this.isOpen&&(n=this._getCursor(),e=this._getSuggestions(),this._removeCursor(),-1!==(i=((i=e.index(n)+t)+1)%(e.length+1)-1)?(i<-1&&(i=e.length-1),this._setCursor(s=e.eq(i),!0),this._ensureVisible(s)):this.trigger("cursorRemoved"))},_ensureVisible:function(t){var e,n,i,s;n=(e=t.position().top)+t.height()+parseInt(t.css("margin-top"),10)+parseInt(t.css("margin-bottom"),10),i=this.$menu.scrollTop(),s=this.$menu.height()+parseInt(this.$menu.css("padding-top"),10)+parseInt(this.$menu.css("padding-bottom"),10),e<0?this.$menu.scrollTop(i+e):s{"use strict";var i=n(6573),s=n(1348);function r(t){t&&t.el||i.error("EventBus initialized without el"),this.$el=s.element(t.el)}i.mixin(r.prototype,{trigger:function(t,e,n,s){var r=i.Event("autocomplete:"+t);return this.$el.trigger(r,[e,n,s]),r}}),t.exports=r},4436:(t,e,n)=>{"use strict";var i=n(874),s=/\s+/;function r(t,e,n,i){var r;if(!n)return this;for(e=e.split(s),n=i?function(t,e){return t.bind?t.bind(e):function(){t.apply(e,[].slice.call(arguments,0))}}(n,i):n,this._callbacks=this._callbacks||{};r=e.shift();)this._callbacks[r]=this._callbacks[r]||{sync:[],async:[]},this._callbacks[r][t].push(n);return this}function o(t,e,n){return function(){for(var i,s=0,r=t.length;!i&&s{"use strict";t.exports={wrapper:'',dropdown:'',dataset:'
',suggestions:'',suggestion:'
'}},9629:(t,e,n)=>{"use strict";var i;i={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"};var s=n(6573),r=n(1348),o=n(4436);function a(t){var e,n,o,a,u,c=this;(t=t||{}).input||s.error("input is missing"),e=s.bind(this._onBlur,this),n=s.bind(this._onFocus,this),o=s.bind(this._onKeydown,this),a=s.bind(this._onInput,this),this.$hint=r.element(t.hint),this.$input=r.element(t.input).on("blur.aa",e).on("focus.aa",n).on("keydown.aa",o),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=s.noop),s.isMsie()?this.$input.on("keydown.aa keypress.aa cut.aa paste.aa",(function(t){i[t.which||t.keyCode]||s.defer(s.bind(c._onInput,c,t))})):this.$input.on("input.aa",a),this.query=this.$input.val(),this.$overflowHelper=(u=this.$input,r.element('').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:u.css("font-family"),fontSize:u.css("font-size"),fontStyle:u.css("font-style"),fontVariant:u.css("font-variant"),fontWeight:u.css("font-weight"),wordSpacing:u.css("word-spacing"),letterSpacing:u.css("letter-spacing"),textIndent:u.css("text-indent"),textRendering:u.css("text-rendering"),textTransform:u.css("text-transform")}).insertAfter(u))}function u(t){return t.altKey||t.ctrlKey||t.metaKey||t.shiftKey}a.normalizeQuery=function(t){return(t||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},s.mixin(a.prototype,o,{_onBlur:function(){this.resetInputValue(),this.$input.removeAttr("aria-activedescendant"),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(t){var e=i[t.which||t.keyCode];this._managePreventDefault(e,t),e&&this._shouldTrigger(e,t)&&this.trigger(e+"Keyed",t)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(t,e){var n,i,s;switch(t){case"tab":i=this.getHint(),s=this.getInputValue(),n=i&&i!==s&&!u(e);break;case"up":case"down":n=!u(e);break;default:n=!1}n&&e.preventDefault()},_shouldTrigger:function(t,e){var n;if("tab"===t)n=!u(e);else n=!0;return n},_checkInputValue:function(){var t,e,n,i,s;t=this.getInputValue(),i=t,s=this.query,n=!(!(e=a.normalizeQuery(i)===a.normalizeQuery(s))||!this.query)&&this.query.length!==t.length,this.query=t,e?n&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(t){this.query=t},getInputValue:function(){return this.$input.val()},setInputValue:function(t,e){void 0===t&&(t=this.query),this.$input.val(t),e?this.clearHint():this._checkInputValue()},expand:function(){this.$input.attr("aria-expanded","true")},collapse:function(){this.$input.attr("aria-expanded","false")},setActiveDescendant:function(t){this.$input.attr("aria-activedescendant",t)},removeActiveDescendant:function(){this.$input.removeAttr("aria-activedescendant")},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(t){this.$hint.val(t)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var t,e,n;n=(t=this.getInputValue())!==(e=this.getHint())&&0===e.indexOf(t),""!==t&&n&&!this.hasOverflow()||this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var t=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=t},isCursorAtEnd:function(){var t,e,n;return t=this.$input.val().length,e=this.$input[0].selectionStart,s.isNumber(e)?e===t:!document.selection||((n=document.selection.createRange()).moveStart("character",-t),t===n.text.length)},destroy:function(){this.$hint.off(".aa"),this.$input.off(".aa"),this.$hint=this.$input=this.$overflowHelper=null}}),t.exports=a},7360:(t,e,n)=>{"use strict";var i="aaAttrs",s=n(6573),r=n(1348),o=n(2324),a=n(9629),u=n(1540),c=n(9272),l=n(2542);function h(t){var e,n;if((t=t||{}).input||s.error("missing input"),this.isActivated=!1,this.debug=!!t.debug,this.autoselect=!!t.autoselect,this.autoselectOnBlur=!!t.autoselectOnBlur,this.openOnFocus=!!t.openOnFocus,this.minLength=s.isNumber(t.minLength)?t.minLength:1,this.autoWidth=void 0===t.autoWidth||!!t.autoWidth,this.clearOnSelected=!!t.clearOnSelected,this.tabAutocomplete=void 0===t.tabAutocomplete||!!t.tabAutocomplete,t.hint=!!t.hint,t.hint&&t.appendTo)throw new Error("[autocomplete.js] hint and appendTo options can't be used at the same time");this.css=t.css=s.mixin({},l,t.appendTo?l.appendTo:{}),this.cssClasses=t.cssClasses=s.mixin({},l.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix=s.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),this.listboxId=t.listboxId=[this.cssClasses.root,"listbox",s.getUniqueId()].join("-");var a=function(t){var e,n,o,a;e=r.element(t.input),n=r.element(c.wrapper.replace("%ROOT%",t.cssClasses.root)).css(t.css.wrapper),t.appendTo||"block"!==e.css("display")||"table"!==e.parent().css("display")||n.css("display","table-cell");var u=c.dropdown.replace("%PREFIX%",t.cssClasses.prefix).replace("%DROPDOWN_MENU%",t.cssClasses.dropdownMenu);o=r.element(u).css(t.css.dropdown).attr({role:"listbox",id:t.listboxId}),t.templates&&t.templates.dropdownMenu&&o.html(s.templatify(t.templates.dropdownMenu)());a=e.clone().css(t.css.hint).css(function(t){return{backgroundAttachment:t.css("background-attachment"),backgroundClip:t.css("background-clip"),backgroundColor:t.css("background-color"),backgroundImage:t.css("background-image"),backgroundOrigin:t.css("background-origin"),backgroundPosition:t.css("background-position"),backgroundRepeat:t.css("background-repeat"),backgroundSize:t.css("background-size")}}(e)),a.val("").addClass(s.className(t.cssClasses.prefix,t.cssClasses.hint,!0)).removeAttr("id name placeholder required").prop("readonly",!0).attr({"aria-hidden":"true",autocomplete:"off",spellcheck:"false",tabindex:-1}),a.removeData&&a.removeData();e.data(i,{"aria-autocomplete":e.attr("aria-autocomplete"),"aria-expanded":e.attr("aria-expanded"),"aria-owns":e.attr("aria-owns"),autocomplete:e.attr("autocomplete"),dir:e.attr("dir"),role:e.attr("role"),spellcheck:e.attr("spellcheck"),style:e.attr("style"),type:e.attr("type")}),e.addClass(s.className(t.cssClasses.prefix,t.cssClasses.input,!0)).attr({autocomplete:"off",spellcheck:!1,role:"combobox","aria-autocomplete":t.datasets&&t.datasets[0]&&t.datasets[0].displayKey?"both":"list","aria-expanded":"false","aria-label":t.ariaLabel,"aria-owns":t.listboxId}).css(t.hint?t.css.input:t.css.inputWithNoHint);try{e.attr("dir")||e.attr("dir","auto")}catch(l){}return n=t.appendTo?n.appendTo(r.element(t.appendTo).eq(0)).eq(0):e.wrap(n).parent(),n.prepend(t.hint?a:null).append(o),{wrapper:n,input:e,hint:a,menu:o}}(t);this.$node=a.wrapper;var u=this.$input=a.input;e=a.menu,n=a.hint,t.dropdownMenuContainer&&r.element(t.dropdownMenuContainer).css("position","relative").append(e.css("top","0")),u.on("blur.aa",(function(t){var n=document.activeElement;s.isMsie()&&(e[0]===n||e[0].contains(n))&&(t.preventDefault(),t.stopImmediatePropagation(),s.defer((function(){u.focus()})))})),e.on("mousedown.aa",(function(t){t.preventDefault()})),this.eventBus=t.eventBus||new o({el:u}),this.dropdown=new h.Dropdown({appendTo:t.appendTo,wrapper:this.$node,menu:e,datasets:t.datasets,templates:t.templates,cssClasses:t.cssClasses,minLength:this.minLength}).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onSync("shown",this._onShown,this).onSync("empty",this._onEmpty,this).onSync("redrawn",this._onRedrawn,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=new h.Input({input:u,hint:n}).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._bindKeyboardShortcuts(t),this._setLanguageDirection()}s.mixin(h.prototype,{_bindKeyboardShortcuts:function(t){if(t.keyboardShortcuts){var e=this.$input,n=[];s.each(t.keyboardShortcuts,(function(t){"string"==typeof t&&(t=t.toUpperCase().charCodeAt(0)),n.push(t)})),r.element(document).keydown((function(t){var i=t.target||t.srcElement,s=i.tagName;if(!i.isContentEditable&&"INPUT"!==s&&"SELECT"!==s&&"TEXTAREA"!==s){var r=t.which||t.keyCode;-1!==n.indexOf(r)&&(e.focus(),t.stopPropagation(),t.preventDefault())}}))}},_onSuggestionClicked:function(t,e){var n;(n=this.dropdown.getDatumForSuggestion(e))&&this._select(n,{selectionMethod:"click"})},_onCursorMoved:function(t,e){var n=this.dropdown.getDatumForCursor(),i=this.dropdown.getCurrentCursor().attr("id");this.input.setActiveDescendant(i),n&&(e&&this.input.setInputValue(n.value,!0),this.eventBus.trigger("cursorchanged",n.raw,n.datasetName))},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint(),this.eventBus.trigger("cursorremoved")},_onDatasetRendered:function(){this._updateHint(),this.eventBus.trigger("updated")},_onOpened:function(){this._updateHint(),this.input.expand(),this.eventBus.trigger("opened")},_onEmpty:function(){this.eventBus.trigger("empty")},_onRedrawn:function(){this.$node.css("top","0px"),this.$node.css("left","0px");var t=this.$input[0].getBoundingClientRect();this.autoWidth&&this.$node.css("width",t.width+"px");var e=this.$node[0].getBoundingClientRect(),n=t.bottom-e.top;this.$node.css("top",n+"px");var i=t.left-e.left;this.$node.css("left",i+"px"),this.eventBus.trigger("redrawn")},_onShown:function(){this.eventBus.trigger("shown"),this.autoselect&&this.dropdown.cursorTopSuggestion()},_onClosed:function(){this.input.clearHint(),this.input.removeActiveDescendant(),this.input.collapse(),this.eventBus.trigger("closed")},_onFocused:function(){if(this.isActivated=!0,this.openOnFocus){var t=this.input.getQuery();t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty(),this.dropdown.open()}},_onBlurred:function(){var t,e;t=this.dropdown.getDatumForCursor(),e=this.dropdown.getDatumForTopSuggestion();var n={selectionMethod:"blur"};this.debug||(this.autoselectOnBlur&&t?this._select(t,n):this.autoselectOnBlur&&e?this._select(e,n):(this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()))},_onEnterKeyed:function(t,e){var n,i;n=this.dropdown.getDatumForCursor(),i=this.dropdown.getDatumForTopSuggestion();var s={selectionMethod:"enterKey"};n?(this._select(n,s),e.preventDefault()):this.autoselect&&i&&(this._select(i,s),e.preventDefault())},_onTabKeyed:function(t,e){if(this.tabAutocomplete){var n;(n=this.dropdown.getDatumForCursor())?(this._select(n,{selectionMethod:"tabKey"}),e.preventDefault()):this._autocomplete(!0)}else this.dropdown.close()},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){"rtl"===this.dir&&this._autocomplete()},_onRightKeyed:function(){"ltr"===this.dir&&this._autocomplete()},_onQueryChanged:function(t,e){this.input.clearHintIfInvalid(),e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var t=this.input.getLanguageDirection();this.dir!==t&&(this.dir=t,this.$node.css("direction",t),this.dropdown.setLanguageDirection(t))},_updateHint:function(){var t,e,n,i,r;(t=this.dropdown.getDatumForTopSuggestion())&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(e=this.input.getInputValue(),n=a.normalizeQuery(e),i=s.escapeRegExChars(n),(r=new RegExp("^(?:"+i+")(.+$)","i").exec(t.value))?this.input.setHint(e+r[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(t){var e,n,i,s;e=this.input.getHint(),n=this.input.getQuery(),i=t||this.input.isCursorAtEnd(),e&&n!==e&&i&&((s=this.dropdown.getDatumForTopSuggestion())&&this.input.setInputValue(s.value),this.eventBus.trigger("autocompleted",s.raw,s.datasetName))},_select:function(t,e){void 0!==t.value&&this.input.setQuery(t.value),this.clearOnSelected?this.setVal(""):this.input.setInputValue(t.value,!0),this._setLanguageDirection(),!1===this.eventBus.trigger("selected",t.raw,t.datasetName,e).isDefaultPrevented()&&(this.dropdown.close(),s.defer(s.bind(this.dropdown.empty,this.dropdown)))},open:function(){if(!this.isActivated){var t=this.input.getInputValue();t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty()}this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(t){t=s.toStr(t),this.isActivated?this.input.setInputValue(t):(this.input.setQuery(t),this.input.setInputValue(t,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){this.input.destroy(),this.dropdown.destroy(),function(t,e){var n=t.find(s.className(e.prefix,e.input));s.each(n.data(i),(function(t,e){void 0===t?n.removeAttr(e):n.attr(e,t)})),n.detach().removeClass(s.className(e.prefix,e.input,!0)).insertAfter(t),n.removeData&&n.removeData(i);t.remove()}(this.$node,this.cssClasses),this.$node=null},getWrapper:function(){return this.dropdown.$container[0]}}),h.Dropdown=u,h.Input=a,h.sources=n(6353),t.exports=h},1348:t=>{"use strict";t.exports={element:null}},9715:t=>{"use strict";t.exports=function(t){var e=t.match(/Algolia for JavaScript \((\d+\.)(\d+\.)(\d+)\)/)||t.match(/Algolia for vanilla JavaScript (\d+\.)(\d+\.)(\d+)/);if(e)return[e[1],e[2],e[3]]}},6573:(t,e,n)=>{"use strict";var i,s=n(8937),r=n(1348);function o(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(t){if(void 0===t&&(t=navigator.userAgent),/(msie|trident)/i.test(t)){var e=t.match(/(msie |rv:)(\d+(.\d+)?)/i);if(e)return e[2]}return!1},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return null==t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,(function(t,i){t&&(n.isArray(t)?e[i]=[].concat(t):n.isObject(t)&&(e[i]=n.cloneDeep(t)))})),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,(function(i,s){n&&(n=e.call(null,i,s,t)&&n)})),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,(function(i,s){if(e.call(null,i,s,t))return n=!0,!1})),n):n},getUniqueId:(i=0,function(){return i++}),templatify:function(t){if(this.isFunction(t))return t;var e=r.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return n?t+e:"."+s(t+e,{isIdentifier:!0})},escapeHighlightedString:function(t,e,n){e=e||"";var i=document.createElement("div");i.appendChild(document.createTextNode(e)),n=n||"";var s=document.createElement("div");s.appendChild(document.createTextNode(n));var r=document.createElement("div");return r.appendChild(document.createTextNode(t)),r.innerHTML.replace(RegExp(o(i.innerHTML),"g"),e).replace(RegExp(o(s.innerHTML),"g"),n)}}},6903:(t,e,n)=>{"use strict";var i=n(6573),s=n(2281),r=n(9715);var o,a,u=(o=[],a=window.Promise.resolve(),function(t,e){return function(n,s){(function(t,e){return window.Promise.resolve().then((function(){return o.length&&(a=t.search(o),o=[]),a})).then((function(t){if(t)return t.results[e]}))})(t.as,o.push({indexName:t.indexName,query:n,params:e})-1).then((function(t){t&&s(t.hits,t)})).catch((function(t){i.error(t.message)}))}});t.exports=function(t,e){var n=r(t.as._ua);if(n&&n[0]>=3&&n[1]>20){var i="autocomplete.js "+s;-1===t.as._ua.indexOf(i)&&(t.as._ua+="; "+i)}return u(t,e)}},6353:(t,e,n)=>{"use strict";t.exports={hits:n(6903),popularIn:n(6839)}},6839:(t,e,n)=>{"use strict";var i=n(6573),s=n(2281),r=n(9715);t.exports=function(t,e,n,o){var a=r(t.as._ua);if(a&&a[0]>=3&&a[1]>20&&((e=e||{}).additionalUA="autocomplete.js "+s),!n.source)return i.error("Missing 'source' key");var u=i.isFunction(n.source)?n.source:function(t){return t[n.source]};if(!n.index)return i.error("Missing 'index' key");var c=n.index;return o=o||{},function(a,l){t.search(a,e,(function(t,a){if(t)i.error(t.message);else{if(a.hits.length>0){var h=a.hits[0],p=i.mixin({hitsPerPage:0},n);delete p.source,delete p.index;var f=r(c.as._ua);return f&&f[0]>=3&&f[1]>20&&(e.additionalUA="autocomplete.js "+s),void c.search(u(h),p,(function(t,e){if(t)i.error(t.message);else{var n=[];if(o.includeAll){var s=o.allTitle||"All departments";n.push(i.mixin({facet:{value:s,count:e.nbHits}},i.cloneDeep(h)))}i.each(e.facets,(function(t,e){i.each(t,(function(t,s){n.push(i.mixin({facet:{facet:e,value:s,count:t}},i.cloneDeep(h)))}))}));for(var r=1;r{"use strict";var i=n(9539);n(1348).element=i;var s=n(6573);s.isArray=i.isArray,s.isFunction=i.isFunction,s.isObject=i.isPlainObject,s.bind=i.proxy,s.each=function(t,e){i.each(t,(function(t,n){return e(n,t)}))},s.map=i.map,s.mixin=i.extend,s.Event=i.Event;var r="aaAutocomplete",o=n(7360),a=n(2324);function u(t,e,n,u){n=s.isArray(n)?n:[].slice.call(arguments,2);var c=i(t).each((function(t,s){var c=i(s),l=new a({el:c}),h=u||new o({input:c,eventBus:l,dropdownMenuContainer:e.dropdownMenuContainer,hint:void 0===e.hint||!!e.hint,minLength:e.minLength,autoselect:e.autoselect,autoselectOnBlur:e.autoselectOnBlur,tabAutocomplete:e.tabAutocomplete,openOnFocus:e.openOnFocus,templates:e.templates,debug:e.debug,clearOnSelected:e.clearOnSelected,cssClasses:e.cssClasses,datasets:n,keyboardShortcuts:e.keyboardShortcuts,appendTo:e.appendTo,autoWidth:e.autoWidth,ariaLabel:e.ariaLabel||s.getAttribute("aria-label")});c.data(r,h)}));return c.autocomplete={},s.each(["open","close","getVal","setVal","destroy","getWrapper"],(function(t){c.autocomplete[t]=function(){var e,n=arguments;return c.each((function(s,o){var a=i(o).data(r);e=a[t].apply(a,n)})),e}})),c}u.sources=o.sources,u.escapeHighlightedString=s.escapeHighlightedString;var c="autocomplete"in window,l=window.autocomplete;u.noConflict=function(){return c?window.autocomplete=l:delete window.autocomplete,u},t.exports=u},2281:t=>{t.exports="0.38.1"},9539:t=>{var e;e=window,t.exports=function(t){var e,n,i=function(){var e,n,i,s,r,o,a=[],u=a.concat,c=a.filter,l=a.slice,h=t.document,p={},f={},d={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},g=/^\s*<(\w+|!)[^>]*>/,m=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,y=/^(?:body|html)$/i,w=/([A-Z])/g,b=["val","css","html","text","data","width","height","offset"],C=["after","prepend","before","append"],x=h.createElement("table"),_=h.createElement("tr"),S={tr:h.createElement("tbody"),tbody:x,thead:x,tfoot:x,td:_,th:_,"*":h.createElement("div")},E=/complete|loaded|interactive/,A=/^[\w-]*$/,$={},T=$.toString,O={},D=h.createElement("div"),N={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},k=Array.isArray||function(t){return t instanceof Array};function I(t){return null==t?String(t):$[T.call(t)]||"object"}function P(t){return"function"==I(t)}function L(t){return null!=t&&t==t.window}function M(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function F(t){return"object"==I(t)}function R(t){return F(t)&&!L(t)&&Object.getPrototypeOf(t)==Object.prototype}function q(t){var e=!!t&&"length"in t&&t.length,n=i.type(t);return"function"!=n&&!L(t)&&("array"==n||0===e||"number"==typeof e&&e>0&&e-1 in t)}function V(t){return c.call(t,(function(t){return null!=t}))}function H(t){return t.length>0?i.fn.concat.apply([],t):t}function B(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function K(t){return t in f?f[t]:f[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function j(t,e){return"number"!=typeof e||d[B(t)]?e:e+"px"}function z(t){var e,n;return p[t]||(e=h.createElement(t),h.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),p[t]=n),p[t]}function U(t){return"children"in t?l.call(t.children):i.map(t.childNodes,(function(t){if(1==t.nodeType)return t}))}function Q(t,e){var n,i=t?t.length:0;for(n=0;n")),n===e&&(n=g.test(t)&&RegExp.$1),n in S||(n="*"),(a=S[n]).innerHTML=""+t,r=i.each(l.call(a.childNodes),(function(){a.removeChild(this)}))),R(s)&&(o=i(r),i.each(s,(function(t,e){b.indexOf(t)>-1?o[t](e):o.attr(t,e)}))),r},O.Z=function(t,e){return new Q(t,e)},O.isZ=function(t){return t instanceof O.Z},O.init=function(t,n){var s;if(!t)return O.Z();if("string"==typeof t)if("<"==(t=t.trim())[0]&&g.test(t))s=O.fragment(t,RegExp.$1,n),t=null;else{if(n!==e)return i(n).find(t);s=O.qsa(h,t)}else{if(P(t))return i(h).ready(t);if(O.isZ(t))return t;if(k(t))s=V(t);else if(F(t))s=[t],t=null;else if(g.test(t))s=O.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==e)return i(n).find(t);s=O.qsa(h,t)}}return O.Z(s,t)},(i=function(t,e){return O.init(t,e)}).extend=function(t){var e,n=l.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach((function(n){W(t,n,e)})),t},O.qsa=function(t,e){var n,i="#"==e[0],s=!i&&"."==e[0],r=i||s?e.slice(1):e,o=A.test(r);return t.getElementById&&o&&i?(n=t.getElementById(r))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:l.call(o&&!i&&t.getElementsByClassName?s?t.getElementsByClassName(r):t.getElementsByTagName(e):t.querySelectorAll(e))},i.contains=h.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},i.type=I,i.isFunction=P,i.isWindow=L,i.isArray=k,i.isPlainObject=R,i.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},i.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},i.inArray=function(t,e,n){return a.indexOf.call(e,t,n)},i.camelCase=r,i.trim=function(t){return null==t?"":String.prototype.trim.call(t)},i.uuid=0,i.support={},i.expr={},i.noop=function(){},i.map=function(t,e){var n,i,s,r=[];if(q(t))for(i=0;i=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each((function(){null!=this.parentNode&&this.parentNode.removeChild(this)}))},each:function(t){return a.every.call(this,(function(e,n){return!1!==t.call(e,n,e)})),this},filter:function(t){return P(t)?this.not(this.not(t)):i(c.call(this,(function(e){return O.matches(e,t)})))},add:function(t,e){return i(o(this.concat(i(t,e))))},is:function(t){return this.length>0&&O.matches(this[0],t)},not:function(t){var n=[];if(P(t)&&t.call!==e)this.each((function(e){t.call(this,e)||n.push(this)}));else{var s="string"==typeof t?this.filter(t):q(t)&&P(t.item)?l.call(t):i(t);this.forEach((function(t){s.indexOf(t)<0&&n.push(t)}))}return i(n)},has:function(t){return this.filter((function(){return F(t)?i.contains(this,t):i(this).find(t).size()}))},eq:function(t){return-1===t?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!F(t)?t:i(t)},last:function(){var t=this[this.length-1];return t&&!F(t)?t:i(t)},find:function(t){var e=this;return t?"object"==typeof t?i(t).filter((function(){var t=this;return a.some.call(e,(function(e){return i.contains(e,t)}))})):1==this.length?i(O.qsa(this[0],t)):this.map((function(){return O.qsa(this,t)})):i()},closest:function(t,e){var n=[],s="object"==typeof t&&i(t);return this.each((function(i,r){for(;r&&!(s?s.indexOf(r)>=0:O.matches(r,t));)r=r!==e&&!M(r)&&r.parentNode;r&&n.indexOf(r)<0&&n.push(r)})),i(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=i.map(n,(function(t){if((t=t.parentNode)&&!M(t)&&e.indexOf(t)<0)return e.push(t),t}));return Z(e,t)},parent:function(t){return Z(o(this.pluck("parentNode")),t)},children:function(t){return Z(this.map((function(){return U(this)})),t)},contents:function(){return this.map((function(){return this.contentDocument||l.call(this.childNodes)}))},siblings:function(t){return Z(this.map((function(t,e){return c.call(U(e.parentNode),(function(t){return t!==e}))})),t)},empty:function(){return this.each((function(){this.innerHTML=""}))},pluck:function(t){return i.map(this,(function(e){return e[t]}))},show:function(){return this.each((function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=z(this.nodeName))}))},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var e=P(t);if(this[0]&&!e)var n=i(t).get(0),s=n.parentNode||this.length>1;return this.each((function(r){i(this).wrapAll(e?t.call(this,r):s?n.cloneNode(!0):n)}))},wrapAll:function(t){if(this[0]){var e;for(i(this[0]).before(t=i(t));(e=t.children()).length;)t=e.first();i(t).append(this)}return this},wrapInner:function(t){var e=P(t);return this.each((function(n){var s=i(this),r=s.contents(),o=e?t.call(this,n):t;r.length?r.wrapAll(o):s.append(o)}))},unwrap:function(){return this.parent().each((function(){i(this).replaceWith(i(this).children())})),this},clone:function(){return this.map((function(){return this.cloneNode(!0)}))},hide:function(){return this.css("display","none")},toggle:function(t){return this.each((function(){var n=i(this);(t===e?"none"==n.css("display"):t)?n.show():n.hide()}))},prev:function(t){return i(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return i(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each((function(e){var n=this.innerHTML;i(this).empty().append(X(this,t,e,n))})):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each((function(e){var n=X(this,t,e,this.textContent);this.textContent=null==n?"":""+n})):0 in this?this.pluck("textContent").join(""):null},attr:function(t,i){var s;return"string"!=typeof t||1 in arguments?this.each((function(e){if(1===this.nodeType)if(F(t))for(n in t)G(this,n,t[n]);else G(this,t,X(this,i,e,this.getAttribute(t)))})):0 in this&&1==this[0].nodeType&&null!=(s=this[0].getAttribute(t))?s:e},removeAttr:function(t){return this.each((function(){1===this.nodeType&&t.split(" ").forEach((function(t){G(this,t)}),this)}))},prop:function(t,e){return t=N[t]||t,1 in arguments?this.each((function(n){this[t]=X(this,e,n,this[t])})):this[0]&&this[0][t]},removeProp:function(t){return t=N[t]||t,this.each((function(){delete this[t]}))},data:function(t,n){var i="data-"+t.replace(w,"-$1").toLowerCase(),s=1 in arguments?this.attr(i,n):this.attr(i);return null!==s?Y(s):e},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each((function(e){this.value=X(this,t,e,this.value)}))):this[0]&&(this[0].multiple?i(this[0]).find("option").filter((function(){return this.selected})).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each((function(t){var n=i(this),s=X(this,e,t,n.offset()),r=n.offsetParent().offset(),o={top:s.top-r.top,left:s.left-r.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)}));if(!this.length)return null;if(h.documentElement!==this[0]&&!i.contains(h.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+t.pageXOffset,top:n.top+t.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(t,e){if(arguments.length<2){var s=this[0];if("string"==typeof t){if(!s)return;return s.style[r(t)]||getComputedStyle(s,"").getPropertyValue(t)}if(k(t)){if(!s)return;var o={},a=getComputedStyle(s,"");return i.each(t,(function(t,e){o[e]=s.style[r(e)]||a.getPropertyValue(e)})),o}}var u="";if("string"==I(t))e||0===e?u=B(t)+":"+j(t,e):this.each((function(){this.style.removeProperty(B(t))}));else for(n in t)t[n]||0===t[n]?u+=B(n)+":"+j(n,t[n])+";":this.each((function(){this.style.removeProperty(B(n))}));return this.each((function(){this.style.cssText+=";"+u}))},index:function(t){return t?this.indexOf(i(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&a.some.call(this,(function(t){return this.test(J(t))}),K(t))},addClass:function(t){return t?this.each((function(e){if("className"in this){s=[];var n=J(this);X(this,t,e,n).split(/\s+/g).forEach((function(t){i(this).hasClass(t)||s.push(t)}),this),s.length&&J(this,n+(n?" ":"")+s.join(" "))}})):this},removeClass:function(t){return this.each((function(n){if("className"in this){if(t===e)return J(this,"");s=J(this),X(this,t,n,s).split(/\s+/g).forEach((function(t){s=s.replace(K(t)," ")})),J(this,s.trim())}}))},toggleClass:function(t,n){return t?this.each((function(s){var r=i(this);X(this,t,s,J(this)).split(/\s+/g).forEach((function(t){(n===e?!r.hasClass(t):n)?r.addClass(t):r.removeClass(t)}))})):this},scrollTop:function(t){if(this.length){var n="scrollTop"in this[0];return t===e?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var n="scrollLeft"in this[0];return t===e?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),s=y.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(i(t).css("margin-top"))||0,n.left-=parseFloat(i(t).css("margin-left"))||0,s.top+=parseFloat(i(e[0]).css("border-top-width"))||0,s.left+=parseFloat(i(e[0]).css("border-left-width"))||0,{top:n.top-s.top,left:n.left-s.left}}},offsetParent:function(){return this.map((function(){for(var t=this.offsetParent||h.body;t&&!y.test(t.nodeName)&&"static"==i(t).css("position");)t=t.offsetParent;return t}))}},i.fn.detach=i.fn.remove,["width","height"].forEach((function(t){var n=t.replace(/./,(function(t){return t[0].toUpperCase()}));i.fn[t]=function(s){var r,o=this[0];return s===e?L(o)?o["inner"+n]:M(o)?o.documentElement["scroll"+n]:(r=this.offset())&&r[t]:this.each((function(e){(o=i(this)).css(t,X(this,s,e,o[t]()))}))}})),C.forEach((function(n,s){var r=s%2;i.fn[n]=function(){var n,o,a=i.map(arguments,(function(t){var s=[];return"array"==(n=I(t))?(t.forEach((function(t){return t.nodeType!==e?s.push(t):i.zepto.isZ(t)?s=s.concat(t.get()):void(s=s.concat(O.fragment(t)))})),s):"object"==n||null==t?t:O.fragment(t)})),u=this.length>1;return a.length<1?this:this.each((function(e,n){o=r?n:n.parentNode,n=0==s?n.nextSibling:1==s?n.firstChild:2==s?n:null;var c=i.contains(h.documentElement,o);a.forEach((function(e){if(u)e=e.cloneNode(!0);else if(!o)return i(e).remove();o.insertBefore(e,n),c&&tt(e,(function(e){if(!(null==e.nodeName||"SCRIPT"!==e.nodeName.toUpperCase()||e.type&&"text/javascript"!==e.type||e.src)){var n=e.ownerDocument?e.ownerDocument.defaultView:t;n.eval.call(n,e.innerHTML)}}))}))}))},i.fn[r?n+"To":"insert"+(s?"Before":"After")]=function(t){return i(t)[n](this),this}})),O.Z.prototype=Q.prototype=i.fn,O.uniq=o,O.deserializeValue=Y,i.zepto=O,i}();return function(e){var n,i=1,s=Array.prototype.slice,r=e.isFunction,o=function(t){return"string"==typeof t},a={},u={},c="onfocusin"in t,l={focus:"focusin",blur:"focusout"},h={mouseenter:"mouseover",mouseleave:"mouseout"};function p(t){return t._zid||(t._zid=i++)}function f(t,e,n,i){if((e=d(e)).ns)var s=g(e.ns);return(a[p(t)]||[]).filter((function(t){return t&&(!e.e||t.e==e.e)&&(!e.ns||s.test(t.ns))&&(!n||p(t.fn)===p(n))&&(!i||t.sel==i)}))}function d(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function g(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function m(t,e){return t.del&&!c&&t.e in l||!!e}function v(t){return h[t]||c&&l[t]||t}function y(t,i,s,r,o,u,c){var l=p(t),f=a[l]||(a[l]=[]);i.split(/\s/).forEach((function(i){if("ready"==i)return e(document).ready(s);var a=d(i);a.fn=s,a.sel=o,a.e in h&&(s=function(t){var n=t.relatedTarget;if(!n||n!==this&&!e.contains(this,n))return a.fn.apply(this,arguments)}),a.del=u;var l=u||s;a.proxy=function(e){if(!(e=S(e)).isImmediatePropagationStopped()){try{var i=Object.getOwnPropertyDescriptor(e,"data");i&&!i.writable||(e.data=r)}catch(e){}var s=l.apply(t,e._args==n?[e]:[e].concat(e._args));return!1===s&&(e.preventDefault(),e.stopPropagation()),s}},a.i=f.length,f.push(a),"addEventListener"in t&&t.addEventListener(v(a.e),a.proxy,m(a,c))}))}function w(t,e,n,i,s){var r=p(t);(e||"").split(/\s/).forEach((function(e){f(t,e,n,i).forEach((function(e){delete a[r][e.i],"removeEventListener"in t&&t.removeEventListener(v(e.e),e.proxy,m(e,s))}))}))}u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",e.event={add:y,remove:w},e.proxy=function(t,n){var i=2 in arguments&&s.call(arguments,2);if(r(t)){var a=function(){return t.apply(n,i?i.concat(s.call(arguments)):arguments)};return a._zid=p(t),a}if(o(n))return i?(i.unshift(t[n],t),e.proxy.apply(null,i)):e.proxy(t[n],t);throw new TypeError("expected function")},e.fn.bind=function(t,e,n){return this.on(t,e,n)},e.fn.unbind=function(t,e){return this.off(t,e)},e.fn.one=function(t,e,n,i){return this.on(t,e,n,i,1)};var b=function(){return!0},C=function(){return!1},x=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,_={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};function S(t,i){if(i||!t.isDefaultPrevented){i||(i=t),e.each(_,(function(e,n){var s=i[e];t[e]=function(){return this[n]=b,s&&s.apply(i,arguments)},t[n]=C}));try{t.timeStamp||(t.timeStamp=Date.now())}catch(s){}(i.defaultPrevented!==n?i.defaultPrevented:"returnValue"in i?!1===i.returnValue:i.getPreventDefault&&i.getPreventDefault())&&(t.isDefaultPrevented=b)}return t}function E(t){var e,i={originalEvent:t};for(e in t)x.test(e)||t[e]===n||(i[e]=t[e]);return S(i,t)}e.fn.delegate=function(t,e,n){return this.on(e,t,n)},e.fn.undelegate=function(t,e,n){return this.off(e,t,n)},e.fn.live=function(t,n){return e(document.body).delegate(this.selector,t,n),this},e.fn.die=function(t,n){return e(document.body).undelegate(this.selector,t,n),this},e.fn.on=function(t,i,a,u,c){var l,h,p=this;return t&&!o(t)?(e.each(t,(function(t,e){p.on(t,i,a,e,c)})),p):(o(i)||r(u)||!1===u||(u=a,a=i,i=n),u!==n&&!1!==a||(u=a,a=n),!1===u&&(u=C),p.each((function(n,r){c&&(l=function(t){return w(r,t.type,u),u.apply(this,arguments)}),i&&(h=function(t){var n,o=e(t.target).closest(i,r).get(0);if(o&&o!==r)return n=e.extend(E(t),{currentTarget:o,liveFired:r}),(l||u).apply(o,[n].concat(s.call(arguments,1)))}),y(r,t,u,a,i,h||l)})))},e.fn.off=function(t,i,s){var a=this;return t&&!o(t)?(e.each(t,(function(t,e){a.off(t,i,e)})),a):(o(i)||r(s)||!1===s||(s=i,i=n),!1===s&&(s=C),a.each((function(){w(this,t,s,i)})))},e.fn.trigger=function(t,n){return(t=o(t)||e.isPlainObject(t)?e.Event(t):S(t))._args=n,this.each((function(){t.type in l&&"function"==typeof this[t.type]?this[t.type]():"dispatchEvent"in this?this.dispatchEvent(t):e(this).triggerHandler(t,n)}))},e.fn.triggerHandler=function(t,n){var i,s;return this.each((function(r,a){(i=E(o(t)?e.Event(t):t))._args=n,i.target=a,e.each(f(a,t.type||t),(function(t,e){if(s=e.proxy(i),i.isImmediatePropagationStopped())return!1}))})),s},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach((function(t){e.fn[t]=function(e){return 0 in arguments?this.bind(t,e):this.trigger(t)}})),e.Event=function(t,e){o(t)||(t=(e=t).type);var n=document.createEvent(u[t]||"Events"),i=!0;if(e)for(var s in e)"bubbles"==s?i=!!e[s]:n[s]=e[s];return n.initEvent(t,i,!0),S(n)}}(i),n=[],i.fn.remove=function(){return this.each((function(){this.parentNode&&("IMG"===this.tagName&&(n.push(this),this.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",e&&clearTimeout(e),e=setTimeout((function(){n=[]}),6e4)),this.parentNode.removeChild(this))}))},function(t){var e={},n=t.fn.data,i=t.camelCase,s=t.expando="Zepto"+ +new Date,r=[];function o(r,o){var u=r[s],c=u&&e[u];if(void 0===o)return c||a(r);if(c){if(o in c)return c[o];var l=i(o);if(l in c)return c[l]}return n.call(t(r),o)}function a(n,r,o){var a=n[s]||(n[s]=++t.uuid),c=e[a]||(e[a]=u(n));return void 0!==r&&(c[i(r)]=o),c}function u(e){var n={};return t.each(e.attributes||r,(function(e,s){0==s.name.indexOf("data-")&&(n[i(s.name.replace("data-",""))]=t.zepto.deserializeValue(s.value))})),n}t.fn.data=function(e,n){return void 0===n?t.isPlainObject(e)?this.each((function(n,i){t.each(e,(function(t,e){a(i,t,e)}))})):0 in this?o(this[0],e):void 0:this.each((function(){a(this,e,n)}))},t.data=function(e,n,i){return t(e).data(n,i)},t.hasData=function(n){var i=n[s],r=i&&e[i];return!!r&&!t.isEmptyObject(r)},t.fn.removeData=function(n){return"string"==typeof n&&(n=n.split(/\s+/)),this.each((function(){var r=this[s],o=r&&e[r];o&&t.each(n||o,(function(t){delete o[n?i(this):t]}))}))},["remove","empty"].forEach((function(e){var n=t.fn[e];t.fn[e]=function(){var t=this.find("*");return"remove"===e&&(t=t.add(this)),t.removeData(),n.call(this)}}))}(i),i}(e)},8937:t=>{"use strict";var e={}.hasOwnProperty,n=/[ -,\.\/:-@\[-\^`\{-~]/,i=/[ -,\.\/:-@\[\]\^`\{-~]/,s=/(^|\\+)?(\\[A-F0-9]{1,6})\x20(?![a-fA-F0-9\x20])/g,r=function t(r,o){"single"!=(o=function(t,n){if(!t)return n;var i={};for(var s in n)i[s]=e.call(t,s)?t[s]:n[s];return i}(o,t.options)).quotes&&"double"!=o.quotes&&(o.quotes="single");for(var a="double"==o.quotes?'"':"'",u=o.isIdentifier,c=r.charAt(0),l="",h=0,p=r.length;h126){if(d>=55296&&d<=56319&&h{"use strict";var i,s,r,o=[n(5741),n(1856),n(1015),n(6486),n(5723),n(6345)],a=-1,u=[],c=!1;function l(){i&&s&&(i=!1,s.length?u=s.concat(u):a=-1,u.length&&h())}function h(){if(!i){c=!1,i=!0;for(var t=u.length,e=setTimeout(l);t;){for(s=u,u=[];s&&++a1)for(var n=1;n{"use strict";e.test=function(){return!n.g.setImmediate&&void 0!==n.g.MessageChannel},e.install=function(t){var e=new n.g.MessageChannel;return e.port1.onmessage=t,function(){e.port2.postMessage(0)}}},1015:(t,e,n)=>{"use strict";var i=n.g.MutationObserver||n.g.WebKitMutationObserver;e.test=function(){return i},e.install=function(t){var e=0,s=new i(t),r=n.g.document.createTextNode("");return s.observe(r,{characterData:!0}),function(){r.data=e=++e%2}}},1856:(t,e,n)=>{"use strict";e.test=function(){return"function"==typeof n.g.queueMicrotask},e.install=function(t){return function(){n.g.queueMicrotask(t)}}},5723:(t,e,n)=>{"use strict";e.test=function(){return"document"in n.g&&"onreadystatechange"in n.g.document.createElement("script")},e.install=function(t){return function(){var e=n.g.document.createElement("script");return e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},n.g.document.documentElement.appendChild(e),t}}},6345:(t,e)=>{"use strict";e.test=function(){return!0},e.install=function(t){return function(){setTimeout(t,0)}}}}]); \ No newline at end of file diff --git a/assets/js/489.ac3cadbd.js.LICENSE.txt b/assets/js/489.d07863ea.js.LICENSE.txt similarity index 100% rename from assets/js/489.ac3cadbd.js.LICENSE.txt rename to assets/js/489.d07863ea.js.LICENSE.txt diff --git a/assets/js/48b7ca01.46746df6.js b/assets/js/48b7ca01.46746df6.js deleted file mode 100644 index 543d2bff8..000000000 --- a/assets/js/48b7ca01.46746df6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1347],{1165:(e,t,i)=>{i.d(t,{Ck:()=>m,kS:()=>g});var s=i(4848),n=i(8453),a=i(6540),r=i(4016),o=i(3517),l=i(3343),c=i(3864),d=i(8633),h=i(363);const m=({imageData:e,pixelsAbove:t,pixelsBelow:i})=>{const a={div:"div",...(0,n.R)()},c=({currentSlide:e,direction:t,slideCount:i,...n})=>"left"===t?(0,s.jsx)(d.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,s.jsx)(h.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(a.div,{style:{height:`${t}px`}}),(0,s.jsx)(o.A,{arrows:!0,prevArrow:(0,s.jsx)(c,{direction:"left"}),nextArrow:(0,s.jsx)(c,{direction:"right"}),children:e.map((e=>(0,s.jsx)(l.A,{src:e.src},e.src)))}),(0,s.jsx)(a.div,{style:{height:`${i}px`}})]})},g=({tabMap:e,pixelsAbove:t,pixelsBelow:i})=>{const o={div:"div",...(0,n.R)()},[l,d]=(0,a.useState)(Object.keys(e)[0]);return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(o.div,{style:{height:`${t}px`}}),(0,s.jsx)(c.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:l,onTabChange:e=>{d(e)},children:e[l].component}),(0,s.jsx)(o.div,{style:{height:`${i}px`}})]})}},9350:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var s=i(4848),n=i(8453);i(1165);const a={title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},r="Introduction",o={permalink:"/blog/svt-av1-deep-dive",source:"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",date:"2023-12-30T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"},{inline:!0,label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:22.78,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043",key:null,page:null}],frontMatter:{title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",permalink:"/blog/svt-av1-second-deep-dive"},nextItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"}},l={authorsImageUrls:[void 0]},c=[];function d(e){const t={del:"del",em:"em",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips."}),"\n",(0,s.jsxs)(t.p,{children:["The resources available will range from ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"graphs"})})," to ",(0,s.jsx)(t.del,{children:(0,s.jsx)(t.strong,{children:"image comparisons"})})," (WIP). The ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,s.jsx)(t.strong,{children:"latter"})," are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/48b7ca01.58594b7d.js b/assets/js/48b7ca01.58594b7d.js new file mode 100644 index 000000000..9104f7945 --- /dev/null +++ b/assets/js/48b7ca01.58594b7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1347],{1165:(e,t,i)=>{i.d(t,{Ck:()=>m,kS:()=>p});var s=i(4848),n=i(8453),a=i(6540),r=i(4016),o=i(3517),l=i(3343),c=i(3864),d=i(8633),h=i(363);const m=({imageData:e,pixelsAbove:t,pixelsBelow:i})=>{const a={div:"div",...(0,n.R)()},c=({currentSlide:e,direction:t,slideCount:i,...n})=>"left"===t?(0,s.jsx)(d.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,s.jsx)(h.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(a.div,{style:{height:`${t}px`}}),(0,s.jsx)(o.A,{arrows:!0,prevArrow:(0,s.jsx)(c,{direction:"left"}),nextArrow:(0,s.jsx)(c,{direction:"right"}),children:e.map((e=>(0,s.jsx)(l.A,{src:e.src},e.src)))}),(0,s.jsx)(a.div,{style:{height:`${i}px`}})]})},p=({tabMap:e,pixelsAbove:t,pixelsBelow:i})=>{const o={div:"div",...(0,n.R)()},[l,d]=(0,a.useState)(Object.keys(e)[0]);return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(o.div,{style:{height:`${t}px`}}),(0,s.jsx)(c.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:l,onTabChange:e=>{d(e)},children:e[l].component}),(0,s.jsx)(o.div,{style:{height:`${i}px`}})]})}},9350:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var s=i(5255),n=i(4848),a=i(8453);i(1165);const r={title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},o="Introduction",l={authorsImageUrls:[void 0]},c=[];function d(e){const t={del:"del",em:"em",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips."}),"\n",(0,n.jsxs)(t.p,{children:["The resources available will range from ",(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:"graphs"})})," to ",(0,n.jsx)(t.del,{children:(0,n.jsx)(t.strong,{children:"image comparisons"})})," (WIP). The ",(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,n.jsx)(t.strong,{children:"latter"})," are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons."]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},5255:e=>{e.exports=JSON.parse('{"permalink":"/blog/svt-av1-deep-dive","source":"@site/blog/2023-12-30-svt-av1-deep-dive.mdx","title":"Encoding Animation with SVT-AV1: A Deep Dive","description":"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?","date":"2023-12-30T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"},{"inline":true,"label":"benchmarks","permalink":"/blog/tags/benchmarks"}],"readingTime":22.78,"hasTruncateMarker":true,"authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Encoding Animation with SVT-AV1: A Deep Dive","description":"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?","slug":"svt-av1-deep-dive","authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043"}],"tags":["video","compression","benchmarks"],"image":"/img/svt-1.8.0-testing-blog-image.webp","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","permalink":"/blog/svt-av1-second-deep-dive"},"nextItem":{"title":"Embedding the Un-Embeddable","permalink":"/blog/embedding-the-un-embeddable"}}')}}]); \ No newline at end of file diff --git a/assets/js/49b64d14.085e8d06.js b/assets/js/49b64d14.085e8d06.js new file mode 100644 index 000000000..4dceb2c9c --- /dev/null +++ b/assets/js/49b64d14.085e8d06.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5993],{6807:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"encoders/SVT-AV1","title":"SVT-AV1","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/encoders/SVT-AV1.mdx","sourceDirName":"encoders","slug":"/encoders/SVT-AV1","permalink":"/docs/encoders/SVT-AV1","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"SVT-AV1","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"SVT-AV1-PSY","permalink":"/docs/encoders/SVT-AV1-PSY"},"next":{"title":"rav1e","permalink":"/docs/encoders/rav1e"}}');var s=i(4848),r=i(8453),o=i(1470),a=i(9365);const l={title:"SVT-AV1",sidebar_position:5},c="SVT-AV1",d={},h=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Strengths",id:"strengths",level:3},{value:"Weaknesses",id:"weaknesses",level:3},{value:"Encoder Optimization",id:"encoder-optimization",level:3},{value:"Community Forks",id:"community-forks",level:2},{value:"SVT-AV1-PSY",id:"svt-av1-psy",level:3}];function u(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"svt-av1",children:"SVT-AV1"})}),"\n",(0,s.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsxs)(t.p,{children:['SVT-AV1 (Scalable Video Technology for AV1) is an AV1-compliant software encoder/decoder library. Jointly developed by Intel and Netflix, SVT-AV1 is written almost entirely in C with some parts written in C++ and Assembly. As the name suggests, it is part of the "',(0,s.jsx)(t.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"Scalable Video Technology"}),'" project lineup by Intel.']}),"\n",(0,s.jsxs)(t.p,{children:['This entry discusses the SVT-AV1 encoder, also known as the "Production" AV1 encoder (while ',(0,s.jsx)(t.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),' is the "reference" AV1 encoder), & refers to SVT-AV1 as such. SVT-AV1 is known for its parallelization, high coding efficiency, & active development. SVT-AV1 scales across multiple CPU cores much more effectively than aomenc or ',(0,s.jsx)(t.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", so the use of tools like ",(0,s.jsx)(t.a,{href:"/docs/utilities/av1an",children:"Av1an"})," is less helpful albeit still helpful for scene detection."]}),"\n",(0,s.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(t.p,{children:["SVT-AV1 is available in FFmpeg via ",(0,s.jsx)(t.code,{children:"libsvtav1"}),", to check if you have it, run ",(0,s.jsx)(t.code,{children:"ffmpeg -h encoder=libsvtav1"}),". You can input non-FFmpeg standard SVT-AV1 parameters via ",(0,s.jsx)(t.code,{children:"-svtav1-params"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,s.jsx)(t.p,{children:"SVT-AV1 supports the following color spaces:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Format"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,s.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YUV420P"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(t.td,{children:"8-bit"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YUV420P10LE"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(o.A,{children:[(0,s.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,s.jsx)(t.p,{children:(0,s.jsxs)(t.em,{children:["A precompiled AVX2-optimized binary of SVT-AV1-PSY can be installed for x86_64 Linux via ",(0,s.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,s.jsx)(t.p,{children:"To build SVT-AV1 from source, first clone the desired SVT-AV1 repository & enter the build directory."}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Clone mainline SVT-AV1"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ngit reset --hard bbcff785881b320f7e1b1f77a2f5ed025f8bfd75 # Reset to release 2.1.0\ncd SVT-AV1/Build/linux\n"})}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd SVT-AV1/Build/linux\n"})}),(0,s.jsxs)(t.p,{children:["In the directory, simply run ",(0,s.jsx)(t.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use clang when building SVT-AV1."]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,s.jsxs)(t.p,{children:["The compiled binaries will be in the ",(0,s.jsx)(t.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,s.jsx)(t.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,s.jsxs)(t.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 16 Apr 2024) please run ",(0,s.jsx)(t.code,{children:"git reset --hard 2aeeb4f1a1d495b84bf5c21dbb60ae10e991fada"})," in the cloned directory. It is recommended that you do this, as new changes to git aren't always stable right away & a release will guarantee more stability."]}),(0,s.jsxs)(t.p,{children:["If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,s.jsxs)(t.strong,{children:["Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,s.jsx)(t.code,{children:"/dev/shm"})," for transcoding"]}),". You can compile statically linked SVT-AV1 with PGO (and LTO, or link-time optimization) by following this script:"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Bulding SVT-AV1 with profile guided optimization"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n"})}),(0,s.jsx)(t.p,{children:"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n"})})]}),(0,s.jsx)(a.A,{value:"windows",label:"Windows",children:(0,s.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,s.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})})]}),"\n",(0,s.jsx)(t.h2,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsx)(t.h3,{id:"strengths",children:"Strengths"}),"\n",(0,s.jsx)(t.p,{children:"SVT-AV1's greatest strength is its parallelization capability, where it outclasses other AV1 encoders by a significant margin. SVT-AV1's parallelization techniques do not involve tiling & don't harm video quality, & can comfortably utilize up to 16 cores given 1080p source video. This is while maintaining competitive coding efficiency to mainline aomenc. Perceptually, mainline SVT-AV1 is outperformed by well-tuned community forks of aomenc, but according to many the gap has begun to close with the introduction of SVT-AV1-PSY."}),"\n",(0,s.jsx)(t.h3,{id:"weaknesses",children:"Weaknesses"}),"\n",(0,s.jsxs)(t.p,{children:["SVT-AV1 is strongest on x86 CPUs, & while ARM NEON assembly is ",(0,s.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/ba13fac241f1b54954935f2cb200efc07f3de13a",children:"available"})," and has been slowly improving since its introduction in version 1.8.0, SVT-AV1 still underperforms on ARM. For this reason, it is not a good cross-architecture CPU benchmark. SVT-AV1's support for various AV1 features is also limited; it only supports up to 4:2:0 chroma subsampling with no support for 12-bit color, and it does not support scene change detection (there are no plans to implement this, either). The smallest possible video that SVT-AV1 can produce is 64x64."]}),"\n",(0,s.jsx)(t.h3,{id:"encoder-optimization",children:"Encoder Optimization"}),"\n",(0,s.jsxs)(t.p,{children:["Aside from build optimizations for speed, there is further tweaking to be done to the ",(0,s.jsx)(t.code,{children:"SvtAv1EncApp"})," binary parameters when encoding. The following applies to mainline SVT-AV1, but does not apply to SVT-AV1-PSY."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"--film-grain"})," & ",(0,s.jsx)(t.code,{children:"--film-grain-denoise"})]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Most live-action sources feature hard-to-compress digital noise that is easily smoothed out by AV1 compression. To add this grain back, or even denoise through the encoder and then add grain, it is possible to use the ",(0,s.jsx)(t.code,{children:"--film-grain"})," parameter to specify an amount of film grain to add to the encode (& ",(0,s.jsx)(t.code,{children:"--film-grain-denoise"})," to specify how to denoise the input video before encoding for potentially better appeal). Denoising a video always removes fine details, so sticking with just ",(0,s.jsx)(t.code,{children:"--film-grain"})," is recommended in most cases. According to ",(0,s.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#practical-advice-on-grain-synthesis",children:"SVT-AV1 documentation"}),", a level of 8 should be used for live-action content with a normal amount of grain while a level of 4 works well for hand-drawn animation or other smoother-looking sources that still stand to benefit from some grain synthesis."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"--input-depth 10"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"10-bit output from AV1 encoding is always desirable for coding efficiency, even if your source is 8-bit. This option only produces a 10-bit AV1 bitstream if the source provided to the encoder is 10-bit."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"--tune 2"})}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["There are three tunes in mainline SVT-AV1: Tune 1 is for ",(0,s.jsx)(t.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," ",(0,s.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"}),", Tune 2 is for ",(0,s.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"})," RDO, & Tune 0 is a ",(0,s.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"psychovisual"})," tune labeled VQ. It has been common practice to lean away from the PSNR tune, as it is not designed for visual quality but rather to perform better on the PSNR metric which is widely considered to be inconsistent with our human perception of fidelity. Using the VQ tune is a safe bet for now, but many believe the newer SSIM tune provides better visual fidelity. Using SVT-AV1-PSY, the custom Subjective SSIM tune (Tune 3) provides the best of both Tune 2 & Tune 0 with additional improvements as well."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"--enable-qm 1"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Enables quantization matrices, disabled by default. Improves coding efficiency mainly by improving encoding speed while producing similar quality video."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"--qm-min 0"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Sets the minimum flatness of quantization matrices to 0, down from the default 8. This is recommended unless you are dealing with extremely heavy grain. The maximum quantization matrix flatness is 15 by default, and should be left alone"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"--keyint [FPS*10]"})}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Similar to ",(0,s.jsx)(t.code,{children:"--kf-max-dist"})," in ",(0,s.jsx)(t.a,{href:"/docs/encoders/vpxenc",children:"vpxenc"}),", this tells the encoder when to place keyframes. Because SVT-AV1 doesn't have scene detection, this isn't the maximum distance between keyframes, but rather a fixed interval for placing keyframes. If using Av1an, set to -1 to disable keyframe insertion as Av1an handles that instead."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"--irefresh-type 2"})}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Intra refresh is specified through this option, & lets the user decide between Closed GOP & Open GOP. GOP stands for Group of Pictures. Open GOP allows GOPs to ",(0,s.jsx)(t.a,{href:"https://ottverse.com/closed-gop-open-gop-idr/",children:"reference one another"}),", but support for this feature is currently incomplete. Therefore, it is recommended to use Closed GOP for the time being via ",(0,s.jsx)(t.code,{children:"--irefresh-type 2"})," until this is rectified."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"--preset X"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"SVT-AV1 can be used in 14 different presets, labeled -1 through 13. Preset -1 is the slowest, but provides the best coding efficiency; it is also dubbed a research preset that is not recommended for regular use. Preset 13 is the fastest, and is also not recommended for regular use as it makes serious trade-offs to achieve unrealistically fast speeds at the cost of the encoder's coding efficiency. Using presets 2 through 8 is the best course of action for non-realtime applications if you desire reasonable speed, while 9 through 12 are useful for real-time encoding at 1080p or lower, even on low-end consumer computer hardware."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"--crf X"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"CRF is the best way to target quality for optimal visual fidelity. VBR & CBR lose efficiency due to their inherently limited rate control capabilities."}),"\n",(0,s.jsx)(t.h2,{id:"community-forks",children:"Community Forks"}),"\n",(0,s.jsxs)(t.p,{children:["Currently, there is only one noteworthy community fork of SVT-AV1 called ",(0,s.jsx)(t.a,{href:"/docs/encoders/SVT-AV1-PSY",children:"SVT-AV1-PSY"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"svt-av1-psy",children:"SVT-AV1-PSY"}),"\n",(0,s.jsxs)(t.p,{children:["SVT-AV1-PSY is a community fork of SVT-AV1 that strives to improve the perceptual fidelity and quality of life provided by the encoder. The goal of this project is to create the best encoding implementation for perceptual quality with AV1, and it aims to surpass previous community forks of ",(0,s.jsx)(t.a,{href:"/docs/encoders/aomenc#choosing-forks",children:"aomenc"})," in speed and visual quality."]}),"\n",(0,s.jsxs)(t.p,{children:["SVT-AV1-PSY has a number of feature additions to the mainline SVT-AV1 encoder as well as modified defaults that aim to make it easier to produce a more perceptually optimal bistream. For a full list of the encoder's feature additions and modifications to defaults, see the ",(0,s.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy/blob/master/README.md#feature-additions",children:"project's README"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},9365:(e,t,i)=>{i.d(t,{A:()=>o});i(6540);var n=i(4164);const s={tabItem:"tabItem_Ymn6"};var r=i(4848);function o(e){let{children:t,hidden:i,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,o),hidden:i,children:t})}},1470:(e,t,i)=>{i.d(t,{A:()=>j});var n=i(6540),s=i(4164),r=i(3104),o=i(6347),a=i(205),l=i(7485),c=i(1682),d=i(679);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:t,children:i}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:i,attributes:n,default:s}}=e;return{value:t,label:i,attributes:n,default:s}}))}(i);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function p(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:i}=e;const s=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(s.location.search);t.set(r,e),s.replace({...s.location,search:t.toString()})}),[r,s])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:s}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=i.find((e=>e.default))??i[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[c,h]=m({queryString:i,groupId:s}),[f,b]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,r]=(0,d.Dv)(i);return[s,(0,n.useCallback)((e=>{i&&r.set(e)}),[i,r])]}({groupId:s}),g=(()=>{const e=c??f;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{g&&l(g)}),[g]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),b(e)}),[h,b,r]),tabValues:r}}var b=i(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function v(e){let{className:t,block:i,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const t=e.currentTarget,i=l.indexOf(t),s=a[i].value;s!==n&&(c(t),o(s))},h=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":i},t),children:a.map((e=>{let{value:t,label:i,attributes:r}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===t}),children:i??t},t)}))})}function V(e){let{lazy:t,children:i,selectedValue:r}=e;const o=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function y(e){const t=f(e);return(0,x.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,x.jsx)(v,{...t,...e}),(0,x.jsx)(V,{...t,...e})]})}function j(e){const t=(0,b.A)();return(0,x.jsx)(y,{...e,children:h(e.children)},String(t))}},8453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>a});var n=i(6540);const s={},r=n.createContext(s);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49b64d14.988cf361.js b/assets/js/49b64d14.988cf361.js deleted file mode 100644 index ae6265cf4..000000000 --- a/assets/js/49b64d14.988cf361.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5993],{4493:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var n=i(4848),s=i(8453),r=i(1470),o=i(9365);const a={title:"SVT-AV1",sidebar_position:5},l="SVT-AV1",c={id:"encoders/SVT-AV1",title:"SVT-AV1",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/SVT-AV1.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-AV1",permalink:"/docs/encoders/SVT-AV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"SVT-AV1",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"SVT-AV1-PSY",permalink:"/docs/encoders/SVT-AV1-PSY"},next:{title:"rav1e",permalink:"/docs/encoders/rav1e"}},d={},h=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Strengths",id:"strengths",level:3},{value:"Weaknesses",id:"weaknesses",level:3},{value:"Encoder Optimization",id:"encoder-optimization",level:3},{value:"Community Forks",id:"community-forks",level:2},{value:"SVT-AV1-PSY",id:"svt-av1-psy",level:3}];function u(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"svt-av1",children:"SVT-AV1"})}),"\n",(0,n.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(t.p,{children:['SVT-AV1 (Scalable Video Technology for AV1) is an AV1-compliant software encoder/decoder library. Jointly developed by Intel and Netflix, SVT-AV1 is written almost entirely in C with some parts written in C++ and Assembly. As the name suggests, it is part of the "',(0,n.jsx)(t.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"Scalable Video Technology"}),'" project lineup by Intel.']}),"\n",(0,n.jsxs)(t.p,{children:['This entry discusses the SVT-AV1 encoder, also known as the "Production" AV1 encoder (while ',(0,n.jsx)(t.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),' is the "reference" AV1 encoder), & refers to SVT-AV1 as such. SVT-AV1 is known for its parallelization, high coding efficiency, & active development. SVT-AV1 scales across multiple CPU cores much more effectively than aomenc or ',(0,n.jsx)(t.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", so the use of tools like ",(0,n.jsx)(t.a,{href:"/docs/utilities/av1an",children:"Av1an"})," is less helpful albeit still helpful for scene detection."]}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1 is available in FFmpeg via ",(0,n.jsx)(t.code,{children:"libsvtav1"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=libsvtav1"}),". You can input non-FFmpeg standard SVT-AV1 parameters via ",(0,n.jsx)(t.code,{children:"-svtav1-params"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1 supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(r.A,{children:[(0,n.jsxs)(o.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsx)(t.p,{children:(0,n.jsxs)(t.em,{children:["A precompiled AVX2-optimized binary of SVT-AV1-PSY can be installed for x86_64 Linux via ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,n.jsx)(t.p,{children:"To build SVT-AV1 from source, first clone the desired SVT-AV1 repository & enter the build directory."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Clone mainline SVT-AV1"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ngit reset --hard bbcff785881b320f7e1b1f77a2f5ed025f8bfd75 # Reset to release 2.1.0\ncd SVT-AV1/Build/linux\n"})}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd SVT-AV1/Build/linux\n"})}),(0,n.jsxs)(t.p,{children:["In the directory, simply run ",(0,n.jsx)(t.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use clang when building SVT-AV1."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,n.jsxs)(t.p,{children:["The compiled binaries will be in the ",(0,n.jsx)(t.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,n.jsx)(t.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,n.jsxs)(t.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 16 Apr 2024) please run ",(0,n.jsx)(t.code,{children:"git reset --hard 2aeeb4f1a1d495b84bf5c21dbb60ae10e991fada"})," in the cloned directory. It is recommended that you do this, as new changes to git aren't always stable right away & a release will guarantee more stability."]}),(0,n.jsxs)(t.p,{children:["If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,n.jsxs)(t.strong,{children:["Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,n.jsx)(t.code,{children:"/dev/shm"})," for transcoding"]}),". You can compile statically linked SVT-AV1 with PGO (and LTO, or link-time optimization) by following this script:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Bulding SVT-AV1 with profile guided optimization"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n"})}),(0,n.jsx)(t.p,{children:"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n"})})]}),(0,n.jsx)(o.A,{value:"windows",label:"Windows",children:(0,n.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})})]}),"\n",(0,n.jsx)(t.h2,{id:"encoding",children:"Encoding"}),"\n",(0,n.jsx)(t.h3,{id:"strengths",children:"Strengths"}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1's greatest strength is its parallelization capability, where it outclasses other AV1 encoders by a significant margin. SVT-AV1's parallelization techniques do not involve tiling & don't harm video quality, & can comfortably utilize up to 16 cores given 1080p source video. This is while maintaining competitive coding efficiency to mainline aomenc. Perceptually, mainline SVT-AV1 is outperformed by well-tuned community forks of aomenc, but according to many the gap has begun to close with the introduction of SVT-AV1-PSY."}),"\n",(0,n.jsx)(t.h3,{id:"weaknesses",children:"Weaknesses"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1 is strongest on x86 CPUs, & while ARM NEON assembly is ",(0,n.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/ba13fac241f1b54954935f2cb200efc07f3de13a",children:"available"})," and has been slowly improving since its introduction in version 1.8.0, SVT-AV1 still underperforms on ARM. For this reason, it is not a good cross-architecture CPU benchmark. SVT-AV1's support for various AV1 features is also limited; it only supports up to 4:2:0 chroma subsampling with no support for 12-bit color, and it does not support scene change detection (there are no plans to implement this, either). The smallest possible video that SVT-AV1 can produce is 64x64."]}),"\n",(0,n.jsx)(t.h3,{id:"encoder-optimization",children:"Encoder Optimization"}),"\n",(0,n.jsxs)(t.p,{children:["Aside from build optimizations for speed, there is further tweaking to be done to the ",(0,n.jsx)(t.code,{children:"SvtAv1EncApp"})," binary parameters when encoding. The following applies to mainline SVT-AV1, but does not apply to SVT-AV1-PSY."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"--film-grain"})," & ",(0,n.jsx)(t.code,{children:"--film-grain-denoise"})]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Most live-action sources feature hard-to-compress digital noise that is easily smoothed out by AV1 compression. To add this grain back, or even denoise through the encoder and then add grain, it is possible to use the ",(0,n.jsx)(t.code,{children:"--film-grain"})," parameter to specify an amount of film grain to add to the encode (& ",(0,n.jsx)(t.code,{children:"--film-grain-denoise"})," to specify how to denoise the input video before encoding for potentially better appeal). Denoising a video always removes fine details, so sticking with just ",(0,n.jsx)(t.code,{children:"--film-grain"})," is recommended in most cases. According to ",(0,n.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#practical-advice-on-grain-synthesis",children:"SVT-AV1 documentation"}),", a level of 8 should be used for live-action content with a normal amount of grain while a level of 4 works well for hand-drawn animation or other smoother-looking sources that still stand to benefit from some grain synthesis."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--input-depth 10"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"10-bit output from AV1 encoding is always desirable for coding efficiency, even if your source is 8-bit. This option only produces a 10-bit AV1 bitstream if the source provided to the encoder is 10-bit."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--tune 2"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["There are three tunes in mainline SVT-AV1: Tune 1 is for ",(0,n.jsx)(t.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," ",(0,n.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"}),", Tune 2 is for ",(0,n.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"})," RDO, & Tune 0 is a ",(0,n.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"psychovisual"})," tune labeled VQ. It has been common practice to lean away from the PSNR tune, as it is not designed for visual quality but rather to perform better on the PSNR metric which is widely considered to be inconsistent with our human perception of fidelity. Using the VQ tune is a safe bet for now, but many believe the newer SSIM tune provides better visual fidelity. Using SVT-AV1-PSY, the custom Subjective SSIM tune (Tune 3) provides the best of both Tune 2 & Tune 0 with additional improvements as well."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--enable-qm 1"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Enables quantization matrices, disabled by default. Improves coding efficiency mainly by improving encoding speed while producing similar quality video."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--qm-min 0"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Sets the minimum flatness of quantization matrices to 0, down from the default 8. This is recommended unless you are dealing with extremely heavy grain. The maximum quantization matrix flatness is 15 by default, and should be left alone"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--keyint [FPS*10]"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Similar to ",(0,n.jsx)(t.code,{children:"--kf-max-dist"})," in ",(0,n.jsx)(t.a,{href:"/docs/encoders/vpxenc",children:"vpxenc"}),", this tells the encoder when to place keyframes. Because SVT-AV1 doesn't have scene detection, this isn't the maximum distance between keyframes, but rather a fixed interval for placing keyframes. If using Av1an, set to -1 to disable keyframe insertion as Av1an handles that instead."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--irefresh-type 2"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Intra refresh is specified through this option, & lets the user decide between Closed GOP & Open GOP. GOP stands for Group of Pictures. Open GOP allows GOPs to ",(0,n.jsx)(t.a,{href:"https://ottverse.com/closed-gop-open-gop-idr/",children:"reference one another"}),", but support for this feature is currently incomplete. Therefore, it is recommended to use Closed GOP for the time being via ",(0,n.jsx)(t.code,{children:"--irefresh-type 2"})," until this is rectified."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--preset X"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1 can be used in 14 different presets, labeled -1 through 13. Preset -1 is the slowest, but provides the best coding efficiency; it is also dubbed a research preset that is not recommended for regular use. Preset 13 is the fastest, and is also not recommended for regular use as it makes serious trade-offs to achieve unrealistically fast speeds at the cost of the encoder's coding efficiency. Using presets 2 through 8 is the best course of action for non-realtime applications if you desire reasonable speed, while 9 through 12 are useful for real-time encoding at 1080p or lower, even on low-end consumer computer hardware."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--crf X"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"CRF is the best way to target quality for optimal visual fidelity. VBR & CBR lose efficiency due to their inherently limited rate control capabilities."}),"\n",(0,n.jsx)(t.h2,{id:"community-forks",children:"Community Forks"}),"\n",(0,n.jsxs)(t.p,{children:["Currently, there is only one noteworthy community fork of SVT-AV1 called ",(0,n.jsx)(t.a,{href:"/docs/encoders/SVT-AV1-PSY",children:"SVT-AV1-PSY"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"svt-av1-psy",children:"SVT-AV1-PSY"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1-PSY is a community fork of SVT-AV1 that strives to improve the perceptual fidelity and quality of life provided by the encoder. The goal of this project is to create the best encoding implementation for perceptual quality with AV1, and it aims to surpass previous community forks of ",(0,n.jsx)(t.a,{href:"/docs/encoders/aomenc#choosing-forks",children:"aomenc"})," in speed and visual quality."]}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1-PSY has a number of feature additions to the mainline SVT-AV1 encoder as well as modified defaults that aim to make it easier to produce a more perceptually optimal bistream. For a full list of the encoder's feature additions and modifications to defaults, see the ",(0,n.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy/blob/master/README.md#feature-additions",children:"project's README"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},9365:(e,t,i)=>{i.d(t,{A:()=>o});i(6540);var n=i(4164);const s={tabItem:"tabItem_Ymn6"};var r=i(4848);function o(e){let{children:t,hidden:i,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,o),hidden:i,children:t})}},1470:(e,t,i)=>{i.d(t,{A:()=>j});var n=i(6540),s=i(4164),r=i(3104),o=i(6347),a=i(205),l=i(7485),c=i(1682),d=i(679);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:t,children:i}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:i,attributes:n,default:s}}=e;return{value:t,label:i,attributes:n,default:s}}))}(i);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function p(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:i}=e;const s=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(s.location.search);t.set(r,e),s.replace({...s.location,search:t.toString()})}),[r,s])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:s}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=i.find((e=>e.default))??i[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[c,h]=m({queryString:i,groupId:s}),[f,b]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,r]=(0,d.Dv)(i);return[s,(0,n.useCallback)((e=>{i&&r.set(e)}),[i,r])]}({groupId:s}),g=(()=>{const e=c??f;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{g&&l(g)}),[g]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),b(e)}),[h,b,r]),tabValues:r}}var b=i(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function v(e){let{className:t,block:i,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const t=e.currentTarget,i=l.indexOf(t),s=a[i].value;s!==n&&(c(t),o(s))},h=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":i},t),children:a.map((e=>{let{value:t,label:i,attributes:r}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===t}),children:i??t},t)}))})}function V(e){let{lazy:t,children:i,selectedValue:r}=e;const o=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function y(e){const t=f(e);return(0,x.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,x.jsx)(v,{...t,...e}),(0,x.jsx)(V,{...t,...e})]})}function j(e){const t=(0,b.A)();return(0,x.jsx)(y,{...e,children:h(e.children)},String(t))}},8453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>a});var n=i(6540);const s={},r=n.createContext(s);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c678320.27764c57.js b/assets/js/4c678320.27764c57.js deleted file mode 100644 index 8a90cc44f..000000000 --- a/assets/js/4c678320.27764c57.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9664],{2051:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=t(4848),a=t(8453);const r={title:"Markdown page example"},s="Markdown page example",c={type:"mdx",permalink:"/markdown-page",source:"@site/src/pages/markdown-page.mdx",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"},unlisted:!1},p={},d=[];function i(e){const n={h1:"h1",header:"header",p:"p",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,o.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var o=t(6540);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c678320.9f702fca.js b/assets/js/4c678320.9f702fca.js new file mode 100644 index 000000000..7754b1f2e --- /dev/null +++ b/assets/js/4c678320.9f702fca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9664],{4506:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"type":"mdx","permalink":"/markdown-page","source":"@site/src/pages/markdown-page.mdx","title":"Markdown page example","description":"You don\'t need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted":false}');var a=t(4848),r=t(8453);const s={title:"Markdown page example"},c="Markdown page example",p={},d=[];function i(e){const n={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,a.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(i,{...e})}):i(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var o=t(6540);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d877b09.678d5b0a.js b/assets/js/4d877b09.678d5b0a.js deleted file mode 100644 index 6bce6a80c..000000000 --- a/assets/js/4d877b09.678d5b0a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2150],{8493:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var t=n(4848),o=n(8453);const s={title:"QSV",sidebar_position:2},r="QSV",a={id:"encoders_hw/qsv",title:"QSV",description:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.",source:"@site/docs/encoders_hw/qsv.mdx",sourceDirName:"encoders_hw",slug:"/encoders_hw/qsv",permalink:"/docs/encoders_hw/qsv",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/qsv.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"QSV",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"NVENC",permalink:"/docs/encoders_hw/nvenc"},next:{title:"AMF",permalink:"/docs/encoders_hw/amf"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"qsv",children:"QSV"})}),"\n",(0,t.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,t.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,t.jsxs)(i.p,{children:["QSV (QuickSync Video) is Intel's hardware video encoding/decoding platform integrated into many of their modern CPUs with integrated graphics processors (iGPUs) & their Arc graphics cards. It allows applications to offload video encoding, decoding, and processing tasks to the dedicated media engines on Intel's dedicated multimedia hardware, often providing significant performance gains compared to CPU-based software encoding. QSV competes with similar frameworks like Nvidia's ",(0,t.jsx)(i.a,{href:"/docs/encoders_hw/nvenc",children:"NVENC"})," & AMD's ",(0,t.jsx)(i.a,{href:"/docs/encoders_hw/amf",children:"AMF"})," (Since the transition to Apple Silicon, QSV on Intel Macs competes with Apple's ",(0,t.jsx)(i.a,{href:"/docs/encoders_hw/videotoolbox",children:"VideoToolBox"})," on macOS devices)."]}),"\n",(0,t.jsx)(i.p,{children:"The key purpose of QSV is to accelerate video encoding, decoding, and processing workloads by leveraging specialized fixed-function hardware present in Intel's graphics processors. This dedicated hardware is distinct from the general-purpose compute units, and is designed specifically for multimedia tasks. QSV aims to deliver high encoding/decoding performance while operating efficiently."}),"\n",(0,t.jsxs)(i.p,{children:["QSV supports a wide range of video codecs including ",(0,t.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"})," , ",(0,t.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,t.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),", and more recently ",(0,t.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," on their latest discrete & integrated GPUs. A major advantage of QSV is that it is ubiquitous on most modern Intel CPUs with integrated graphics, making hardware-accelerated video encoding accessible across a wide range of systems. Applications can easily leverage QSV acceleration through APIs like Intel Media SDK, VA-API, or via integration with popular multimedia frameworks like ",(0,t.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),", GStreamer, & others."]}),"\n",(0,t.jsx)(i.p,{children:"Hardware-accelerated video encoding with QSV usually significantly improves encoding performance at low compression efficiency compared to software-based encoding solutions. It usually allows for higher-quality output at lower bitrates when encoding much faster than real time, such as at 60-200 fps. This is particularly beneficial for applications that require real-time encoding, such as live streaming, video conferencing, and game recording."}),"\n",(0,t.jsx)(i.p,{children:"While QSV is not designed for highly efficient offline file encoding, where quality is prioritized over speed. It is worth noting that QSV is almost always better than AMF from AMD & competitive with NVENC from Nvidia in terms of compression efficiency."})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>a});var t=n(6540);const o={},s=t.createContext(o);function r(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d877b09.a91cf442.js b/assets/js/4d877b09.a91cf442.js new file mode 100644 index 000000000..8f76e02b8 --- /dev/null +++ b/assets/js/4d877b09.a91cf442.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2150],{7905:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"encoders_hw/qsv","title":"QSV","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","source":"@site/docs/encoders_hw/qsv.mdx","sourceDirName":"encoders_hw","slug":"/encoders_hw/qsv","permalink":"/docs/encoders_hw/qsv","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/qsv.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"QSV","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"NVENC","permalink":"/docs/encoders_hw/nvenc"},"next":{"title":"AMF","permalink":"/docs/encoders_hw/amf"}}');var o=n(4848),s=n(8453);const r={title:"QSV",sidebar_position:2},a="QSV",c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"qsv",children:"QSV"})}),"\n",(0,o.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,o.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,o.jsxs)(i.p,{children:["QSV (QuickSync Video) is Intel's hardware video encoding/decoding platform integrated into many of their modern CPUs with integrated graphics processors (iGPUs) & their Arc graphics cards. It allows applications to offload video encoding, decoding, and processing tasks to the dedicated media engines on Intel's dedicated multimedia hardware, often providing significant performance gains compared to CPU-based software encoding. QSV competes with similar frameworks like Nvidia's ",(0,o.jsx)(i.a,{href:"/docs/encoders_hw/nvenc",children:"NVENC"})," & AMD's ",(0,o.jsx)(i.a,{href:"/docs/encoders_hw/amf",children:"AMF"})," (Since the transition to Apple Silicon, QSV on Intel Macs competes with Apple's ",(0,o.jsx)(i.a,{href:"/docs/encoders_hw/videotoolbox",children:"VideoToolBox"})," on macOS devices)."]}),"\n",(0,o.jsx)(i.p,{children:"The key purpose of QSV is to accelerate video encoding, decoding, and processing workloads by leveraging specialized fixed-function hardware present in Intel's graphics processors. This dedicated hardware is distinct from the general-purpose compute units, and is designed specifically for multimedia tasks. QSV aims to deliver high encoding/decoding performance while operating efficiently."}),"\n",(0,o.jsxs)(i.p,{children:["QSV supports a wide range of video codecs including ",(0,o.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"})," , ",(0,o.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,o.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),", and more recently ",(0,o.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," on their latest discrete & integrated GPUs. A major advantage of QSV is that it is ubiquitous on most modern Intel CPUs with integrated graphics, making hardware-accelerated video encoding accessible across a wide range of systems. Applications can easily leverage QSV acceleration through APIs like Intel Media SDK, VA-API, or via integration with popular multimedia frameworks like ",(0,o.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),", GStreamer, & others."]}),"\n",(0,o.jsx)(i.p,{children:"Hardware-accelerated video encoding with QSV usually significantly improves encoding performance at low compression efficiency compared to software-based encoding solutions. It usually allows for higher-quality output at lower bitrates when encoding much faster than real time, such as at 60-200 fps. This is particularly beneficial for applications that require real-time encoding, such as live streaming, video conferencing, and game recording."}),"\n",(0,o.jsx)(i.p,{children:"While QSV is not designed for highly efficient offline file encoding, where quality is prioritized over speed. It is worth noting that QSV is almost always better than AMF from AMD & competitive with NVENC from Nvidia in terms of compression efficiency."})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>a});var t=n(6540);const o={},s=t.createContext(o);function r(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/522a92e3.e4040f88.js b/assets/js/522a92e3.e4040f88.js new file mode 100644 index 000000000..b6389768f --- /dev/null +++ b/assets/js/522a92e3.e4040f88.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5220],{3317:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"encoders_hw/nvenc","title":"NVENC","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","source":"@site/docs/encoders_hw/nvenc.mdx","sourceDirName":"encoders_hw","slug":"/encoders_hw/nvenc","permalink":"/docs/encoders_hw/nvenc","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/nvenc.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"NVENC","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"uavs3e","permalink":"/docs/encoders/uavs3e"},"next":{"title":"QSV","permalink":"/docs/encoders_hw/qsv"}}');var t=i(4848),r=i(8453);const s={title:"NVENC",sidebar_position:1},a="NVENC",c={},d=[];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"nvenc",children:"NVENC"})}),"\n",(0,t.jsx)(n.admonition,{title:"Pending Review",type:"caution",children:(0,t.jsx)(n.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,t.jsxs)(n.p,{children:["NVENC for NVIDIA GPUs is a dedicated hardware video encoding engine integrated into NVIDIA's graphics processors. It allows applications to leverage dedicated multimedia encoding hardware to accelerate video encoding tasks, significantly improving performance when compared to CPU-based software encoding. It competes with similar frameworks like Intel's ",(0,t.jsx)(n.a,{href:"/docs/encoders_hw/qsv",children:"QSV"})," & AMD's ",(0,t.jsx)(n.a,{href:"/docs/encoders_hw/amf",children:"AMF"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"The primary purpose of NVENC is to offload the computationally intensive video encoding workloads from the CPU to the dedicated multimedia hardware on the GPU, thereby freeing up CPU resources for other tasks. This is particularly beneficial in scenarios where fast video encoding is required, such as screen recording, streaming, & video conferencing."}),"\n",(0,t.jsxs)(n.p,{children:["NVENC supports a range of popular video codecs, including ",(0,t.jsx)(n.a,{href:"/docs/video/AVC",children:"H.264"})," , ",(0,t.jsx)(n.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,t.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"}),", and more recently ",(0,t.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"})," on their latest GPUs. It provides hardware-accelerated encoding capabilities for these codecs, typically achieving real-time or faster than real-time encoding performance, depending on resolution, bitrate, and hardware capability."]}),"\n",(0,t.jsx)(n.p,{children:"While NVENC excels in encoding speed, it generally sacrifices some compression efficiency compared to modern high-quality CPU-based software encoders at slower presets."}),"\n",(0,t.jsxs)(n.p,{children:["NVENC is designed to be easily integrated into various multimedia frameworks and applications. It is supported by popular tools like ",(0,t.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),", OBS Studio, and others, allowing developers to seamlessly leverage GPU-accelerated encoding without the need for low-level programming."]}),"\n",(0,t.jsx)(n.p,{children:"When compared to AMD's AMF and Intel's QSV, NVENC is known for its high encoding performance, low latency, and broad compatibility with NVIDIA GPUs across different platforms. It is particularly popular among game streamers, content creators, and video professionals who require fast encoding speeds for their workflows. In terms of video compression efficiency, NVENC & QSV trade blows while AMF is generally left behind."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>a});var o=i(6540);const t={},r=o.createContext(t);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/522a92e3.f4ebdf35.js b/assets/js/522a92e3.f4ebdf35.js deleted file mode 100644 index 92178ae01..000000000 --- a/assets/js/522a92e3.f4ebdf35.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5220],{2191:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var o=i(4848),t=i(8453);const r={title:"NVENC",sidebar_position:1},s="NVENC",a={id:"encoders_hw/nvenc",title:"NVENC",description:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.",source:"@site/docs/encoders_hw/nvenc.mdx",sourceDirName:"encoders_hw",slug:"/encoders_hw/nvenc",permalink:"/docs/encoders_hw/nvenc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/nvenc.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"NVENC",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"uavs3e",permalink:"/docs/encoders/uavs3e"},next:{title:"QSV",permalink:"/docs/encoders_hw/qsv"}},c={},d=[];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"nvenc",children:"NVENC"})}),"\n",(0,o.jsx)(n.admonition,{title:"Pending Review",type:"caution",children:(0,o.jsx)(n.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,o.jsxs)(n.p,{children:["NVENC for NVIDIA GPUs is a dedicated hardware video encoding engine integrated into NVIDIA's graphics processors. It allows applications to leverage dedicated multimedia encoding hardware to accelerate video encoding tasks, significantly improving performance when compared to CPU-based software encoding. It competes with similar frameworks like Intel's ",(0,o.jsx)(n.a,{href:"/docs/encoders_hw/qsv",children:"QSV"})," & AMD's ",(0,o.jsx)(n.a,{href:"/docs/encoders_hw/amf",children:"AMF"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"The primary purpose of NVENC is to offload the computationally intensive video encoding workloads from the CPU to the dedicated multimedia hardware on the GPU, thereby freeing up CPU resources for other tasks. This is particularly beneficial in scenarios where fast video encoding is required, such as screen recording, streaming, & video conferencing."}),"\n",(0,o.jsxs)(n.p,{children:["NVENC supports a range of popular video codecs, including ",(0,o.jsx)(n.a,{href:"/docs/video/AVC",children:"H.264"})," , ",(0,o.jsx)(n.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,o.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"}),", and more recently ",(0,o.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"})," on their latest GPUs. It provides hardware-accelerated encoding capabilities for these codecs, typically achieving real-time or faster than real-time encoding performance, depending on resolution, bitrate, and hardware capability."]}),"\n",(0,o.jsx)(n.p,{children:"While NVENC excels in encoding speed, it generally sacrifices some compression efficiency compared to modern high-quality CPU-based software encoders at slower presets."}),"\n",(0,o.jsxs)(n.p,{children:["NVENC is designed to be easily integrated into various multimedia frameworks and applications. It is supported by popular tools like ",(0,o.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),", OBS Studio, and others, allowing developers to seamlessly leverage GPU-accelerated encoding without the need for low-level programming."]}),"\n",(0,o.jsx)(n.p,{children:"When compared to AMD's AMF and Intel's QSV, NVENC is known for its high encoding performance, low latency, and broad compatibility with NVIDIA GPUs across different platforms. It is particularly popular among game streamers, content creators, and video professionals who require fast encoding speeds for their workflows. In terms of video compression efficiency, NVENC & QSV trade blows while AMF is generally left behind."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>a});var o=i(6540);const t={},r=o.createContext(t);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/54a9c2bb.b8726434.js b/assets/js/54a9c2bb.b8726434.js deleted file mode 100644 index d0e71ab4a..000000000 --- a/assets/js/54a9c2bb.b8726434.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[561],{3633:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=t(4848),s=t(8453);const r={title:"YUView",sidebar_position:13},o="YUView",a={id:"utilities/YUView",title:"YUView",description:"YUView is a free and open source, cross-platform software developed by IENT (Institut f\xfcr Nachrichtentechnik) for working, playing, and analyzing YUV files.",source:"@site/docs/utilities/YUView.mdx",sourceDirName:"utilities",slug:"/utilities/YUView",permalink:"/docs/utilities/YUView",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/YUView.mdx",tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"YUView",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"MP4Box",permalink:"/docs/utilities/mp4box"},next:{title:"Discord",permalink:"/docs/utilities/Discord"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function h(e){const i={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"yuview",children:"YUView"})}),"\n",(0,n.jsxs)("picture",{children:[(0,n.jsx)("source",{srcset:"/img/yuview.avif",type:"image/avif"}),(0,n.jsx)("img",{src:"/img/yuview.webp",alt:"YUView Window"})]}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/IENT/YUView",children:"YUView"})," is a free and open source, cross-platform software developed by ",(0,n.jsx)(i.a,{href:"https://github.com/IENT/",children:"IENT"})," (Institut f\xfcr Nachrichtentechnik) for working, playing, and analyzing YUV files.\nThough it supports more than YUV thanks to FFmpeg and other third party decoders while providing a lot of options for ",(0,n.jsx)(i.a,{href:"/docs/video/HEVC",children:"HEVC"})," internal visualizations such as slice index and transform depth."]}),"\n",(0,n.jsx)(i.p,{children:"The software is built with QT and written in C++."}),"\n",(0,n.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(i.p,{children:["IENT provides the complete set of binaries for all major desktop operating systems on their GitHub ",(0,n.jsx)(i.a,{href:"https://github.com/IENT/YUView/releases/",children:"releases"}),". So pick and choose your OS there."]}),"\n",(0,n.jsxs)(i.p,{children:["For Linux, YUView is in the official repo on Ubuntu and the AUR (Arch User Repository) for Arch Linux. But they do provide an AppImage in their releases and a ",(0,n.jsx)(i.a,{href:"https://flathub.org/apps/de.rwth_aachen.ient.YUView",children:"Flatpak"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["For those who want to compile from source instead, they provided a tutorial ",(0,n.jsx)(i.a,{href:"https://github.com/IENT/YUView/wiki/Compile-YUView",children:"here"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(i.p,{children:'Open a file via the "File" > "Open File" tab on the top left or by pressing Ctrl + O, you may import multiple files. After that, you can start analyzing the file such as viewing motion vectors, isolating chroma to Cb for YCbCr, etc.'})]})}function d(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>a});var n=t(6540);const s={},r=n.createContext(s);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/54a9c2bb.c7a9d911.js b/assets/js/54a9c2bb.c7a9d911.js new file mode 100644 index 000000000..7a820d957 --- /dev/null +++ b/assets/js/54a9c2bb.c7a9d911.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[561],{6280:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"utilities/YUView","title":"YUView","description":"YUView is a free and open source, cross-platform software developed by IENT (Institut f\xfcr Nachrichtentechnik) for working, playing, and analyzing YUV files.","source":"@site/docs/utilities/YUView.mdx","sourceDirName":"utilities","slug":"/utilities/YUView","permalink":"/docs/utilities/YUView","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/YUView.mdx","tags":[],"version":"current","sidebarPosition":13,"frontMatter":{"title":"YUView","sidebar_position":13},"sidebar":"tutorialSidebar","previous":{"title":"MP4Box","permalink":"/docs/utilities/mp4box"},"next":{"title":"Discord","permalink":"/docs/utilities/Discord"}}');var s=t(4848),r=t(8453);const o={title:"YUView",sidebar_position:13},a="YUView",l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function h(e){const i={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"yuview",children:"YUView"})}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"/img/yuview.avif",type:"image/avif"}),(0,s.jsx)("img",{src:"/img/yuview.webp",alt:"YUView Window"})]}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.a,{href:"https://github.com/IENT/YUView",children:"YUView"})," is a free and open source, cross-platform software developed by ",(0,s.jsx)(i.a,{href:"https://github.com/IENT/",children:"IENT"})," (Institut f\xfcr Nachrichtentechnik) for working, playing, and analyzing YUV files.\nThough it supports more than YUV thanks to FFmpeg and other third party decoders while providing a lot of options for ",(0,s.jsx)(i.a,{href:"/docs/video/HEVC",children:"HEVC"})," internal visualizations such as slice index and transform depth."]}),"\n",(0,s.jsx)(i.p,{children:"The software is built with QT and written in C++."}),"\n",(0,s.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(i.p,{children:["IENT provides the complete set of binaries for all major desktop operating systems on their GitHub ",(0,s.jsx)(i.a,{href:"https://github.com/IENT/YUView/releases/",children:"releases"}),". So pick and choose your OS there."]}),"\n",(0,s.jsxs)(i.p,{children:["For Linux, YUView is in the official repo on Ubuntu and the AUR (Arch User Repository) for Arch Linux. But they do provide an AppImage in their releases and a ",(0,s.jsx)(i.a,{href:"https://flathub.org/apps/de.rwth_aachen.ient.YUView",children:"Flatpak"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["For those who want to compile from source instead, they provided a tutorial ",(0,s.jsx)(i.a,{href:"https://github.com/IENT/YUView/wiki/Compile-YUView",children:"here"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(i.p,{children:'Open a file via the "File" > "Open File" tab on the top left or by pressing Ctrl + O, you may import multiple files. After that, you can start analyzing the file such as viewing motion vectors, isolating chroma to Cb for YCbCr, etc.'})]})}function d(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>a});var n=t(6540);const s={},r=n.createContext(s);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/56786013.cc044280.js b/assets/js/56786013.cc044280.js new file mode 100644 index 000000000..286c3fa9f --- /dev/null +++ b/assets/js/56786013.cc044280.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8741],{1014:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"images/JPEG","title":"JPEG","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/images/JPEG.mdx","sourceDirName":"images","slug":"/images/JPEG","permalink":"/docs/images/JPEG","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"JPEG","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"tar","permalink":"/docs/data/tar"},"next":{"title":"PNG","permalink":"/docs/images/PNG"}}');var t=n(4848),o=n(8453);const r={title:"JPEG",sidebar_position:1},a="JPEG",c={},l=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Compression",id:"compression",level:2},{value:"Color Space Conversion",id:"color-space-conversion",level:4},{value:"Image Tiling",id:"image-tiling",level:4},{value:"Discrete Cosine Transform (DCT)",id:"discrete-cosine-transform-dct",level:4},{value:"Quantization",id:"quantization",level:4},{value:"Zigzag Scanning",id:"zigzag-scanning",level:4},{value:"Run-Length Encoding",id:"run-length-encoding",level:4},{value:"Entropy Encoding",id:"entropy-encoding",level:4},{value:"Saving the File",id:"saving-the-file",level:4},{value:"Decoding",id:"decoding",level:4}];function d(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"jpeg",children:"JPEG"})}),"\n",(0,t.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,t.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,t.jsx)(i.p,{children:"JPEG (Joint Photographic Experts Group) compression is a widely used method for reducing the size of digital images while preserving visual quality. It's based on the principles of lossy compression, which means that some image data is discarded to achieve a smaller filesize."}),"\n",(0,t.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,t.jsxs)(i.p,{children:["Lossless? ",(0,t.jsx)(i.em,{children:"No"})]}),"\n",(0,t.jsxs)(i.p,{children:["Lossy? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Supported Bit Depth:\n",(0,t.jsx)(i.em,{children:"8 BPC"})]}),"\n",(0,t.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,t.jsx)(i.em,{children:"Kinda"})]}),"\n",(0,t.jsxs)(i.p,{children:["Animation? ",(0,t.jsx)(i.em,{children:"No"})]}),"\n",(0,t.jsxs)(i.p,{children:["Transparency? ",(0,t.jsx)(i.em,{children:"No"})]}),"\n",(0,t.jsxs)(i.p,{children:["Progressive Decode? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Royalty Free? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsx)(i.h2,{id:"compression",children:"Compression"}),"\n",(0,t.jsx)(i.p,{children:"Learning how JPEG compresses images is immensely helpful for understanding how other compression methods work in other codecs. It is definitely worth reading to get a useful background in understanding concepts like entropy coding, the DCT, and color spaces other than RGB. Here's a step-by-step explanation of how JPEG compression works:"}),"\n",(0,t.jsx)(i.h4,{id:"color-space-conversion",children:"Color Space Conversion"}),"\n",(0,t.jsxs)(i.p,{children:["Most digital images are originally in the RGB (Red, Green, Blue) color space. The first step in JPEG compression is to convert the image to the YCbCr color space. Y represents the luminance (brightness), while Cb and Cr represent the chrominance (color information). The Cb & Cr components are subsampled to a quarter of the resolution of the original image, meaning the resulting color space is chroma subsampled with ",(0,t.jsx)(i.em,{children:"4:2:0"})," subsampling."]}),"\n",(0,t.jsx)(i.h4,{id:"image-tiling",children:"Image Tiling"}),"\n",(0,t.jsx)(i.p,{children:"The image is divided into smaller blocks or tiles, typically 8x8 pixels each. Each of these blocks will be processed separately."}),"\n",(0,t.jsx)(i.h4,{id:"discrete-cosine-transform-dct",children:"Discrete Cosine Transform (DCT)"}),"\n",(0,t.jsx)(i.p,{children:"For each 8x8 block, a mathematical transformation called the Discrete Cosine Transform is applied. This transformation converts the pixel values into a set of frequency components, taking spatial data and transforming it to the frequency domain. The DCT is applied to each color channel in the YCbCr color space. This algorithm is a particularly good choice for image (and music/speech) compression because it has high energy compaction relative to our understanding of images & their perceptual quality. High energy compaction means the DCT is able to represent a signal with a small number of significant coefficients, in this case mainly in the lower frequencies."}),"\n",(0,t.jsx)(i.h4,{id:"quantization",children:"Quantization"}),"\n",(0,t.jsx)(i.p,{children:'After the DCT, the frequencies are quantized in a table representing frequency coefficients & their corresponding frequencies. Less perceptually important details can be omitted to reduce filesize by discarding coefficients in the table that correspond to less visually salient frequencies. This is "lossy" compression, and is the key step in achieving a high compression ratio while still maintaining an image that looks reasonable. The quantization table used in this step can vary in the number of frequencies it attempts to retain, affecting the trade-off between compression & image quality.'}),"\n",(0,t.jsx)(i.h4,{id:"zigzag-scanning",children:"Zigzag Scanning"}),"\n",(0,t.jsx)(i.p,{children:"The quantized coefficients are then reordered using a zigzag pattern. This is done to prepare the data for the next step."}),"\n",(0,t.jsx)(i.h4,{id:"run-length-encoding",children:"Run-Length Encoding"}),"\n",(0,t.jsx)(i.p,{children:"The zigzag-ordered coefficients are run-length encoded. This means that sequences of zeroes are compressed into a shorter representation. For example, if there are many consecutive zeroes in the data, they can be represented as (0, 10) instead of listing ten individual zeroes."}),"\n",(0,t.jsx)(i.h4,{id:"entropy-encoding",children:"Entropy Encoding"}),"\n",(0,t.jsx)(i.p,{children:"The run-length encoded data is further compressed using entropy encoding. JPEG uses Huffman coding, which assigns shorter codes to more frequently occurring values in the table of DCT coefficients, reducing the overall file size."}),"\n",(0,t.jsx)(i.h4,{id:"saving-the-file",children:"Saving the File"}),"\n",(0,t.jsx)(i.p,{children:"The compressed luminance and chrominance data, along with information about color space conversion, quantization tables, and EXIF data, are saved in the JPEG file format."}),"\n",(0,t.jsx)(i.h4,{id:"decoding",children:"Decoding"}),"\n",(0,t.jsx)(i.p,{children:"When you open a JPEG image, the reverse process occurs. The file is decoded, and the DCT coefficients are dequantized, the inverse DCT is applied, and the image is converted back to the RGB color space to be displayed on a screen."}),"\n",(0,t.jsxs)(i.p,{children:["It's important to note that JPEG compression is ",(0,t.jsx)(i.em,{children:(0,t.jsx)(i.strong,{children:"lossy"})}),", meaning that some image quality is discarded in the pursuit of smaller file sizes. This makes it different than codecs designed for lossless compression like ",(0,t.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"}),", ",(0,t.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"}),"'s lossless mode, and ",(0,t.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),"'s lossless mode. The degree of compression and the quality of the compressed image can be adjusted through settings when saving a JPEG, allowing for a trade-off between file size & image fidelity."]}),"\n",(0,t.jsxs)(i.p,{children:["While JPEG is certainly not the most state of the art lossy image codec compared to its newer and (usually) better successors like ",(0,t.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"})," (an actual direct successor) & ",(0,t.jsx)(i.a,{href:"/docs/images/AVIF",children:"AVIF"}),", it enjoys near universal compatibility with (likely) most utilities you would work with in your everyday life that have anything to do with images."]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>a});var s=n(6540);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/56786013.f7d5bf56.js b/assets/js/56786013.f7d5bf56.js deleted file mode 100644 index 53facc3e7..000000000 --- a/assets/js/56786013.f7d5bf56.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8741],{3588:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var s=n(4848),t=n(8453);const o={title:"JPEG",sidebar_position:1},r="JPEG",a={id:"images/JPEG",title:"JPEG",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/images/JPEG.mdx",sourceDirName:"images",slug:"/images/JPEG",permalink:"/docs/images/JPEG",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"JPEG",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"tar",permalink:"/docs/data/tar"},next:{title:"PNG",permalink:"/docs/images/PNG"}},c={},l=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Compression",id:"compression",level:2},{value:"Color Space Conversion",id:"color-space-conversion",level:4},{value:"Image Tiling",id:"image-tiling",level:4},{value:"Discrete Cosine Transform (DCT)",id:"discrete-cosine-transform-dct",level:4},{value:"Quantization",id:"quantization",level:4},{value:"Zigzag Scanning",id:"zigzag-scanning",level:4},{value:"Run-Length Encoding",id:"run-length-encoding",level:4},{value:"Entropy Encoding",id:"entropy-encoding",level:4},{value:"Saving the File",id:"saving-the-file",level:4},{value:"Decoding",id:"decoding",level:4}];function d(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"jpeg",children:"JPEG"})}),"\n",(0,s.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,s.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,s.jsx)(i.p,{children:"JPEG (Joint Photographic Experts Group) compression is a widely used method for reducing the size of digital images while preserving visual quality. It's based on the principles of lossy compression, which means that some image data is discarded to achieve a smaller filesize."}),"\n",(0,s.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,s.jsxs)(i.p,{children:["Lossless? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Lossy? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Supported Bit Depth:\n",(0,s.jsx)(i.em,{children:"8 BPC"})]}),"\n",(0,s.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,s.jsx)(i.em,{children:"Kinda"})]}),"\n",(0,s.jsxs)(i.p,{children:["Animation? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Transparency? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Progressive Decode? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Royalty Free? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsx)(i.h2,{id:"compression",children:"Compression"}),"\n",(0,s.jsx)(i.p,{children:"Learning how JPEG compresses images is immensely helpful for understanding how other compression methods work in other codecs. It is definitely worth reading to get a useful background in understanding concepts like entropy coding, the DCT, and color spaces other than RGB. Here's a step-by-step explanation of how JPEG compression works:"}),"\n",(0,s.jsx)(i.h4,{id:"color-space-conversion",children:"Color Space Conversion"}),"\n",(0,s.jsxs)(i.p,{children:["Most digital images are originally in the RGB (Red, Green, Blue) color space. The first step in JPEG compression is to convert the image to the YCbCr color space. Y represents the luminance (brightness), while Cb and Cr represent the chrominance (color information). The Cb & Cr components are subsampled to a quarter of the resolution of the original image, meaning the resulting color space is chroma subsampled with ",(0,s.jsx)(i.em,{children:"4:2:0"})," subsampling."]}),"\n",(0,s.jsx)(i.h4,{id:"image-tiling",children:"Image Tiling"}),"\n",(0,s.jsx)(i.p,{children:"The image is divided into smaller blocks or tiles, typically 8x8 pixels each. Each of these blocks will be processed separately."}),"\n",(0,s.jsx)(i.h4,{id:"discrete-cosine-transform-dct",children:"Discrete Cosine Transform (DCT)"}),"\n",(0,s.jsx)(i.p,{children:"For each 8x8 block, a mathematical transformation called the Discrete Cosine Transform is applied. This transformation converts the pixel values into a set of frequency components, taking spatial data and transforming it to the frequency domain. The DCT is applied to each color channel in the YCbCr color space. This algorithm is a particularly good choice for image (and music/speech) compression because it has high energy compaction relative to our understanding of images & their perceptual quality. High energy compaction means the DCT is able to represent a signal with a small number of significant coefficients, in this case mainly in the lower frequencies."}),"\n",(0,s.jsx)(i.h4,{id:"quantization",children:"Quantization"}),"\n",(0,s.jsx)(i.p,{children:'After the DCT, the frequencies are quantized in a table representing frequency coefficients & their corresponding frequencies. Less perceptually important details can be omitted to reduce filesize by discarding coefficients in the table that correspond to less visually salient frequencies. This is "lossy" compression, and is the key step in achieving a high compression ratio while still maintaining an image that looks reasonable. The quantization table used in this step can vary in the number of frequencies it attempts to retain, affecting the trade-off between compression & image quality.'}),"\n",(0,s.jsx)(i.h4,{id:"zigzag-scanning",children:"Zigzag Scanning"}),"\n",(0,s.jsx)(i.p,{children:"The quantized coefficients are then reordered using a zigzag pattern. This is done to prepare the data for the next step."}),"\n",(0,s.jsx)(i.h4,{id:"run-length-encoding",children:"Run-Length Encoding"}),"\n",(0,s.jsx)(i.p,{children:"The zigzag-ordered coefficients are run-length encoded. This means that sequences of zeroes are compressed into a shorter representation. For example, if there are many consecutive zeroes in the data, they can be represented as (0, 10) instead of listing ten individual zeroes."}),"\n",(0,s.jsx)(i.h4,{id:"entropy-encoding",children:"Entropy Encoding"}),"\n",(0,s.jsx)(i.p,{children:"The run-length encoded data is further compressed using entropy encoding. JPEG uses Huffman coding, which assigns shorter codes to more frequently occurring values in the table of DCT coefficients, reducing the overall file size."}),"\n",(0,s.jsx)(i.h4,{id:"saving-the-file",children:"Saving the File"}),"\n",(0,s.jsx)(i.p,{children:"The compressed luminance and chrominance data, along with information about color space conversion, quantization tables, and EXIF data, are saved in the JPEG file format."}),"\n",(0,s.jsx)(i.h4,{id:"decoding",children:"Decoding"}),"\n",(0,s.jsx)(i.p,{children:"When you open a JPEG image, the reverse process occurs. The file is decoded, and the DCT coefficients are dequantized, the inverse DCT is applied, and the image is converted back to the RGB color space to be displayed on a screen."}),"\n",(0,s.jsxs)(i.p,{children:["It's important to note that JPEG compression is ",(0,s.jsx)(i.em,{children:(0,s.jsx)(i.strong,{children:"lossy"})}),", meaning that some image quality is discarded in the pursuit of smaller file sizes. This makes it different than codecs designed for lossless compression like ",(0,s.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"}),", ",(0,s.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"}),"'s lossless mode, and ",(0,s.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),"'s lossless mode. The degree of compression and the quality of the compressed image can be adjusted through settings when saving a JPEG, allowing for a trade-off between file size & image fidelity."]}),"\n",(0,s.jsxs)(i.p,{children:["While JPEG is certainly not the most state of the art lossy image codec compared to its newer and (usually) better successors like ",(0,s.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"})," (an actual direct successor) & ",(0,s.jsx)(i.a,{href:"/docs/images/AVIF",children:"AVIF"}),", it enjoys near universal compatibility with (likely) most utilities you would work with in your everyday life that have anything to do with images."]})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>a});var s=n(6540);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/59e6fde5.7808e7d7.js b/assets/js/59e6fde5.7808e7d7.js deleted file mode 100644 index 011d1b14e..000000000 --- a/assets/js/59e6fde5.7808e7d7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9724],{357:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>m});var o=i(4848),n=i(8453);const r={title:"AV1 for Dummies",description:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.",slug:"av1-for-dummies",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"},{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","compression"],image:"/img/av1_for_dummies_guide.jpg",hide_table_of_contents:!1},a=void 0,s={permalink:"/blog/av1-for-dummies",source:"@site/blog/2024-06-24-av1-for-dummies-2.mdx",title:"AV1 for Dummies",description:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.",date:"2024-06-24T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"}],readingTime:16.645,hasTruncateMarker:!0,authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4",key:null,page:null},{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4",key:null,page:null}],frontMatter:{title:"AV1 for Dummies",description:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.",slug:"av1-for-dummies",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"},{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","compression"],image:"/img/av1_for_dummies_guide.jpg",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Codec Wiki: One Year Later",permalink:"/blog/codec-wiki-one-year-later"},nextItem:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",permalink:"/blog/svt-av1-second-deep-dive"}},u={authorsImageUrls:[void 0,void 0]},m=[];function g(e){const t={p:"p",...(0,n.R)(),...e.components};return(0,o.jsx)(t.p,{children:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered."})}function c(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(g,{...e})}):g(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>s});var o=i(6540);const n={},r=o.createContext(n);function a(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/59e6fde5.f0729976.js b/assets/js/59e6fde5.f0729976.js new file mode 100644 index 000000000..0339dc669 --- /dev/null +++ b/assets/js/59e6fde5.f0729976.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9724],{357:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>c,frontMatter:()=>s,metadata:()=>o,toc:()=>m});var o=i(9543),n=i(4848),r=i(8453);const s={title:"AV1 for Dummies",description:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.",slug:"av1-for-dummies",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"},{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","compression"],image:"/img/av1_for_dummies_guide.jpg",hide_table_of_contents:!1},a=void 0,u={authorsImageUrls:[void 0,void 0]},m=[];function l(e){const t={p:"p",...(0,r.R)(),...e.components};return(0,n.jsx)(t.p,{children:"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered."})}function c(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var o=i(6540);const n={},r=o.createContext(n);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),o.createElement(r.Provider,{value:t},e.children)}},9543:e=>{e.exports=JSON.parse('{"permalink":"/blog/av1-for-dummies","source":"@site/blog/2024-06-24-av1-for-dummies-2.mdx","title":"AV1 for Dummies","description":"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you\'re on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.","date":"2024-06-24T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"}],"readingTime":16.645,"hasTruncateMarker":true,"authors":[{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4","socials":{},"key":null,"page":null},{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"AV1 for Dummies","description":"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you\'re on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.","slug":"av1-for-dummies","authors":[{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"},{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"}],"tags":["video","compression"],"image":"/img/av1_for_dummies_guide.jpg","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Codec Wiki: One Year Later","permalink":"/blog/codec-wiki-one-year-later"},"nextItem":{"title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","permalink":"/blog/svt-av1-second-deep-dive"}}')}}]); \ No newline at end of file diff --git a/assets/js/5b209502.05910955.js b/assets/js/5b209502.05910955.js deleted file mode 100644 index 611d4920b..000000000 --- a/assets/js/5b209502.05910955.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4176],{4296:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var n=i(4848),o=i(8453);const r={title:"Deinterlace",sidebar_position:5},c="Deinterlace",s={id:"filtering/deinterlace",title:"Deinterlace",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/deinterlace.mdx",sourceDirName:"filtering",slug:"/filtering/deinterlace",permalink:"/docs/filtering/deinterlace",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/deinterlace.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"Deinterlace",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Inverse Telecine",permalink:"/docs/filtering/ivtc"},next:{title:"Decombing",permalink:"/docs/filtering/decombing"}},a={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"deinterlace",children:"Deinterlace"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>c,x:()=>s});var n=i(6540);const o={},r=n.createContext(o);function c(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5b209502.143acbf3.js b/assets/js/5b209502.143acbf3.js new file mode 100644 index 000000000..1d48d780b --- /dev/null +++ b/assets/js/5b209502.143acbf3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4176],{5116:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"filtering/deinterlace","title":"Deinterlace","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/filtering/deinterlace.mdx","sourceDirName":"filtering","slug":"/filtering/deinterlace","permalink":"/docs/filtering/deinterlace","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/deinterlace.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"Deinterlace","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Inverse Telecine","permalink":"/docs/filtering/ivtc"},"next":{"title":"Decombing","permalink":"/docs/filtering/decombing"}}');var o=n(4848),r=n(8453);const c={title:"Deinterlace",sidebar_position:5},s="Deinterlace",a={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"deinterlace",children:"Deinterlace"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>s});var i=n(6540);const o={},r=i.createContext(o);function c(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5d1a7e8b.69e46796.js b/assets/js/5d1a7e8b.69e46796.js deleted file mode 100644 index e97ba5dcd..000000000 --- a/assets/js/5d1a7e8b.69e46796.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5936],{63:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var n=s(4848),t=s(8453);const o={title:"Video Players",sidebar_label:"\u25b6\ufe0f Video Players",sidebar_position:11},r="Video Players",a={id:"video-players",title:"Video Players",description:"Many different players exist for video, but here are a few recommended ones:",source:"@site/docs/video-players.mdx",sourceDirName:".",slug:"/video-players",permalink:"/docs/video-players",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video-players.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"Video Players",sidebar_label:"\u25b6\ufe0f Video Players",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Butteraugli",permalink:"/docs/metrics/butteraugli"},next:{title:"\ud83d\uddc3\ufe0f Resources",permalink:"/docs/resources"}},d={},l=[{value:"MPV",id:"mpv",level:2},{value:"VLC",id:"vlc",level:2},{value:"MPC-HC",id:"mpc-hc",level:2}];function c(e){const i={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"video-players",children:"Video Players"})}),"\n",(0,n.jsx)(i.p,{children:"Many different players exist for video, but here are a few recommended ones:"}),"\n",(0,n.jsx)(i.h2,{id:"mpv",children:"MPV"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"MPV"})," is a open source lightweight media player. It is intended as a command-line application, making it's user interface extremely minimal, however, many frontends exist for mpv, giving a more complete GUI, such as Celluloid and IINA. It has wide codec and container support."]}),"\n",(0,n.jsx)(i.p,{children:"TODO: MPV keyboard shorcuts"}),"\n",(0,n.jsx)(i.h2,{id:"vlc",children:"VLC"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"VLC"})," is an open source media player and toolkit. It supports almost all video and audio codecs in common use."]}),"\n",(0,n.jsxs)(i.p,{children:["Download instructions for VLC on all relevant platforms can be found at ",(0,n.jsx)(i.a,{href:"https://www.videolan.org/vlc/#download",children:"VideoLAN's website"})]}),"\n",(0,n.jsx)(i.h2,{id:"mpc-hc",children:"MPC-HC"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Media Player Classic - Home Cinema (MPC-HC)"})," is an open source media player designed exclusively for Windows 7, 8, 8.1, 10, 11 operating systems. Recognized for its simplicity and efficiency, MPC-HC provides users with a streamlined and user-friendly platform for playing a diverse range of audio and video file formats. Its lightweight design ensures smooth playback without taxing system resources. While the official development ceased in 2017, the community-driven MPC-HC on GitHub continues to provide updates and support."]}),"\n",(0,n.jsxs)(i.p,{children:["The latest un/stable builds of MPC-HC, maintained by the community, can be found on ",(0,n.jsx)(i.a,{href:"https://github.com/clsid2/mpc-hc/releases",children:"clsid2's MPC-HC repository"}),"."]})]})}function p(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var n=s(6540);const t={},o=n.createContext(t);function r(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5d1a7e8b.761e5644.js b/assets/js/5d1a7e8b.761e5644.js new file mode 100644 index 000000000..0329e7426 --- /dev/null +++ b/assets/js/5d1a7e8b.761e5644.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5936],{9300:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"video-players","title":"Video Players","description":"Many different players exist for video, but here are a few recommended ones:","source":"@site/docs/video-players.mdx","sourceDirName":".","slug":"/video-players","permalink":"/docs/video-players","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video-players.mdx","tags":[],"version":"current","sidebarPosition":11,"frontMatter":{"title":"Video Players","sidebar_label":"\u25b6\ufe0f Video Players","sidebar_position":11},"sidebar":"tutorialSidebar","previous":{"title":"Butteraugli","permalink":"/docs/metrics/butteraugli"},"next":{"title":"\ud83d\uddc3\ufe0f Resources","permalink":"/docs/resources"}}');var t=s(4848),o=s(8453);const r={title:"Video Players",sidebar_label:"\u25b6\ufe0f Video Players",sidebar_position:11},a="Video Players",d={},l=[{value:"MPV",id:"mpv",level:2},{value:"VLC",id:"vlc",level:2},{value:"MPC-HC",id:"mpc-hc",level:2}];function c(e){const i={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"video-players",children:"Video Players"})}),"\n",(0,t.jsx)(i.p,{children:"Many different players exist for video, but here are a few recommended ones:"}),"\n",(0,t.jsx)(i.h2,{id:"mpv",children:"MPV"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"MPV"})," is a open source lightweight media player. It is intended as a command-line application, making it's user interface extremely minimal, however, many frontends exist for mpv, giving a more complete GUI, such as Celluloid and IINA. It has wide codec and container support."]}),"\n",(0,t.jsx)(i.p,{children:"TODO: MPV keyboard shorcuts"}),"\n",(0,t.jsx)(i.h2,{id:"vlc",children:"VLC"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"VLC"})," is an open source media player and toolkit. It supports almost all video and audio codecs in common use."]}),"\n",(0,t.jsxs)(i.p,{children:["Download instructions for VLC on all relevant platforms can be found at ",(0,t.jsx)(i.a,{href:"https://www.videolan.org/vlc/#download",children:"VideoLAN's website"})]}),"\n",(0,t.jsx)(i.h2,{id:"mpc-hc",children:"MPC-HC"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"Media Player Classic - Home Cinema (MPC-HC)"})," is an open source media player designed exclusively for Windows 7, 8, 8.1, 10, 11 operating systems. Recognized for its simplicity and efficiency, MPC-HC provides users with a streamlined and user-friendly platform for playing a diverse range of audio and video file formats. Its lightweight design ensures smooth playback without taxing system resources. While the official development ceased in 2017, the community-driven MPC-HC on GitHub continues to provide updates and support."]}),"\n",(0,t.jsxs)(i.p,{children:["The latest un/stable builds of MPC-HC, maintained by the community, can be found on ",(0,t.jsx)(i.a,{href:"https://github.com/clsid2/mpc-hc/releases",children:"clsid2's MPC-HC repository"}),"."]})]})}function p(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var n=s(6540);const t={},o=n.createContext(t);function r(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5db6705b.a12c34f2.js b/assets/js/5db6705b.a12c34f2.js new file mode 100644 index 000000000..c543574df --- /dev/null +++ b/assets/js/5db6705b.a12c34f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1624],{5248:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"utilities/nmkoder","title":"NMKODER","description":"NMKODER is a free and open source, Windows-only GUI software developed by N00MKRAD. Built around FFmpeg, FFprobe, and Av1an","source":"@site/docs/utilities/nmkoder.mdx","sourceDirName":"utilities","slug":"/utilities/nmkoder","permalink":"/docs/utilities/nmkoder","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/nmkoder.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"NMKODER","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"rav1ator-cli","permalink":"/docs/utilities/rav1ator-cli"},"next":{"title":"FFMetrics","permalink":"/docs/utilities/FFMetrics"}}');var o=i(4848),r=i(8453);const s={title:"NMKODER",sidebar_position:7},a="NMKODER",l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"nmkoder",children:"NMKODER"})}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"/img/nmkoder.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"/img/nmkoder.webp",alt:"NMKODER Window"})]}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://github.com/n00mkrad/nmkoder",children:"NMKODER"})," is a free and open source, ",(0,o.jsx)(t.strong,{children:"Windows-only"})," GUI software developed by ",(0,o.jsx)(t.a,{href:"https://github.com/n00mkrad",children:"N00MKRAD"}),". Built around FFmpeg, FFprobe, and Av1an\nfor video encoding, muxing, and analysis such as concatenation, metrics calculation, and bitrate plotting. Though most people use this for the ",(0,o.jsx)(t.a,{href:"/docs/utilities/av1an",children:"Av1an"})," functionality."]}),"\n",(0,o.jsx)(t.p,{children:"The software is written in C# and built with WinForms."}),"\n",(0,o.jsx)(t.admonition,{title:"Abandonware",type:"danger",children:(0,o.jsx)(t.p,{children:'NMKODER have not been updated for years, it is not recommended to use this. But you can attempt to replace the provided binaries (aomenc.exe, etc) with new ones to technically "update" this.'})}),"\n",(0,o.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(t.p,{children:["You can download it from the GitHub ",(0,o.jsx)(t.a,{href:"https://github.com/n00mkrad/nmkoder/releases",children:"releases"})," page (the 7z file). Extract it to wherever after it's finished downloading, open the folder, and click the exe file."]}),"\n",(0,o.jsx)(t.p,{children:"The entire software is portable, so you can share the folder with anyone and they'll have no problem with running it."}),"\n",(0,o.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(t.p,{children:"NMKODER is really straightforward to use and consists of multiple tabs for each functionality. There is a drop zone on the left for drag-and-drop video files."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:'"File List" is for imported files.'}),"\n",(0,o.jsx)(t.li,{children:'"Track List" is for A/V tracks.'}),"\n",(0,o.jsx)(t.li,{children:'"Quick Convert" tab is for conversion with FFmpeg.'}),"\n",(0,o.jsx)(t.li,{children:'"AV1AN" is what it exactly says.'}),"\n",(0,o.jsx)(t.li,{children:'"Utilities" is for helpful tools such as colorspace/HDR metadata transferring, metric calculation, etc.'}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:'After configuring everything, click on the "Start" button to start encoding.'})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5db6705b.ec6b9e18.js b/assets/js/5db6705b.ec6b9e18.js deleted file mode 100644 index a305e4b7e..000000000 --- a/assets/js/5db6705b.ec6b9e18.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1624],{9828:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=i(4848),o=i(8453);const r={title:"NMKODER",sidebar_position:7},s="NMKODER",a={id:"utilities/nmkoder",title:"NMKODER",description:"NMKODER is a free and open source, Windows-only GUI software developed by N00MKRAD. Built around FFmpeg, FFprobe, and Av1an",source:"@site/docs/utilities/nmkoder.mdx",sourceDirName:"utilities",slug:"/utilities/nmkoder",permalink:"/docs/utilities/nmkoder",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/nmkoder.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"NMKODER",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"rav1ator-cli",permalink:"/docs/utilities/rav1ator-cli"},next:{title:"FFMetrics",permalink:"/docs/utilities/FFMetrics"}},l={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function c(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"nmkoder",children:"NMKODER"})}),"\n",(0,n.jsxs)("picture",{children:[(0,n.jsx)("source",{srcset:"/img/nmkoder.avif",type:"image/avif"}),(0,n.jsx)("img",{src:"/img/nmkoder.webp",alt:"NMKODER Window"})]}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/n00mkrad/nmkoder",children:"NMKODER"})," is a free and open source, ",(0,n.jsx)(t.strong,{children:"Windows-only"})," GUI software developed by ",(0,n.jsx)(t.a,{href:"https://github.com/n00mkrad",children:"N00MKRAD"}),". Built around FFmpeg, FFprobe, and Av1an\nfor video encoding, muxing, and analysis such as concatenation, metrics calculation, and bitrate plotting. Though most people use this for the ",(0,n.jsx)(t.a,{href:"/docs/utilities/av1an",children:"Av1an"})," functionality."]}),"\n",(0,n.jsx)(t.p,{children:"The software is written in C# and built with WinForms."}),"\n",(0,n.jsx)(t.admonition,{title:"Abandonware",type:"danger",children:(0,n.jsx)(t.p,{children:'NMKODER have not been updated for years, it is not recommended to use this. But you can attempt to replace the provided binaries (aomenc.exe, etc) with new ones to technically "update" this.'})}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(t.p,{children:["You can download it from the GitHub ",(0,n.jsx)(t.a,{href:"https://github.com/n00mkrad/nmkoder/releases",children:"releases"})," page (the 7z file). Extract it to wherever after it's finished downloading, open the folder, and click the exe file."]}),"\n",(0,n.jsx)(t.p,{children:"The entire software is portable, so you can share the folder with anyone and they'll have no problem with running it."}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"NMKODER is really straightforward to use and consists of multiple tabs for each functionality. There is a drop zone on the left for drag-and-drop video files."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:'"File List" is for imported files.'}),"\n",(0,n.jsx)(t.li,{children:'"Track List" is for A/V tracks.'}),"\n",(0,n.jsx)(t.li,{children:'"Quick Convert" tab is for conversion with FFmpeg.'}),"\n",(0,n.jsx)(t.li,{children:'"AV1AN" is what it exactly says.'}),"\n",(0,n.jsx)(t.li,{children:'"Utilities" is for helpful tools such as colorspace/HDR metadata transferring, metric calculation, etc.'}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:'After configuring everything, click on the "Start" button to start encoding.'})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e069031.36e9153e.js b/assets/js/5e069031.36e9153e.js new file mode 100644 index 000000000..83eb9e2e9 --- /dev/null +++ b/assets/js/5e069031.36e9153e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5968],{4347:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"introduction/prologue","title":"Prologue","description":"Multimedia compression as a whole has revolutionized our ability to communicate on the Web & beyond. It has enabled rich experiences across many breakthrough platforms that wouldn\'t have been feasible otherwise, and it has allowed us to communicate information, expression, and human connection in novel ways. It is the unsung hero of the modern Web. Despite this, it is often difficult to uncover information about codec technology that is accurate, informed, and battle-tested by passionate individuals who care about the proliferation of knowledge. This wiki aims to demystify the realm of multimedia compression while connecting codec enthusiasts to create a sink of knowledge for the benefit of everyone.","source":"@site/docs/introduction/prologue.mdx","sourceDirName":"introduction","slug":"/introduction/prologue","permalink":"/docs/introduction/prologue","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/prologue.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Prologue","sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Terminology","permalink":"/docs/introduction/terminology"}}');var s=o(4848),n=o(8453);const a={title:"Prologue",sidebar_position:1},r="Prologue",d={},c=[{value:"What This Isn't",id:"what-this-isnt",level:3},{value:"What is a Codec",id:"what-is-a-codec",level:3},{value:"What You Need",id:"what-you-need",level:3}];function l(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"prologue",children:"Prologue"})}),"\n",(0,s.jsx)(i.p,{children:"Multimedia compression as a whole has revolutionized our ability to communicate on the Web & beyond. It has enabled rich experiences across many breakthrough platforms that wouldn't have been feasible otherwise, and it has allowed us to communicate information, expression, and human connection in novel ways. It is the unsung hero of the modern Web. Despite this, it is often difficult to uncover information about codec technology that is accurate, informed, and battle-tested by passionate individuals who care about the proliferation of knowledge. This wiki aims to demystify the realm of multimedia compression while connecting codec enthusiasts to create a sink of knowledge for the benefit of everyone."}),"\n",(0,s.jsx)(i.h3,{id:"what-this-isnt",children:"What This Isn't"}),"\n",(0,s.jsxs)(i.p,{children:["The Codec Wiki is ",(0,s.jsx)(i.strong,{children:"not a highly accurate source for understanding the mathematics, research, adoption/patent politics, or specifications of specific coder/decoder implementations"}),". Sources like Wikipedia cover these details with great accuracy & reliability. What we ",(0,s.jsx)(i.em,{children:"are"})," focused on is making higher level information - especially related to the usage & application of compression tools - highly accessible; we are focused on application, not theory, for the time being. Knowing how a codec works in theory is different than knowing when and how to best use a codec and its accompanying tools."]}),"\n",(0,s.jsx)(i.h3,{id:"what-is-a-codec",children:"What is a Codec"}),"\n",(0,s.jsxs)(i.p,{children:["A codec, shortened from coder/decoder, is a system that handles digital media or data according to a specification. Usually, this means it compresses and decompresses digital media. Codecs are used to encode media for storage and transmission - among other things - and then decode that media for playback, editing, etc. Multimedia codecs compress by either ",(0,s.jsx)(i.a,{href:"/docs/introduction/psychovisual",children:"discarding less salient data"})," using ",(0,s.jsx)(i.a,{href:"/docs/introduction/video-artifacts",children:"lossy"})," compression to reduce filesize, or they use clever lossless compression tricks to maintain a mathematically identical stream to the input media while still reducing filesize. Lossless compression can be reversed to be the exact same as the input data, while lossy compression does not share this quality as it discards data for smaller filesizes. Some common uses of codecs include:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Video compression: Video codecs like ",(0,s.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,s.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,s.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," allow digital video files to be compressed to much smaller sizes for streaming & storage, among other things. A video codec can encode a video stream while it is being recorded or before it is distributed, and decode it when it is played back. This allows videos to be shared more quickly and use less storage & bandwidth."]}),"\n",(0,s.jsxs)(i.li,{children:["Audio compression: Audio codecs like ",(0,s.jsx)(i.a,{href:"/docs/audio/MP3",children:"MP3"}),", ",(0,s.jsx)(i.a,{href:"/docs/audio/AAC",children:"AAC"}),", and ",(0,s.jsx)(i.a,{href:"/docs/audio/Opus",children:"Opus"})," compress audio files like songs & podcasts. This allows them to be easily distributed & stored."]}),"\n",(0,s.jsxs)(i.li,{children:["Image Compression: Image codecs, whether tried and true like ",(0,s.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"})," or brand new like ",(0,s.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),", have fundamentally the same goal: compress images well while maintaining a versatile featureset for the myriad of ways one may decide they'd like to compress an image. Color depth, HDR, transparency, color space information, EXIF data, and many other factors are at play when working with images that make compressing them easier said than done."]}),"\n",(0,s.jsxs)(i.li,{children:["Data Compression: General compression algorithms like ",(0,s.jsx)(i.a,{href:"/docs/data/zip",children:"ZIP"})," & ",(0,s.jsx)(i.a,{href:"/docs/data/zstd",children:"zstd"})," are designed to compress ",(0,s.jsx)(i.em,{children:"any"})," kind of data, not just multimedia specific data. This includes web assets, executables, text archives, and even entire filesystems."]}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["In summary, ",(0,s.jsx)(i.strong,{children:"codecs use complex algorithms to encode and decode media for efficient storage and transmission"}),". They are essential for recording, compressing, delivering and playing back digital media. Different codecs balance factors like compression efficiency, quality, computational requirements, compatibility, & features depending on their application."]}),"\n",(0,s.jsx)(i.h3,{id:"what-you-need",children:"What You Need"}),"\n",(0,s.jsx)(i.p,{children:"A rather informal list of requirements follows."}),"\n",(0,s.jsx)(i.p,{children:"You will benefit greatly from:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Patience."}),"\n",(0,s.jsx)(i.li,{children:"A willingness to learn, engage in curiousity, & follow instructions"}),"\n",(0,s.jsx)(i.li,{children:"Basic to intermediate computer proficiency."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"If you're only here to learn the tools, it will be very beneficial to have:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Higher-end CPU hardware, which will decrease wait times for some larger encoding workloads discussed here."}),"\n",(0,s.jsx)(i.li,{children:"A level of comfort with CLI utilities, or enough motivation to engage with them in the absence of background knowledge."}),"\n",(0,s.jsx)(i.li,{children:"A device running an Arch-based Linux distribution, excluding Manjaro"}),"\n"]}),"\n",(0,s.jsx)(i.admonition,{title:"Why Arch?",type:"info",children:(0,s.jsxs)(i.p,{children:["Most encoding tools are readily available in the package manager, & it is a bleeding edge Linux distribution which ensures your utilities are always kept up to date. For filtering, all Vapoursynth plugins are already available in the Arch User Repository (AUR) which makes it extremely easy to install and version control with an AUR helper ",(0,s.jsxs)(i.a,{href:"https://github.com/Jguer/yay",children:["like ",(0,s.jsx)(i.code,{children:"yay"})]})]})})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>a,x:()=>r});var t=o(6540);const s={},n=t.createContext(s);function a(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e069031.5d8abc53.js b/assets/js/5e069031.5d8abc53.js deleted file mode 100644 index 019786a2f..000000000 --- a/assets/js/5e069031.5d8abc53.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5968],{9483:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var t=o(4848),n=o(8453);const s={title:"Prologue",sidebar_position:1},a="Prologue",r={id:"introduction/prologue",title:"Prologue",description:"Multimedia compression as a whole has revolutionized our ability to communicate on the Web & beyond. It has enabled rich experiences across many breakthrough platforms that wouldn't have been feasible otherwise, and it has allowed us to communicate information, expression, and human connection in novel ways. It is the unsung hero of the modern Web. Despite this, it is often difficult to uncover information about codec technology that is accurate, informed, and battle-tested by passionate individuals who care about the proliferation of knowledge. This wiki aims to demystify the realm of multimedia compression while connecting codec enthusiasts to create a sink of knowledge for the benefit of everyone.",source:"@site/docs/introduction/prologue.mdx",sourceDirName:"introduction",slug:"/introduction/prologue",permalink:"/docs/introduction/prologue",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/prologue.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Prologue",sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Terminology",permalink:"/docs/introduction/terminology"}},d={},c=[{value:"What This Isn't",id:"what-this-isnt",level:3},{value:"What is a Codec",id:"what-is-a-codec",level:3},{value:"What You Need",id:"what-you-need",level:3}];function l(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"prologue",children:"Prologue"})}),"\n",(0,t.jsx)(i.p,{children:"Multimedia compression as a whole has revolutionized our ability to communicate on the Web & beyond. It has enabled rich experiences across many breakthrough platforms that wouldn't have been feasible otherwise, and it has allowed us to communicate information, expression, and human connection in novel ways. It is the unsung hero of the modern Web. Despite this, it is often difficult to uncover information about codec technology that is accurate, informed, and battle-tested by passionate individuals who care about the proliferation of knowledge. This wiki aims to demystify the realm of multimedia compression while connecting codec enthusiasts to create a sink of knowledge for the benefit of everyone."}),"\n",(0,t.jsx)(i.h3,{id:"what-this-isnt",children:"What This Isn't"}),"\n",(0,t.jsxs)(i.p,{children:["The Codec Wiki is ",(0,t.jsx)(i.strong,{children:"not a highly accurate source for understanding the mathematics, research, adoption/patent politics, or specifications of specific coder/decoder implementations"}),". Sources like Wikipedia cover these details with great accuracy & reliability. What we ",(0,t.jsx)(i.em,{children:"are"})," focused on is making higher level information - especially related to the usage & application of compression tools - highly accessible; we are focused on application, not theory, for the time being. Knowing how a codec works in theory is different than knowing when and how to best use a codec and its accompanying tools."]}),"\n",(0,t.jsx)(i.h3,{id:"what-is-a-codec",children:"What is a Codec"}),"\n",(0,t.jsxs)(i.p,{children:["A codec, shortened from coder/decoder, is a system that handles digital media or data according to a specification. Usually, this means it compresses and decompresses digital media. Codecs are used to encode media for storage and transmission - among other things - and then decode that media for playback, editing, etc. Multimedia codecs compress by either ",(0,t.jsx)(i.a,{href:"/docs/introduction/psychovisual",children:"discarding less salient data"})," using ",(0,t.jsx)(i.a,{href:"/docs/introduction/video-artifacts",children:"lossy"})," compression to reduce filesize, or they use clever lossless compression tricks to maintain a mathematically identical stream to the input media while still reducing filesize. Lossless compression can be reversed to be the exact same as the input data, while lossy compression does not share this quality as it discards data for smaller filesizes. Some common uses of codecs include:"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Video compression: Video codecs like ",(0,t.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,t.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,t.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," allow digital video files to be compressed to much smaller sizes for streaming & storage, among other things. A video codec can encode a video stream while it is being recorded or before it is distributed, and decode it when it is played back. This allows videos to be shared more quickly and use less storage & bandwidth."]}),"\n",(0,t.jsxs)(i.li,{children:["Audio compression: Audio codecs like ",(0,t.jsx)(i.a,{href:"/docs/audio/MP3",children:"MP3"}),", ",(0,t.jsx)(i.a,{href:"/docs/audio/AAC",children:"AAC"}),", and ",(0,t.jsx)(i.a,{href:"/docs/audio/Opus",children:"Opus"})," compress audio files like songs & podcasts. This allows them to be easily distributed & stored."]}),"\n",(0,t.jsxs)(i.li,{children:["Image Compression: Image codecs, whether tried and true like ",(0,t.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"})," or brand new like ",(0,t.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),", have fundamentally the same goal: compress images well while maintaining a versatile featureset for the myriad of ways one may decide they'd like to compress an image. Color depth, HDR, transparency, color space information, EXIF data, and many other factors are at play when working with images that make compressing them easier said than done."]}),"\n",(0,t.jsxs)(i.li,{children:["Data Compression: General compression algorithms like ",(0,t.jsx)(i.a,{href:"/docs/data/zip",children:"ZIP"})," & ",(0,t.jsx)(i.a,{href:"/docs/data/zstd",children:"zstd"})," are designed to compress ",(0,t.jsx)(i.em,{children:"any"})," kind of data, not just multimedia specific data. This includes web assets, executables, text archives, and even entire filesystems."]}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["In summary, ",(0,t.jsx)(i.strong,{children:"codecs use complex algorithms to encode and decode media for efficient storage and transmission"}),". They are essential for recording, compressing, delivering and playing back digital media. Different codecs balance factors like compression efficiency, quality, computational requirements, compatibility, & features depending on their application."]}),"\n",(0,t.jsx)(i.h3,{id:"what-you-need",children:"What You Need"}),"\n",(0,t.jsx)(i.p,{children:"A rather informal list of requirements follows."}),"\n",(0,t.jsx)(i.p,{children:"You will benefit greatly from:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Patience."}),"\n",(0,t.jsx)(i.li,{children:"A willingness to learn, engage in curiousity, & follow instructions"}),"\n",(0,t.jsx)(i.li,{children:"Basic to intermediate computer proficiency."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"If you're only here to learn the tools, it will be very beneficial to have:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Higher-end CPU hardware, which will decrease wait times for some larger encoding workloads discussed here."}),"\n",(0,t.jsx)(i.li,{children:"A level of comfort with CLI utilities, or enough motivation to engage with them in the absence of background knowledge."}),"\n",(0,t.jsx)(i.li,{children:"A device running an Arch-based Linux distribution, excluding Manjaro"}),"\n"]}),"\n",(0,t.jsx)(i.admonition,{title:"Why Arch?",type:"info",children:(0,t.jsxs)(i.p,{children:["Most encoding tools are readily available in the package manager, & it is a bleeding edge Linux distribution which ensures your utilities are always kept up to date. For filtering, all Vapoursynth plugins are already available in the Arch User Repository (AUR) which makes it extremely easy to install and version control with an AUR helper ",(0,t.jsxs)(i.a,{href:"https://github.com/Jguer/yay",children:["like ",(0,t.jsx)(i.code,{children:"yay"})]})]})})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>a,x:()=>r});var t=o(6540);const n={},s=t.createContext(n);function a(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e1194df.03677b01.js b/assets/js/5e1194df.03677b01.js deleted file mode 100644 index a7be0e26f..000000000 --- a/assets/js/5e1194df.03677b01.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4822],{5160:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=i(4848),n=i(8453);const s={title:"zpaq",sidebar_position:7},a="ZPAQ",r={id:"data/zpaq",title:"zpaq",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/zpaq.mdx",sourceDirName:"data",slug:"/data/zpaq",permalink:"/docs/data/zpaq",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zpaq.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"zpaq",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"brotli",permalink:"/docs/data/brotli"},next:{title:"zstd",permalink:"/docs/data/zstd"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"zpaq",children:"ZPAQ"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(t.p,{children:"ZPAQ is a lossless data compression algorithm that combines several techniques to achieve high compression ratios. It was developed by Matt Mahoney."}),"\n",(0,o.jsx)(t.p,{children:'ZPAQ uses a multitude of different compression algorithms to try to achieve the best size-to-compression-time ratio possible while producing the smallest possible archives without much concern given to decompression performance. On the official ZPAQ website, it looks like it is designed for "realistic backups that have a lot of duplicate files and a lot of already compressed files."'}),"\n",(0,o.jsx)(t.p,{children:'ZPAQ is also considered an "incremental journaling archiver" meaning you can add files to an existing archive based on if they were changed or not. This reduces the time needed to wait for a new backup to finish, if that is your use case. Since ZPAQ is so focused on compression ratio, this kind of feature may reduce the burden imposed by long compression times in practical use cases where it makes sense. Windows & macOS do not handle ZPAQ archives properly by default, and it is unlikely many Linux distros do either.'})]})}function u(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var o=i(6540);const n={},s=o.createContext(n);function a(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e1194df.0c61c810.js b/assets/js/5e1194df.0c61c810.js new file mode 100644 index 000000000..d554c3c5c --- /dev/null +++ b/assets/js/5e1194df.0c61c810.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4822],{1235:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"data/zpaq","title":"zpaq","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/data/zpaq.mdx","sourceDirName":"data","slug":"/data/zpaq","permalink":"/docs/data/zpaq","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zpaq.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"zpaq","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"brotli","permalink":"/docs/data/brotli"},"next":{"title":"zstd","permalink":"/docs/data/zstd"}}');var n=i(4848),s=i(8453);const a={title:"zpaq",sidebar_position:7},r="ZPAQ",c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"zpaq",children:"ZPAQ"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsx)(t.p,{children:"ZPAQ is a lossless data compression algorithm that combines several techniques to achieve high compression ratios. It was developed by Matt Mahoney."}),"\n",(0,n.jsx)(t.p,{children:'ZPAQ uses a multitude of different compression algorithms to try to achieve the best size-to-compression-time ratio possible while producing the smallest possible archives without much concern given to decompression performance. On the official ZPAQ website, it looks like it is designed for "realistic backups that have a lot of duplicate files and a lot of already compressed files."'}),"\n",(0,n.jsx)(t.p,{children:'ZPAQ is also considered an "incremental journaling archiver" meaning you can add files to an existing archive based on if they were changed or not. This reduces the time needed to wait for a new backup to finish, if that is your use case. Since ZPAQ is so focused on compression ratio, this kind of feature may reduce the burden imposed by long compression times in practical use cases where it makes sense. Windows & macOS do not handle ZPAQ archives properly by default, and it is unlikely many Linux distros do either.'})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var o=i(6540);const n={},s=o.createContext(n);function a(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.15681440.js b/assets/js/5e95c892.15681440.js new file mode 100644 index 000000000..63b3f3cc2 --- /dev/null +++ b/assets/js/5e95c892.15681440.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9647],{7121:(e,c,s)=>{s.r(c),s.d(c,{default:()=>t});s(6540);var r=s(4164),u=s(1213),a=s(7559),i=s(2831),d=s(7823),n=s(4848);function t(e){return(0,n.jsx)(u.e3,{className:(0,r.A)(a.G.wrapper.docsPages),children:(0,n.jsx)(d.A,{children:(0,i.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.7ef37dfe.js b/assets/js/5e95c892.7ef37dfe.js deleted file mode 100644 index 6219fe143..000000000 --- a/assets/js/5e95c892.7ef37dfe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9647],{7121:(e,c,s)=>{s.r(c),s.d(c,{default:()=>t});s(6540);var r=s(4164),u=s(1213),a=s(7559),i=s(2831),d=s(263),n=s(4848);function t(e){return(0,n.jsx)(u.e3,{className:(0,r.A)(a.G.wrapper.docsPages),children:(0,n.jsx)(d.A,{children:(0,i.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5ec46d54.267e3e91.js b/assets/js/5ec46d54.267e3e91.js new file mode 100644 index 000000000..8a8360a7d --- /dev/null +++ b/assets/js/5ec46d54.267e3e91.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1481],{4419:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"video/ECM","title":"ECM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/ECM.mdx","sourceDirName":"video","slug":"/video/ECM","permalink":"/docs/video/ECM","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/ECM.mdx","tags":[],"version":"current","sidebarPosition":15,"frontMatter":{"title":"ECM","sidebar_position":15},"sidebar":"tutorialSidebar","previous":{"title":"ProRes","permalink":"/docs/video/prores"},"next":{"title":"ZIP","permalink":"/docs/data/zip"}}');var i=o(4848),r=o(8453);const s={title:"ECM",sidebar_position:15},d="ECM",c={},a=[];function u(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"ecm",children:"ECM"})}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(t.p,{children:["ECM (Enhanced Compression Model) is a video codec developed by the Fraunhofer Heinrich-Hertz-Institute. It is purportedly designed to succeed H.266, or ",(0,i.jsx)(t.a,{href:"/docs/video/VVC",children:"VVC"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.a,{href:"https://vcgit.hhi.fraunhofer.de/ecm/ECM",children:"Git repo"})," provides a bit more information:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-md",children:"# ECM reference software\n\nThis software package is the reference software for Enhanced Compression Model (ECM). The reference software includes both encoder and decoder functionality.\nReference software is useful in aiding users of a video coding standard to establish and test conformance and interoperability, and to educate users and demonstrate the capabilities of the test model.\nThe software has been jointly developed by the ITU-T Video Coding Experts Group (VCEG, Question 6 of ITU-T Study Group 16) and the ISO/IEC Moving Picture Experts Group (MPEG, Working Group 11 of Subcommittee 29 of ISO/IEC Joint Technical Committee 1).\n"})}),"\n",(0,i.jsx)(t.p,{children:"Other than this generic overview, build instructions are provided in the repo's README. Not much else is known about ECM besides the fact that it will likely become H.267."})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>d});var n=o(6540);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5ec46d54.e5f80521.js b/assets/js/5ec46d54.e5f80521.js deleted file mode 100644 index 4f299c929..000000000 --- a/assets/js/5ec46d54.e5f80521.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1481],{2886:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var n=o(4848),i=o(8453);const r={title:"ECM",sidebar_position:15},s="ECM",d={id:"video/ECM",title:"ECM",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/ECM.mdx",sourceDirName:"video",slug:"/video/ECM",permalink:"/docs/video/ECM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/ECM.mdx",tags:[],version:"current",sidebarPosition:15,frontMatter:{title:"ECM",sidebar_position:15},sidebar:"tutorialSidebar",previous:{title:"ProRes",permalink:"/docs/video/prores"},next:{title:"ZIP",permalink:"/docs/data/zip"}},c={},a=[];function u(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"ecm",children:"ECM"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(t.p,{children:["ECM (Enhanced Compression Model) is a video codec developed by the Fraunhofer Heinrich-Hertz-Institute. It is purportedly designed to succeed H.266, or ",(0,n.jsx)(t.a,{href:"/docs/video/VVC",children:"VVC"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.a,{href:"https://vcgit.hhi.fraunhofer.de/ecm/ECM",children:"Git repo"})," provides a bit more information:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-md",children:"# ECM reference software\n\nThis software package is the reference software for Enhanced Compression Model (ECM). The reference software includes both encoder and decoder functionality.\nReference software is useful in aiding users of a video coding standard to establish and test conformance and interoperability, and to educate users and demonstrate the capabilities of the test model.\nThe software has been jointly developed by the ITU-T Video Coding Experts Group (VCEG, Question 6 of ITU-T Study Group 16) and the ISO/IEC Moving Picture Experts Group (MPEG, Working Group 11 of Subcommittee 29 of ISO/IEC Joint Technical Committee 1).\n"})}),"\n",(0,n.jsx)(t.p,{children:"Other than this generic overview, build instructions are provided in the repo's README. Not much else is known about ECM besides the fact that it will likely become H.267."})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>d});var n=o(6540);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5f74c797.5a891c89.js b/assets/js/5f74c797.5a891c89.js deleted file mode 100644 index eaef682c5..000000000 --- a/assets/js/5f74c797.5a891c89.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5745],{6185:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var r=i(4848),a=i(8453),t=i(1470),s=i(9365);const o={title:"Av1an",sidebar_position:2,templating:!0},l="Av1an",c={id:"utilities/av1an",title:"Av1an",description:"Av1an is a video encoding framework. It can increase your encoding speed and improve CPU utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding.",source:"@site/docs/utilities/av1an.mdx",sourceDirName:"utilities",slug:"/utilities/av1an",permalink:"/docs/utilities/av1an",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/av1an.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Av1an",sidebar_position:2,templating:!0},sidebar:"tutorialSidebar",previous:{title:"Aviator",permalink:"/docs/utilities/Aviator"},next:{title:"ffmpeg",permalink:"/docs/utilities/ffmpeg"}},d={},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Windows",id:"windows",level:3},{value:"Script",id:"script",level:4},{value:"Pre-built Binary",id:"pre-built-binary",level:4},{value:"Compile from Source",id:"compile-from-source",level:4},{value:"macOS",id:"macos",level:3},{value:"Using MacPorts",id:"using-macports",level:4},{value:"Compile from Source",id:"compile-from-source-1",level:4},{value:"Linux",id:"linux",level:3},{value:"Package Managers",id:"package-managers",level:4},{value:"Compile from Source",id:"compile-from-source-2",level:4},{value:"Docker",id:"docker",level:3},{value:"Installing Dependencies",id:"installing-dependencies",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:""Error: The file 'XXXXX.ivf' could not be opened for reading: open file error." with mkvmerge on Linux",id:"error-the-file-xxxxxivf-could-not-be-opened-for-reading-open-file-error-with-mkvmerge-on-linux",level:3},{value:"Gray screen flashing for a single frame in output",id:"gray-screen-flashing-for-a-single-frame-in-output",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"av1an",children:"Av1an"})}),"\n",(0,r.jsxs)("picture",{children:[(0,r.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/main/static/img/av1an_96_workers.avif",type:"image/avif"}),(0,r.jsx)("img",{src:"https://autumn.revolt.chat/attachments/K3OhOCAy9bkUCkImek_q3-t6q3zctbn9SbWW-_RI19/av1an_96_workers.webp",alt:"Av1an with 96 workers"})]}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)(n.p,{children:"Av1an is a video encoding framework. It can increase your encoding speed and improve CPU utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding."}),"\n",(0,r.jsx)(n.p,{children:'The only downside to this, is that RAM usage increases significantly with each "worker" you add, so if you have a low amount of RAM (< 8GB), this might not be that useful to you.'}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"Av1an does not ship with any dependencies except for it's Docker image, so you will have to provide them on your own."})}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.p,{children:["You will need Python, ",(0,r.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," and ",(0,r.jsx)(n.a,{href:"/docs/filtering/vapoursynth",children:"Vapoursynth"})," to be installed regardless of your current operating system."]}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,r.jsx)(n.h4,{id:"script",children:"Script"}),"\n",(0,r.jsxs)(n.p,{children:["Windows users can use this ",(0,r.jsx)(n.a,{href:"https://github.com/Hishiro64/av1an-win-script",children:"script"})," which installs everything needed in a single portable folder. Do note that you will need to update the dependencies manually once installed."]}),"\n",(0,r.jsx)(n.h4,{id:"pre-built-binary",children:"Pre-built Binary"}),"\n",(0,r.jsxs)(n.p,{children:['Av1an is available as a pre-built binary under the "',(0,r.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases/tag/latest",children:"latest"}),'" tag on GitHub releases, you can simply download that and place it wherever you want.']}),"\n",(0,r.jsx)(n.h4,{id:"compile-from-source",children:"Compile from Source"}),"\n",(0,r.jsxs)(n.p,{children:["To compile from source, it is easier to use mingw-w64 which comes with ",(0,r.jsx)(n.a,{href:"https://msys2.org",children:"MSYS2"}),". Once installed, open MinGW64 and run the following:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"pacman -Syuu; pacman -S cmake git nasm python3 mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel mingw-w64-x86_64-ffmpeg mingw-w64-x86_64-rust mingw-w64-x86_64-lld mingw-w64-x86_64-clang mingw-w64-x86_64-make\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Then, before you do anything further. Download Vapoursynth ",(0,r.jsx)(n.strong,{children:"portable"})," (",(0,r.jsx)(n.code,{children:"VapourSynth64-Portable-RXX.7z"}),") from its GitHub ",(0,r.jsx)(n.a,{href:"https://github.com/vapoursynth/vapoursynth/releases",children:"release page"}),". Make sure the version you chose is compatible with the current MinGW64 Python version. For example, R65 supports 3.8 and 3.11, the version from Pacman (currently) is 3.11, so you should choose that."]}),"\n",(0,r.jsxs)(n.p,{children:["After downloading, open the 7z file and head to ",(0,r.jsx)(n.code,{children:"\\sdk\\lib64"}),", copy all the libraries from there to MinGW64's ",(0,r.jsx)(n.code,{children:"lib"})," directory, this usually resides in ",(0,r.jsx)(n.code,{children:"C:\\msys64\\mingw64\\lib"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Now finally, resume your session and run the following:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The binary will be available in ",(0,r.jsx)(n.code,{children:"C:\\msys64\\home\\USER\\Av1an\\target\\release"}),". The ",(0,r.jsx)(n.code,{children:"USER"})," part is your Windows username."]}),"\n",(0,r.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,r.jsx)(n.h4,{id:"using-macports",children:"Using MacPorts"}),"\n",(0,r.jsx)(n.p,{children:"Av1an is available in the MacPorts repository, to install just simply run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"port install av1an\n"})}),"\n",(0,r.jsx)(n.h4,{id:"compile-from-source-1",children:"Compile from Source"}),"\n",(0,r.jsxs)(n.p,{children:["You need to have Git, Nasm, and Rust to be installed first. You can achieve this by using ",(0,r.jsx)(n.a,{href:"https://brew.sh/",children:"Homebrew"})," or similar."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Binary is located in ",(0,r.jsx)(n.code,{children:"Av1an/target/release"}),", you can optionally place it somewhere like ",(0,r.jsx)(n.code,{children:"/usr/local/bin"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,r.jsx)(n.h4,{id:"package-managers",children:"Package Managers"}),"\n",(0,r.jsx)(n.p,{children:"Av1an is available in the package manager of some distributions such as Arch Linux. If not, you can skip to the next part every Linux user is familiar with."}),"\n",(0,r.jsx)(n.h4,{id:"compile-from-source-2",children:"Compile from Source"}),"\n",(0,r.jsx)(n.p,{children:"Just like macOS, you need to have Git, Nasm, and Rust to be installed. Can be achieved by either using your package manager or Rustup for Rust."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an.git\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Binary is located in ",(0,r.jsx)(n.code,{children:"Av1an/target/release"}),", you can optionally place it somewhere like ",(0,r.jsx)(n.code,{children:"/usr/local/bin"})," or ",(0,r.jsx)(n.code,{children:"/usr/bin"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"docker",children:"Docker"}),"\n",(0,r.jsx)(n.p,{children:"The following examples assume the file you want to encode is in your current working directory."}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(s.A,{value:"windows",label:"Windows",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "$(pwd):/videos" --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,r.jsx)(s.A,{value:"linux",label:"Linux",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "${PWD}:/videos" -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,r.jsxs)(s.A,{value:"build",label:"Manual Build",children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker build -t "av1an" .\n'})}),(0,r.jsx)(n.p,{children:"Run in the root directory of the repository. The dependencies will automatically be installed into the image, no manual installations necessary."})]})]}),"\n",(0,r.jsxs)(n.admonition,{type:"info",children:[(0,r.jsx)(n.p,{children:"To specify a different directory to use you would replace $(pwd) with the directory"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "/c/Users/masterofzen/Videos":/videos --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"--user"})," flag is required on Linux to avoid permission issues with the docker container not being able to write to the location, if you get permission issues ensure your user has access to the folder that you are using to encode."]})]}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"The Docker image ships with the default dependencies."})}),"\n",(0,r.jsx)(n.h2,{id:"installing-dependencies",children:"Installing Dependencies"}),"\n",(0,r.jsx)(n.p,{children:"You will need a chunk method installed as the built-in ones are very slow."}),"\n",(0,r.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,r.jsx)(n.h3,{id:"error-the-file-xxxxxivf-could-not-be-opened-for-reading-open-file-error-with-mkvmerge-on-linux",children:"\"Error: The file 'XXXXX.ivf' could not be opened for reading: open file error.\" with mkvmerge on Linux"}),"\n",(0,r.jsxs)(n.p,{children:["Since mkvmerge opens all the encoded chunks at once, this obviously hits the default open file descriptor limit of 1024 on longer videos.\nYou can temporarily increase it with ",(0,r.jsx)(n.code,{children:"ulimit -n 20000"})," to allow opening 20,000 files at once in that session."]}),"\n",(0,r.jsx)(n.h3,{id:"gray-screen-flashing-for-a-single-frame-in-output",children:"Gray screen flashing for a single frame in output"}),"\n",(0,r.jsx)(n.p,{children:"This is a unique problem with Av1an. Since Av1an does random seeking for chunks, traditional keyframe-based decoding methods\nsuch as L-SMASH and FFMS2 may fail and result in a gray frame. There are currently only two known methods to solve this:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Create a lossless intermediary with x264 ",(0,r.jsx)(n.code,{children:"-qp 0"}),", this always fixes all related seeking issues but will result in a huge file due to it's lossless nature."]}),"\n",(0,r.jsxs)(n.li,{children:["Using a linear-decoding chunk method such as ",(0,r.jsx)(n.code,{children:"bestsource"}),", the downside to this is it's mega slow. Tests shown encode speeds drop by a whopping 10-15x slower."]}),"\n",(0,r.jsxs)(n.li,{children:["Using ",(0,r.jsx)(n.code,{children:"dgdecnv"})," chunk method. ",(0,r.jsx)(n.code,{children:"dgdecnv"})," and ",(0,r.jsx)(n.code,{children:"DGIndexNV"}),' is a proprietary CUVID-accelerated Vapoursynth "Source" decoder created by ',(0,r.jsx)(n.a,{href:"https://www.rationalqm.us/",children:"Donald Alan Graft"})," where ",(0,r.jsx)(n.code,{children:"DGIndexNV"})," is the standalone program for seeking and ",(0,r.jsx)(n.code,{children:"dgdecnv"})," is the Vapoursynth plugin itself.\nIt is especially made with random seeking in mind which makes it perfect for Av1an. Only downside is you need an NVIDIA GPU and ",(0,r.jsx)(n.code,{children:"DGIndexNV"})," only supports x86_64 platforms."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>s});i(6540);var r=i(4164);const a={tabItem:"tabItem_Ymn6"};var t=i(4848);function s(e){let{children:n,hidden:i,className:s}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>j});var r=i(6540),a=i(4164),t=i(3104),s=i(6347),o=i(205),l=i(7485),c=i(1682),d=i(679);function u(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:i}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:i,attributes:r,default:a}}=e;return{value:n,label:i,attributes:r,default:a}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function p(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:i}=e;const a=(0,s.W6)(),t=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,l.aZ)(t),(0,r.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(a.location.search);n.set(t,e),a.replace({...a.location,search:n.toString()})}),[t,a])]}function g(e){const{defaultValue:n,queryString:i=!1,groupId:a}=e,t=h(e),[s,l]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=i.find((e=>e.default))??i[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t}))),[c,u]=m({queryString:i,groupId:a}),[g,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,t]=(0,d.Dv)(i);return[a,(0,r.useCallback)((e=>{i&&t.set(e)}),[i,t])]}({groupId:a}),v=(()=>{const e=c??g;return p({value:e,tabValues:t})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),f(e)}),[u,f,t]),tabValues:t}}var f=i(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function b(e){let{className:n,block:i,selectedValue:r,selectValue:s,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,t.a_)(),d=e=>{const n=e.currentTarget,i=l.indexOf(n),a=o[i].value;a!==r&&(c(n),s(a))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;n=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;n=l[i]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":i},n),children:o.map((e=>{let{value:n,label:i,attributes:t}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:u,onClick:d,...t,className:(0,a.A)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":r===n}),children:i??n},n)}))})}function y(e){let{lazy:n,children:i,selectedValue:t}=e;const s=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===t));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t})))})}function w(e){const n=g(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",v.tabList),children:[(0,x.jsx)(b,{...n,...e}),(0,x.jsx)(y,{...n,...e})]})}function j(e){const n=(0,f.A)();return(0,x.jsx)(w,{...e,children:u(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>o});var r=i(6540);const a={},t=r.createContext(a);function s(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5f74c797.aea89002.js b/assets/js/5f74c797.aea89002.js new file mode 100644 index 000000000..4d1568826 --- /dev/null +++ b/assets/js/5f74c797.aea89002.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5745],{4684:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"utilities/av1an","title":"Av1an","description":"Av1an is a video encoding framework. It can increase your encoding speed and improve CPU utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding.","source":"@site/docs/utilities/av1an.mdx","sourceDirName":"utilities","slug":"/utilities/av1an","permalink":"/docs/utilities/av1an","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/av1an.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Av1an","sidebar_position":2,"templating":true},"sidebar":"tutorialSidebar","previous":{"title":"Aviator","permalink":"/docs/utilities/Aviator"},"next":{"title":"ffmpeg","permalink":"/docs/utilities/ffmpeg"}}');var a=i(4848),t=i(8453),s=i(1470),o=i(9365);const l={title:"Av1an",sidebar_position:2,templating:!0},c="Av1an",d={},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Windows",id:"windows",level:3},{value:"Script",id:"script",level:4},{value:"Pre-built Binary",id:"pre-built-binary",level:4},{value:"Compile from Source",id:"compile-from-source",level:4},{value:"macOS",id:"macos",level:3},{value:"Using MacPorts",id:"using-macports",level:4},{value:"Compile from Source",id:"compile-from-source-1",level:4},{value:"Linux",id:"linux",level:3},{value:"Package Managers",id:"package-managers",level:4},{value:"Compile from Source",id:"compile-from-source-2",level:4},{value:"Docker",id:"docker",level:3},{value:"Installing Dependencies",id:"installing-dependencies",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:""Error: The file 'XXXXX.ivf' could not be opened for reading: open file error." with mkvmerge on Linux",id:"error-the-file-xxxxxivf-could-not-be-opened-for-reading-open-file-error-with-mkvmerge-on-linux",level:3},{value:"Gray screen flashing for a single frame in output",id:"gray-screen-flashing-for-a-single-frame-in-output",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"av1an",children:"Av1an"})}),"\n",(0,a.jsxs)("picture",{children:[(0,a.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/main/static/img/av1an_96_workers.avif",type:"image/avif"}),(0,a.jsx)("img",{src:"https://autumn.revolt.chat/attachments/K3OhOCAy9bkUCkImek_q3-t6q3zctbn9SbWW-_RI19/av1an_96_workers.webp",alt:"Av1an with 96 workers"})]}),"\n",(0,a.jsx)("br",{}),"\n",(0,a.jsx)("br",{}),"\n",(0,a.jsx)(n.p,{children:"Av1an is a video encoding framework. It can increase your encoding speed and improve CPU utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding."}),"\n",(0,a.jsx)(n.p,{children:'The only downside to this, is that RAM usage increases significantly with each "worker" you add, so if you have a low amount of RAM (< 8GB), this might not be that useful to you.'}),"\n",(0,a.jsx)(n.admonition,{type:"caution",children:(0,a.jsx)(n.p,{children:"Av1an does not ship with any dependencies except for it's Docker image, so you will have to provide them on your own."})}),"\n",(0,a.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(n.p,{children:["You will need Python, ",(0,a.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," and ",(0,a.jsx)(n.a,{href:"/docs/filtering/vapoursynth",children:"Vapoursynth"})," to be installed regardless of your current operating system."]}),"\n",(0,a.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,a.jsx)(n.h4,{id:"script",children:"Script"}),"\n",(0,a.jsxs)(n.p,{children:["Windows users can use this ",(0,a.jsx)(n.a,{href:"https://github.com/Hishiro64/av1an-win-script",children:"script"})," which installs everything needed in a single portable folder. Do note that you will need to update the dependencies manually once installed."]}),"\n",(0,a.jsx)(n.h4,{id:"pre-built-binary",children:"Pre-built Binary"}),"\n",(0,a.jsxs)(n.p,{children:['Av1an is available as a pre-built binary under the "',(0,a.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases/tag/latest",children:"latest"}),'" tag on GitHub releases, you can simply download that and place it wherever you want.']}),"\n",(0,a.jsx)(n.h4,{id:"compile-from-source",children:"Compile from Source"}),"\n",(0,a.jsxs)(n.p,{children:["To compile from source, it is easier to use mingw-w64 which comes with ",(0,a.jsx)(n.a,{href:"https://msys2.org",children:"MSYS2"}),". Once installed, open MinGW64 and run the following:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"pacman -Syuu; pacman -S cmake git nasm python3 mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel mingw-w64-x86_64-ffmpeg mingw-w64-x86_64-rust mingw-w64-x86_64-lld mingw-w64-x86_64-clang mingw-w64-x86_64-make\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Then, before you do anything further. Download Vapoursynth ",(0,a.jsx)(n.strong,{children:"portable"})," (",(0,a.jsx)(n.code,{children:"VapourSynth64-Portable-RXX.7z"}),") from its GitHub ",(0,a.jsx)(n.a,{href:"https://github.com/vapoursynth/vapoursynth/releases",children:"release page"}),". Make sure the version you chose is compatible with the current MinGW64 Python version. For example, R65 supports 3.8 and 3.11, the version from Pacman (currently) is 3.11, so you should choose that."]}),"\n",(0,a.jsxs)(n.p,{children:["After downloading, open the 7z file and head to ",(0,a.jsx)(n.code,{children:"\\sdk\\lib64"}),", copy all the libraries from there to MinGW64's ",(0,a.jsx)(n.code,{children:"lib"})," directory, this usually resides in ",(0,a.jsx)(n.code,{children:"C:\\msys64\\mingw64\\lib"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"Now finally, resume your session and run the following:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,a.jsxs)(n.p,{children:["The binary will be available in ",(0,a.jsx)(n.code,{children:"C:\\msys64\\home\\USER\\Av1an\\target\\release"}),". The ",(0,a.jsx)(n.code,{children:"USER"})," part is your Windows username."]}),"\n",(0,a.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,a.jsx)(n.h4,{id:"using-macports",children:"Using MacPorts"}),"\n",(0,a.jsx)(n.p,{children:"Av1an is available in the MacPorts repository, to install just simply run:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"port install av1an\n"})}),"\n",(0,a.jsx)(n.h4,{id:"compile-from-source-1",children:"Compile from Source"}),"\n",(0,a.jsxs)(n.p,{children:["You need to have Git, Nasm, and Rust to be installed first. You can achieve this by using ",(0,a.jsx)(n.a,{href:"https://brew.sh/",children:"Homebrew"})," or similar."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Binary is located in ",(0,a.jsx)(n.code,{children:"Av1an/target/release"}),", you can optionally place it somewhere like ",(0,a.jsx)(n.code,{children:"/usr/local/bin"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,a.jsx)(n.h4,{id:"package-managers",children:"Package Managers"}),"\n",(0,a.jsx)(n.p,{children:"Av1an is available in the package manager of some distributions such as Arch Linux. If not, you can skip to the next part every Linux user is familiar with."}),"\n",(0,a.jsx)(n.h4,{id:"compile-from-source-2",children:"Compile from Source"}),"\n",(0,a.jsx)(n.p,{children:"Just like macOS, you need to have Git, Nasm, and Rust to be installed. Can be achieved by either using your package manager or Rustup for Rust."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an.git\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Binary is located in ",(0,a.jsx)(n.code,{children:"Av1an/target/release"}),", you can optionally place it somewhere like ",(0,a.jsx)(n.code,{children:"/usr/local/bin"})," or ",(0,a.jsx)(n.code,{children:"/usr/bin"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"docker",children:"Docker"}),"\n",(0,a.jsx)(n.p,{children:"The following examples assume the file you want to encode is in your current working directory."}),"\n",(0,a.jsxs)(s.A,{children:[(0,a.jsx)(o.A,{value:"windows",label:"Windows",default:!0,children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "$(pwd):/videos" --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,a.jsx)(o.A,{value:"linux",label:"Linux",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "${PWD}:/videos" -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,a.jsxs)(o.A,{value:"build",label:"Manual Build",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'docker build -t "av1an" .\n'})}),(0,a.jsx)(n.p,{children:"Run in the root directory of the repository. The dependencies will automatically be installed into the image, no manual installations necessary."})]})]}),"\n",(0,a.jsxs)(n.admonition,{type:"info",children:[(0,a.jsx)(n.p,{children:"To specify a different directory to use you would replace $(pwd) with the directory"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "/c/Users/masterofzen/Videos":/videos --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})}),(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"--user"})," flag is required on Linux to avoid permission issues with the docker container not being able to write to the location, if you get permission issues ensure your user has access to the folder that you are using to encode."]})]}),"\n",(0,a.jsx)(n.admonition,{type:"caution",children:(0,a.jsx)(n.p,{children:"The Docker image ships with the default dependencies."})}),"\n",(0,a.jsx)(n.h2,{id:"installing-dependencies",children:"Installing Dependencies"}),"\n",(0,a.jsx)(n.p,{children:"You will need a chunk method installed as the built-in ones are very slow."}),"\n",(0,a.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,a.jsx)(n.h3,{id:"error-the-file-xxxxxivf-could-not-be-opened-for-reading-open-file-error-with-mkvmerge-on-linux",children:"\"Error: The file 'XXXXX.ivf' could not be opened for reading: open file error.\" with mkvmerge on Linux"}),"\n",(0,a.jsxs)(n.p,{children:["Since mkvmerge opens all the encoded chunks at once, this obviously hits the default open file descriptor limit of 1024 on longer videos.\nYou can temporarily increase it with ",(0,a.jsx)(n.code,{children:"ulimit -n 20000"})," to allow opening 20,000 files at once in that session."]}),"\n",(0,a.jsx)(n.h3,{id:"gray-screen-flashing-for-a-single-frame-in-output",children:"Gray screen flashing for a single frame in output"}),"\n",(0,a.jsx)(n.p,{children:"This is a unique problem with Av1an. Since Av1an does random seeking for chunks, traditional keyframe-based decoding methods\nsuch as L-SMASH and FFMS2 may fail and result in a gray frame. There are currently only two known methods to solve this:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Create a lossless intermediary with x264 ",(0,a.jsx)(n.code,{children:"-qp 0"}),", this always fixes all related seeking issues but will result in a huge file due to it's lossless nature."]}),"\n",(0,a.jsxs)(n.li,{children:["Using a linear-decoding chunk method such as ",(0,a.jsx)(n.code,{children:"bestsource"}),", the downside to this is it's mega slow. Tests shown encode speeds drop by a whopping 10-15x slower."]}),"\n",(0,a.jsxs)(n.li,{children:["Using ",(0,a.jsx)(n.code,{children:"dgdecnv"})," chunk method. ",(0,a.jsx)(n.code,{children:"dgdecnv"})," and ",(0,a.jsx)(n.code,{children:"DGIndexNV"}),' is a proprietary CUVID-accelerated Vapoursynth "Source" decoder created by ',(0,a.jsx)(n.a,{href:"https://www.rationalqm.us/",children:"Donald Alan Graft"})," where ",(0,a.jsx)(n.code,{children:"DGIndexNV"})," is the standalone program for seeking and ",(0,a.jsx)(n.code,{children:"dgdecnv"})," is the Vapoursynth plugin itself.\nIt is especially made with random seeking in mind which makes it perfect for Av1an. Only downside is you need an NVIDIA GPU and ",(0,a.jsx)(n.code,{children:"DGIndexNV"})," only supports x86_64 platforms."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>s});i(6540);var r=i(4164);const a={tabItem:"tabItem_Ymn6"};var t=i(4848);function s(e){let{children:n,hidden:i,className:s}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>j});var r=i(6540),a=i(4164),t=i(3104),s=i(6347),o=i(205),l=i(7485),c=i(1682),d=i(679);function u(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:i}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:i,attributes:r,default:a}}=e;return{value:n,label:i,attributes:r,default:a}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function p(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:i}=e;const a=(0,s.W6)(),t=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,l.aZ)(t),(0,r.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(a.location.search);n.set(t,e),a.replace({...a.location,search:n.toString()})}),[t,a])]}function g(e){const{defaultValue:n,queryString:i=!1,groupId:a}=e,t=h(e),[s,l]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=i.find((e=>e.default))??i[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t}))),[c,u]=m({queryString:i,groupId:a}),[g,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,t]=(0,d.Dv)(i);return[a,(0,r.useCallback)((e=>{i&&t.set(e)}),[i,t])]}({groupId:a}),v=(()=>{const e=c??g;return p({value:e,tabValues:t})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),f(e)}),[u,f,t]),tabValues:t}}var f=i(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function b(e){let{className:n,block:i,selectedValue:r,selectValue:s,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,t.a_)(),d=e=>{const n=e.currentTarget,i=l.indexOf(n),a=o[i].value;a!==r&&(c(n),s(a))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;n=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;n=l[i]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":i},n),children:o.map((e=>{let{value:n,label:i,attributes:t}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:u,onClick:d,...t,className:(0,a.A)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":r===n}),children:i??n},n)}))})}function y(e){let{lazy:n,children:i,selectedValue:t}=e;const s=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===t));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t})))})}function w(e){const n=g(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",v.tabList),children:[(0,x.jsx)(b,{...n,...e}),(0,x.jsx)(y,{...n,...e})]})}function j(e){const n=(0,f.A)();return(0,x.jsx)(w,{...e,children:u(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>o});var r=i(6540);const a={},t=r.createContext(a);function s(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6256.71aff5ef.js b/assets/js/6256.73278753.js similarity index 98% rename from assets/js/6256.71aff5ef.js rename to assets/js/6256.73278753.js index a6a484a70..6d9afb1e6 100644 --- a/assets/js/6256.71aff5ef.js +++ b/assets/js/6256.73278753.js @@ -1,2 +1,2 @@ -/*! For license information please see 6256.71aff5ef.js.LICENSE.txt */ -(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6256],{2200:(e,t,n)=>{"use strict";n.d(t,{z1:()=>S,cM:()=>b});var r=n(2456),o=n(6250),i=2,a=.16,l=.05,c=.05,s=.15,u=5,d=4,f=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function p(e){var t=e.r,n=e.g,o=e.b,i=(0,r.wE)(t,n,o);return{h:360*i.h,s:i.s,v:i.v}}function v(e){var t=e.r,n=e.g,o=e.b;return"#".concat((0,r.Ob)(t,n,o,!1))}function m(e,t,n){var r;return(r=Math.round(e.h)>=60&&Math.round(e.h)<=240?n?Math.round(e.h)-i*t:Math.round(e.h)+i*t:n?Math.round(e.h)+i*t:Math.round(e.h)-i*t)<0?r+=360:r>=360&&(r-=360),r}function h(e,t,n){return 0===e.h&&0===e.s?e.s:((r=n?e.s-a*t:t===d?e.s+a:e.s+l*t)>1&&(r=1),n&&t===u&&r>.1&&(r=.1),r<.06&&(r=.06),Number(r.toFixed(2)));var r}function g(e,t,n){var r;return(r=n?e.v+c*t:e.v-s*t)>1&&(r=1),Number(r.toFixed(2))}function b(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=(0,o.RO)(e),i=u;i>0;i-=1){var a=p(r),l=v((0,o.RO)({h:m(a,i,!0),s:h(a,i,!0),v:g(a,i,!0)}));n.push(l)}n.push(v(r));for(var c=1;c<=d;c+=1){var s=p(r),b=v((0,o.RO)({h:m(s,c),s:h(s,c),v:g(s,c)}));n.push(b)}return"dark"===t.theme?f.map((function(e){var r,i,a,l=e.index,c=e.opacity;return v((r=(0,o.RO)(t.backgroundColor||"#141414"),i=(0,o.RO)(n[l]),a=100*c/100,{r:(i.r-r.r)*a+r.r,g:(i.g-r.g)*a+r.g,b:(i.b-r.b)*a+r.b}))})):n}var y={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1677FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},A={},w={};Object.keys(y).forEach((function(e){A[e]=b(y[e]),A[e].primary=A[e][5],w[e]=b(y[e],{theme:"dark",backgroundColor:"#141414"}),w[e].primary=w[e][5]}));A.red,A.volcano,A.gold,A.orange,A.yellow,A.lime,A.green,A.cyan;var S=A.blue;A.geekblue,A.purple,A.magenta,A.grey,A.grey},1466:(e,t,n)=>{"use strict";n.d(t,{Mo:()=>lt,an:()=>O,Ki:()=>_,zA:()=>L,RC:()=>it,hV:()=>ee,IV:()=>rt});var r=n(4467),o=n(6636),i=n(4241),a=n(9379);const l=function(e){for(var t,n=0,r=0,o=e.length;o>=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)};var c=n(5089),s=n(6540),u=n.t(s,2),d=(n(8104),n(3210),n(3029)),f=n(2901),p="%";function v(e){return e.join(p)}const m=function(){function e(t){(0,d.A)(this,e),(0,r.A)(this,"instanceId",void 0),(0,r.A)(this,"cache",new Map),this.instanceId=t}return(0,f.A)(e,[{key:"get",value:function(e){return this.opGet(v(e))}},{key:"opGet",value:function(e){return this.cache.get(e)||null}},{key:"update",value:function(e,t){return this.opUpdate(v(e),t)}},{key:"opUpdate",value:function(e,t){var n=t(this.cache.get(e));null===n?this.cache.delete(e):this.cache.set(e,n)}}]),e}();var h="data-token-hash",g="data-css-hash",b="__cssinjs_instance__";function y(){var e=Math.random().toString(12).slice(2);if("undefined"!=typeof document&&document.head&&document.body){var t=document.body.querySelectorAll("style[".concat(g,"]"))||[],n=document.head.firstChild;Array.from(t).forEach((function(t){t[b]=t[b]||e,t[b]===e&&document.head.insertBefore(t,n)}));var r={};Array.from(document.querySelectorAll("style[".concat(g,"]"))).forEach((function(t){var n,o=t.getAttribute(g);r[o]?t[b]===e&&(null===(n=t.parentNode)||void 0===n||n.removeChild(t)):r[o]=!0}))}return new m(e)}var A=s.createContext({hashPriority:"low",cache:y(),defaultCache:!0});const w=A;var S=n(2284),x=n(998);var C=function(){function e(){(0,d.A)(this,e),(0,r.A)(this,"cache",void 0),(0,r.A)(this,"keys",void 0),(0,r.A)(this,"cacheCallTimes",void 0),this.cache=new Map,this.keys=[],this.cacheCallTimes=0}return(0,f.A)(e,[{key:"size",value:function(){return this.keys.length}},{key:"internalGet",value:function(e){var t,n,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o={map:this.cache};return e.forEach((function(e){var t;o?o=null===(t=o)||void 0===t||null===(t=t.map)||void 0===t?void 0:t.get(e):o=void 0})),null!==(t=o)&&void 0!==t&&t.value&&r&&(o.value[1]=this.cacheCallTimes++),null===(n=o)||void 0===n?void 0:n.value}},{key:"get",value:function(e){var t;return null===(t=this.internalGet(e,!0))||void 0===t?void 0:t[0]}},{key:"has",value:function(e){return!!this.internalGet(e)}},{key:"set",value:function(t,n){var r=this;if(!this.has(t)){if(this.size()+1>e.MAX_CACHE_SIZE+e.MAX_CACHE_OFFSET){var i=this.keys.reduce((function(e,t){var n=(0,o.A)(e,2)[1];return r.internalGet(t)[1]0,"[Ant Design CSS-in-JS] Theme should have at least one derivative function."),E+=1}return(0,f.A)(e,[{key:"getDerivativeToken",value:function(e){return this.derivatives.reduce((function(t,n){return n(e,t)}),void 0)}}]),e}(),$=new C;function O(e){var t=Array.isArray(e)?e:[e];return $.has(t)||$.set(t,new M(t)),$.get(t)}var T=new WeakMap,R={};var z=new WeakMap;function P(e){var t=z.get(e)||"";return t||(Object.keys(e).forEach((function(n){var r=e[n];t+=n,r instanceof M?t+=r.id:r&&"object"===(0,S.A)(r)?t+=P(r):t+=r})),z.set(e,t)),t}function N(e,t){return l("".concat(t,"_").concat(P(e)))}"random-".concat(Date.now(),"-").concat(Math.random()).replace(/\./g,"");var I=(0,x.A)();function L(e){return"number"==typeof e?"".concat(e,"px"):e}function j(e,t,n){var o,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(arguments.length>4&&void 0!==arguments[4]&&arguments[4])return e;var l=(0,a.A)((0,a.A)({},i),{},(o={},(0,r.A)(o,h,t),(0,r.A)(o,g,n),o)),c=Object.keys(l).map((function(e){var t=l[e];return t?"".concat(e,'="').concat(t,'"'):null})).filter((function(e){return e})).join(" ");return"")}var _=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"--".concat(t?"".concat(t,"-"):"").concat(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z]+)([A-Z][a-z0-9]+)/g,"$1-$2").replace(/([a-z])([A-Z0-9])/g,"$1-$2").toLowerCase()},H=function(e,t,n){return Object.keys(e).length?".".concat(t).concat(null!=n&&n.scope?".".concat(n.scope):"","{").concat(Object.entries(e).map((function(e){var t=(0,o.A)(e,2),n=t[0],r=t[1];return"".concat(n,":").concat(r,";")})).join(""),"}"):""},D=function(e,t,n){var r={},i={};return Object.entries(e).forEach((function(e){var t,a,l=(0,o.A)(e,2),c=l[0],s=l[1];if(null!=n&&null!==(t=n.preserve)&&void 0!==t&&t[c])i[c]=s;else if(!("string"!=typeof s&&"number"!=typeof s||null!=n&&null!==(a=n.ignore)&&void 0!==a&&a[c])){var u,d=_(c,null==n?void 0:n.prefix);r[d]="number"!=typeof s||null!=n&&null!==(u=n.unitless)&&void 0!==u&&u[c]?String(s):"".concat(s,"px"),i[c]="var(".concat(d,")")}})),[i,H(r,t,{scope:null==n?void 0:n.scope})]},B=n(981),W=(0,a.A)({},u).useInsertionEffect;const F=W?function(e,t,n){return W((function(){return e(),t()}),n)}:function(e,t,n){s.useMemo(e,n),(0,B.A)((function(){return t(!0)}),n)};const X=void 0!==(0,a.A)({},u).useInsertionEffect?function(e){var t=[],n=!1;return s.useEffect((function(){return n=!1,function(){n=!0,t.length&&t.forEach((function(e){return e()}))}}),e),function(e){n||t.push(e)}}:function(){return function(e){e()}};const K=function(){return!1};function G(e,t,n,r,a){var l=s.useContext(w).cache,c=v([e].concat((0,i.A)(t))),u=X([c]),d=(K(),function(e){l.opUpdate(c,(function(t){var r=t||[void 0,void 0],i=(0,o.A)(r,2),a=i[0];var l=[void 0===a?0:a,i[1]||n()];return e?e(l):l}))});s.useMemo((function(){d()}),[c]);var f=l.opGet(c)[1];return F((function(){null==a||a(f)}),(function(e){return d((function(t){var n=(0,o.A)(t,2),r=n[0],i=n[1];return e&&0===r&&(null==a||a(f)),[r+1,i]})),function(){l.opUpdate(c,(function(t){var n=t||[],i=(0,o.A)(n,2),a=i[0],s=void 0===a?0:a,d=i[1];return 0===s-1?(u((function(){!e&&l.opGet(c)||null==r||r(d,!1)})),null):[s-1,d]}))}}),[c]),f}var q={},Y="css",U=new Map;var V=0;function Q(e,t){U.set(e,(U.get(e)||0)-1);var n=Array.from(U.keys()),r=n.filter((function(e){return(U.get(e)||0)<=0}));n.length-r.length>V&&r.forEach((function(e){!function(e,t){"undefined"!=typeof document&&document.querySelectorAll("style[".concat(h,'="').concat(e,'"]')).forEach((function(e){var n;e[b]===t&&(null===(n=e.parentNode)||void 0===n||n.removeChild(e))}))}(e,t),U.delete(e)}))}var Z=function(e,t,n,r){var o=n.getDerivativeToken(e),i=(0,a.A)((0,a.A)({},o),t);return r&&(i=r(i)),i},J="token";function ee(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(0,s.useContext)(w),u=r.cache.instanceId,d=r.container,f=n.salt,p=void 0===f?"":f,v=n.override,m=void 0===v?q:v,y=n.formatToken,A=n.getComputedToken,S=n.cssVar,x=function(e,t){for(var n=T,r=0;r0?ve(ke,--xe):0,we--,10===Ce&&(we=1,Ae--),Ce}function $e(){return Ce=xe2||ze(Ce)>3?"":" "}function je(e,t){for(;--t&&$e()&&!(Ce<48||Ce>102||Ce>57&&Ce<65||Ce>70&&Ce<97););return Re(e,Te()+(t<6&&32==Oe()&&32==$e()))}function _e(e){for(;$e();)switch(Ce){case e:return xe;case 34:case 39:34!==e&&39!==e&&_e(Ce);break;case 40:41===e&&_e(e);break;case 92:$e()}return xe}function He(e,t){for(;$e()&&e+Ce!==57&&(e+Ce!==84||47!==Oe()););return"/*"+Re(t,xe-1)+"*"+ue(47===e?e:$e())}function De(e){for(;!ze(Oe());)$e();return Re(e,xe)}function Be(e){return Ne(We("",null,null,null,[""],e=Pe(e),0,[0],e))}function We(e,t,n,r,o,i,a,l,c){for(var s=0,u=0,d=a,f=0,p=0,v=0,m=1,h=1,g=1,b=0,y="",A=o,w=i,S=r,x=y;h;)switch(v=b,b=$e()){case 40:if(108!=v&&58==ve(x,d-1)){-1!=pe(x+=fe(Ie(b),"&","&\f"),"&\f",se(s?l[s-1]:0))&&(g=-1);break}case 34:case 39:case 91:x+=Ie(b);break;case 9:case 10:case 13:case 32:x+=Le(v);break;case 92:x+=je(Te()-1,7);continue;case 47:switch(Oe()){case 42:case 47:ge(Xe(He($e(),Te()),t,n,c),c);break;default:x+="/"}break;case 123*m:l[s++]=he(x)*g;case 125*m:case 59:case 0:switch(b){case 0:case 125:h=0;case 59+u:-1==g&&(x=fe(x,/\f/g,"")),p>0&&he(x)-d&&ge(p>32?Ke(x+";",r,n,d-1,c):Ke(fe(x," ","")+";",r,n,d-2,c),c);break;case 59:x+=";";default:if(ge(S=Fe(x,t,n,s,u,o,l,y,A=[],w=[],d,i),i),123===b)if(0===u)We(x,t,S,S,A,i,d,l,w);else switch(99===f&&110===ve(x,3)?100:f){case 100:case 108:case 109:case 115:We(e,S,S,r&&ge(Fe(e,S,S,0,0,o,l,y,o,A=[],d,w),w),o,w,d,l,r?A:w);break;default:We(x,S,S,S,[""],w,0,l,w)}}s=u=p=0,m=g=1,y=x="",d=a;break;case 58:d=1+he(x),p=v;default:if(m<1)if(123==b)--m;else if(125==b&&0==m++&&125==Me())continue;switch(x+=ue(b),b*m){case 38:g=u>0?1:(x+="\f",-1);break;case 44:l[s++]=(he(x)-1)*g,g=1;break;case 64:45===Oe()&&(x+=Ie($e())),f=Oe(),u=d=he(y=x+=De(Te())),b++;break;case 45:45===v&&2==he(x)&&(m=0)}}return i}function Fe(e,t,n,r,o,i,a,l,c,s,u,d){for(var f=o-1,p=0===o?i:[""],v=function(e){return e.length}(p),m=0,h=0,g=0;m0?p[b]+" "+y:fe(y,/&\f/g,p[b])))&&(c[g++]=A);return Ee(e,t,n,0===o?oe:l,c,s,u,d)}function Xe(e,t,n,r){return Ee(e,t,n,re,ue(Ce),me(e,2,-2),0,r)}function Ke(e,t,n,r,o){return Ee(e,t,n,ie,me(e,0,r),me(e,r+1,-1),r,o)}var Ge,qe="data-ant-cssinjs-cache-path",Ye="_FILE_STYLE__";var Ue=!0;function Ve(e){return function(){if(!Ge&&(Ge={},(0,x.A)())){var e=document.createElement("div");e.className=qe,e.style.position="fixed",e.style.visibility="hidden",e.style.top="-9999px",document.body.appendChild(e);var t=getComputedStyle(e).content||"";(t=t.replace(/^"/,"").replace(/"$/,"")).split(";").forEach((function(e){var t=e.split(":"),n=(0,o.A)(t,2),r=n[0],i=n[1];Ge[r]=i}));var n,r=document.querySelector("style[".concat(qe,"]"));r&&(Ue=!1,null===(n=r.parentNode)||void 0===n||n.removeChild(r)),document.body.removeChild(e)}}(),!!Ge[e]}var Qe="_multi_value_";function Ze(e){return be(Be(e),ye).replace(/\{%%%\:[^;];}/g,";")}var Je=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{root:!0,parentSelectors:[]},l=r.root,c=r.injectHash,s=r.parentSelectors,u=n.hashId,d=n.layer,f=(n.path,n.hashPriority),p=n.transformers,v=void 0===p?[]:p,m=(n.linters,""),h={};function g(t){var r=t.getName(u);if(!h[r]){var i=e(t.style,n,{root:!1,parentSelectors:s}),a=(0,o.A)(i,1)[0];h[r]="@keyframes ".concat(t.getName(u)).concat(a)}}var b=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return t.forEach((function(t){Array.isArray(t)?e(t,n):t&&n.push(t)})),n}(Array.isArray(t)?t:[t]);return b.forEach((function(t){var r="string"!=typeof t||l?t:{};if("string"==typeof r)m+="".concat(r,"\n");else if(r._keyframe)g(r);else{var d=v.reduce((function(e,t){var n;return(null==t||null===(n=t.visit)||void 0===n?void 0:n.call(t,e))||e}),r);Object.keys(d).forEach((function(t){var r=d[t];if("object"!==(0,S.A)(r)||!r||"animationName"===t&&r._keyframe||function(e){return"object"===(0,S.A)(e)&&e&&("_skip_check_"in e||Qe in e)}(r)){var p;function E(e,t){var n=e.replace(/[A-Z]/g,(function(e){return"-".concat(e.toLowerCase())})),r=t;ne[e]||"number"!=typeof r||0===r||(r="".concat(r,"px")),"animationName"===e&&null!=t&&t._keyframe&&(g(t),r=t.getName(u)),m+="".concat(n,":").concat(r,";")}var v=null!==(p=null==r?void 0:r.value)&&void 0!==p?p:r;"object"===(0,S.A)(r)&&null!=r&&r[Qe]&&Array.isArray(v)?v.forEach((function(e){E(t,e)})):E(t,v)}else{var b=!1,y=t.trim(),A=!1;(l||c)&&u?y.startsWith("@")?b=!0:y=function(e,t,n){if(!t)return e;var r=".".concat(t),o="low"===n?":where(".concat(r,")"):r;return e.split(",").map((function(e){var t,n=e.trim().split(/\s+/),r=n[0]||"",a=(null===(t=r.match(/^\w+/))||void 0===t?void 0:t[0])||"";return[r="".concat(a).concat(o).concat(r.slice(a.length))].concat((0,i.A)(n.slice(1))).join(" ")})).join(",")}(t,u,f):!l||u||"&"!==y&&""!==y||(y="",A=!0);var w=e(r,n,{root:A,injectHash:b,parentSelectors:[].concat((0,i.A)(s),[y])}),x=(0,o.A)(w,2),C=x[0],k=x[1];h=(0,a.A)((0,a.A)({},h),k),m+="".concat(y).concat(C)}}))}})),l?d&&(m="@layer ".concat(d.name," {").concat(m,"}"),d.dependencies&&(h["@layer ".concat(d.name)]=d.dependencies.map((function(e){return"@layer ".concat(e,", ").concat(d.name,";")})).join("\n"))):m="{".concat(m,"}"),[m,h]};function et(e,t){return l("".concat(e.join("%")).concat(t))}function tt(){return null}var nt="style";function rt(e,t){var n=e.token,l=e.path,u=e.hashId,d=e.layer,f=e.nonce,p=e.clientOnly,v=e.order,m=void 0===v?0:v,y=s.useContext(w),A=y.autoClear,S=(y.mock,y.defaultCache),C=y.hashPriority,k=y.container,E=y.ssrInline,M=y.transformers,$=y.linters,O=y.cache,T=y.layer,R=n._tokenKey,z=[R];T&&z.push("layer"),z.push.apply(z,(0,i.A)(l));var P=I;var N=G(nt,z,(function(){var e=z.join("|");if(Ve(e)){var n=function(e){var t=Ge[e],n=null;if(t&&(0,x.A)())if(Ue)n=Ye;else{var r=document.querySelector("style[".concat(g,'="').concat(Ge[e],'"]'));r?n=r.innerHTML:delete Ge[e]}return[n,t]}(e),r=(0,o.A)(n,2),i=r[0],a=r[1];if(i)return[i,R,a,{},p,m]}var c=t(),s=Je(c,{hashId:u,hashPriority:C,layer:T?d:void 0,path:l.join("-"),transformers:M,linters:$}),f=(0,o.A)(s,2),v=f[0],h=f[1],b=Ze(v),y=et(z,b);return[b,R,y,h,p,m]}),(function(e,t){var n=(0,o.A)(e,3)[2];(t||A)&&I&&(0,c.m6)(n,{mark:g})}),(function(e){var t=(0,o.A)(e,4),n=t[0],r=(t[1],t[2]),i=t[3];if(P&&n!==Ye){var l={mark:g,prepend:!T&&"queue",attachTo:k,priority:m},s="function"==typeof f?f():f;s&&(l.csp={nonce:s});var u=[],d=[];Object.keys(i).forEach((function(e){e.startsWith("@layer")?u.push(e):d.push(e)})),u.forEach((function(e){(0,c.BD)(Ze(i[e]),"_layer-".concat(e),(0,a.A)((0,a.A)({},l),{},{prepend:!0}))}));var p=(0,c.BD)(n,r,l);p[b]=O.instanceId,p.setAttribute(h,R),d.forEach((function(e){(0,c.BD)(Ze(i[e]),"_effect-".concat(e),l)}))}})),L=(0,o.A)(N,3),j=L[0],_=L[1],H=L[2];return function(e){var t,n;E&&!P&&S?t=s.createElement("style",(0,te.A)({},(n={},(0,r.A)(n,h,_),(0,r.A)(n,g,H),n),{dangerouslySetInnerHTML:{__html:j}})):t=s.createElement(tt,null);return s.createElement(s.Fragment,null,t,e)}}var ot="cssVar";const it=function(e,t){var n=e.key,r=e.prefix,a=e.unitless,l=e.ignore,u=e.token,d=e.scope,f=void 0===d?"":d,p=(0,s.useContext)(w),v=p.cache.instanceId,m=p.container,y=u._tokenKey,A=[].concat((0,i.A)(e.path),[n,f,y]);return G(ot,A,(function(){var e=t(),i=D(e,n,{prefix:r,unitless:a,ignore:l,scope:f}),c=(0,o.A)(i,2),s=c[0],u=c[1];return[s,u,et(A,u),n]}),(function(e){var t=(0,o.A)(e,3)[2];I&&(0,c.m6)(t,{mark:g})}),(function(e){var t=(0,o.A)(e,3),r=t[1],i=t[2];if(r){var a=(0,c.BD)(r,i,{mark:g,prepend:"queue",attachTo:m,priority:-999});a[b]=v,a.setAttribute(h,n)}}))};var at;at={},(0,r.A)(at,nt,(function(e,t,n){var r=(0,o.A)(e,6),i=r[0],a=r[1],l=r[2],c=r[3],s=r[4],u=r[5],d=(n||{}).plain;if(s)return null;var f=i,p={"data-rc-order":"prependQueue","data-rc-priority":"".concat(u)};return f=j(i,a,l,p,d),c&&Object.keys(c).forEach((function(e){if(!t[e]){t[e]=!0;var n=j(Ze(c[e]),a,"_effect-".concat(e),p,d);e.startsWith("@layer")?f=n+f:f+=n}})),[u,l,f]})),(0,r.A)(at,J,(function(e,t,n){var r=(0,o.A)(e,5),i=r[2],a=r[3],l=r[4],c=(n||{}).plain;if(!a)return null;var s=i._tokenKey;return[-999,s,j(a,l,s,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},c)]})),(0,r.A)(at,ot,(function(e,t,n){var r=(0,o.A)(e,4),i=r[1],a=r[2],l=r[3],c=(n||{}).plain;if(!i)return null;return[-999,a,j(i,l,a,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},c)]}));const lt=function(){function e(t,n){(0,d.A)(this,e),(0,r.A)(this,"name",void 0),(0,r.A)(this,"style",void 0),(0,r.A)(this,"_keyframe",!0),this.name=t,this.style=n}return(0,f.A)(e,[{key:"getName",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?"".concat(e,"-").concat(this.name):this.name}}]),e}();function ct(e){return e.notSplit=!0,e}ct(["borderTop","borderBottom"]),ct(["borderTop"]),ct(["borderBottom"]),ct(["borderLeft","borderRight"]),ct(["borderLeft"]),ct(["borderRight"])},8046:(e,t,n)=>{"use strict";n.d(t,{A:()=>O});var r=n(8168),o=n(6636),i=n(4467),a=n(45),l=n(6540),c=n(6942),s=n.n(c),u=n(2200);const d=(0,l.createContext)({});var f=n(9379),p=n(2284),v=n(5089),m=n(2633),h=n(8210);function g(e){return"object"===(0,p.A)(e)&&"string"==typeof e.name&&"string"==typeof e.theme&&("object"===(0,p.A)(e.icon)||"function"==typeof e.icon)}function b(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce((function(t,n){var r,o=e[n];if("class"===n)t.className=o,delete t.class;else delete t[n],t[(r=n,r.replace(/-(.)/g,(function(e,t){return t.toUpperCase()})))]=o;return t}),{})}function y(e,t,n){return n?l.createElement(e.tag,(0,f.A)((0,f.A)({key:t},b(e.attrs)),n),(e.children||[]).map((function(n,r){return y(n,"".concat(t,"-").concat(e.tag,"-").concat(r))}))):l.createElement(e.tag,(0,f.A)({key:t},b(e.attrs)),(e.children||[]).map((function(n,r){return y(n,"".concat(t,"-").concat(e.tag,"-").concat(r))})))}function A(e){return(0,u.cM)(e)[0]}function w(e){return e?Array.isArray(e)?e:[e]:[]}var S=["icon","className","onClick","style","primaryColor","secondaryColor"],x={primaryColor:"#333",secondaryColor:"#E6E6E6",calculated:!1};var C=function(e){var t,n,r,o,i,c,s,u=e.icon,p=e.className,b=e.onClick,w=e.style,C=e.primaryColor,k=e.secondaryColor,E=(0,a.A)(e,S),M=l.useRef(),$=x;if(C&&($={primaryColor:C,secondaryColor:k||A(C)}),t=M,n=(0,l.useContext)(d),r=n.csp,o=n.prefixCls,i="\n.anticon {\n display: inline-flex;\n alignItems: center;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n",o&&(i=i.replace(/anticon/g,o)),(0,l.useEffect)((function(){var e=t.current,n=(0,m.j)(e);(0,v.BD)(i,"@ant-design-icons",{prepend:!0,csp:r,attachTo:n})}),[]),c=g(u),s="icon should be icon definiton, but got ".concat(u),(0,h.Ay)(c,"[@ant-design/icons] ".concat(s)),!g(u))return null;var O=u;return O&&"function"==typeof O.icon&&(O=(0,f.A)((0,f.A)({},O),{},{icon:O.icon($.primaryColor,$.secondaryColor)})),y(O.icon,"svg-".concat(O.name),(0,f.A)((0,f.A)({className:p,onClick:b,style:w,"data-icon":O.name,width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true"},E),{},{ref:M}))};C.displayName="IconReact",C.getTwoToneColors=function(){return(0,f.A)({},x)},C.setTwoToneColors=function(e){var t=e.primaryColor,n=e.secondaryColor;x.primaryColor=t,x.secondaryColor=n||A(t),x.calculated=!!n};const k=C;function E(e){var t=w(e),n=(0,o.A)(t,2),r=n[0],i=n[1];return k.setTwoToneColors({primaryColor:r,secondaryColor:i})}var M=["className","icon","spin","rotate","tabIndex","onClick","twoToneColor"];E(u.z1.primary);var $=l.forwardRef((function(e,t){var n=e.className,c=e.icon,u=e.spin,f=e.rotate,p=e.tabIndex,v=e.onClick,m=e.twoToneColor,h=(0,a.A)(e,M),g=l.useContext(d),b=g.prefixCls,y=void 0===b?"anticon":b,A=g.rootClassName,S=s()(A,y,(0,i.A)((0,i.A)({},"".concat(y,"-").concat(c.name),!!c.name),"".concat(y,"-spin"),!!u||"loading"===c.name),n),x=p;void 0===x&&v&&(x=-1);var C=f?{msTransform:"rotate(".concat(f,"deg)"),transform:"rotate(".concat(f,"deg)")}:void 0,E=w(m),$=(0,o.A)(E,2),O=$[0],T=$[1];return l.createElement("span",(0,r.A)({role:"img","aria-label":c.name},h,{ref:t,tabIndex:x,onClick:v,className:S}),l.createElement(k,{icon:c,primaryColor:O,secondaryColor:T,style:C}))}));$.displayName="AntdIcon",$.getTwoToneColor=function(){var e=k.getTwoToneColors();return e.calculated?[e.primaryColor,e.secondaryColor]:e.primaryColor},$.setTwoToneColor=E;const O=$},6467:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z"}}]},name:"close",theme:"outlined"};var a=n(8046),l=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const c=o.forwardRef(l)},8633:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"}}]},name:"left",theme:"outlined"};var a=n(8046),l=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const c=o.forwardRef(l)},363:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"}}]},name:"right",theme:"outlined"};var a=n(8046),l=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const c=o.forwardRef(l)},2456:(e,t,n)=>{"use strict";n.d(t,{H:()=>d,K6:()=>i,Me:()=>s,Ob:()=>u,YL:()=>l,_:()=>o,g8:()=>v,n6:()=>p,oS:()=>m,wE:()=>c});var r=n(9244);function o(e,t,n){return{r:255*(0,r.Cg)(e,255),g:255*(0,r.Cg)(t,255),b:255*(0,r.Cg)(n,255)}}function i(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,l=0,c=(o+i)/2;if(o===i)l=0,a=0;else{var s=o-i;switch(l=c>.5?s/(2-o-i):s/(o+i),o){case e:a=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*n*(t-e):n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function l(e,t,n){var o,i,l;if(e=(0,r.Cg)(e,360),t=(0,r.Cg)(t,100),n=(0,r.Cg)(n,100),0===t)i=n,l=n,o=n;else{var c=n<.5?n*(1+t):n+t-n*t,s=2*n-c;o=a(s,c,e+1/3),i=a(s,c,e),l=a(s,c,e-1/3)}return{r:255*o,g:255*i,b:255*l}}function c(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,l=o,c=o-i,s=0===o?0:c/o;if(o===i)a=0;else{switch(o){case e:a=(t-n)/c+(t>16,g:(65280&e)>>8,b:255&e}}},2434:(e,t,n)=>{"use strict";n.d(t,{D:()=>r});var r={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}},6250:(e,t,n)=>{"use strict";n.d(t,{RO:()=>a});var r=n(2456),o=n(2434),i=n(9244);function a(e){var t={r:0,g:0,b:0},n=1,a=null,l=null,c=null,s=!1,f=!1;return"string"==typeof e&&(e=function(e){if(e=e.trim().toLowerCase(),0===e.length)return!1;var t=!1;if(o.D[e])e=o.D[e],t=!0;else if("transparent"===e)return{r:0,g:0,b:0,a:0,format:"name"};var n=u.rgb.exec(e);if(n)return{r:n[1],g:n[2],b:n[3]};if(n=u.rgba.exec(e),n)return{r:n[1],g:n[2],b:n[3],a:n[4]};if(n=u.hsl.exec(e),n)return{h:n[1],s:n[2],l:n[3]};if(n=u.hsla.exec(e),n)return{h:n[1],s:n[2],l:n[3],a:n[4]};if(n=u.hsv.exec(e),n)return{h:n[1],s:n[2],v:n[3]};if(n=u.hsva.exec(e),n)return{h:n[1],s:n[2],v:n[3],a:n[4]};if(n=u.hex8.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),a:(0,r.n6)(n[4]),format:t?"name":"hex8"};if(n=u.hex6.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),format:t?"name":"hex"};if(n=u.hex4.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),a:(0,r.n6)(n[4]+n[4]),format:t?"name":"hex8"};if(n=u.hex3.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),format:t?"name":"hex"};return!1}(e)),"object"==typeof e&&(d(e.r)&&d(e.g)&&d(e.b)?(t=(0,r._)(e.r,e.g,e.b),s=!0,f="%"===String(e.r).substr(-1)?"prgb":"rgb"):d(e.h)&&d(e.s)&&d(e.v)?(a=(0,i.Px)(e.s),l=(0,i.Px)(e.v),t=(0,r.Me)(e.h,a,l),s=!0,f="hsv"):d(e.h)&&d(e.s)&&d(e.l)&&(a=(0,i.Px)(e.s),c=(0,i.Px)(e.l),t=(0,r.YL)(e.h,a,c),s=!0,f="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=(0,i.TV)(n),{ok:s,format:e.format||f,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var l="(?:".concat("[-\\+]?\\d*\\.\\d+%?",")|(?:").concat("[-\\+]?\\d+%?",")"),c="[\\s|\\(]+(".concat(l,")[,|\\s]+(").concat(l,")[,|\\s]+(").concat(l,")\\s*\\)?"),s="[\\s|\\(]+(".concat(l,")[,|\\s]+(").concat(l,")[,|\\s]+(").concat(l,")[,|\\s]+(").concat(l,")\\s*\\)?"),u={CSS_UNIT:new RegExp(l),rgb:new RegExp("rgb"+c),rgba:new RegExp("rgba"+s),hsl:new RegExp("hsl"+c),hsla:new RegExp("hsla"+s),hsv:new RegExp("hsv"+c),hsva:new RegExp("hsva"+s),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function d(e){return Boolean(u.CSS_UNIT.exec(String(e)))}},4978:(e,t,n)=>{"use strict";n.d(t,{q:()=>l});var r=n(2456),o=n(2434),i=n(6250),a=n(9244),l=function(){function e(t,n){var o;if(void 0===t&&(t=""),void 0===n&&(n={}),t instanceof e)return t;"number"==typeof t&&(t=(0,r.oS)(t)),this.originalInput=t;var a=(0,i.RO)(t);this.originalInput=t,this.r=a.r,this.g=a.g,this.b=a.b,this.a=a.a,this.roundA=Math.round(100*this.a)/100,this.format=null!==(o=n.format)&&void 0!==o?o:a.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=a.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},e.prototype.getLuminance=function(){var e=this.toRgb(),t=e.r/255,n=e.g/255,r=e.b/255;return.2126*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(e){return this.a=(0,a.TV)(e),this.roundA=Math.round(100*this.a)/100,this},e.prototype.isMonochrome=function(){return 0===this.toHsl().s},e.prototype.toHsv=function(){var e=(0,r.wE)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,v:e.v,a:this.a}},e.prototype.toHsvString=function(){var e=(0,r.wE)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.v);return 1===this.a?"hsv(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsva(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHsl=function(){var e=(0,r.K6)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,l:e.l,a:this.a}},e.prototype.toHslString=function(){var e=(0,r.K6)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.l);return 1===this.a?"hsl(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsla(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHex=function(e){return void 0===e&&(e=!1),(0,r.Ob)(this.r,this.g,this.b,e)},e.prototype.toHexString=function(e){return void 0===e&&(e=!1),"#"+this.toHex(e)},e.prototype.toHex8=function(e){return void 0===e&&(e=!1),(0,r.H)(this.r,this.g,this.b,this.a,e)},e.prototype.toHex8String=function(e){return void 0===e&&(e=!1),"#"+this.toHex8(e)},e.prototype.toHexShortString=function(e){return void 0===e&&(e=!1),1===this.a?this.toHexString(e):this.toHex8String(e)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var e=Math.round(this.r),t=Math.round(this.g),n=Math.round(this.b);return 1===this.a?"rgb(".concat(e,", ").concat(t,", ").concat(n,")"):"rgba(".concat(e,", ").concat(t,", ").concat(n,", ").concat(this.roundA,")")},e.prototype.toPercentageRgb=function(){var e=function(e){return"".concat(Math.round(100*(0,a.Cg)(e,255)),"%")};return{r:e(this.r),g:e(this.g),b:e(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var e=function(e){return Math.round(100*(0,a.Cg)(e,255))};return 1===this.a?"rgb(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%)"):"rgba(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%, ").concat(this.roundA,")")},e.prototype.toName=function(){if(0===this.a)return"transparent";if(this.a<1)return!1;for(var e="#"+(0,r.Ob)(this.r,this.g,this.b,!1),t=0,n=Object.entries(o.D);t=0;return t||!r||!e.startsWith("hex")&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this.a?this.toName():this.toRgbString()},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l+=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.brighten=function(t){void 0===t&&(t=10);var n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(-t/100*255))),n.g=Math.max(0,Math.min(255,n.g-Math.round(-t/100*255))),n.b=Math.max(0,Math.min(255,n.b-Math.round(-t/100*255))),new e(n)},e.prototype.darken=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l-=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.tint=function(e){return void 0===e&&(e=10),this.mix("white",e)},e.prototype.shade=function(e){return void 0===e&&(e=10),this.mix("black",e)},e.prototype.desaturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s-=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.saturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s+=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)},e.prototype.mix=function(t,n){void 0===n&&(n=50);var r=this.toRgb(),o=new e(t).toRgb(),i=n/100;return new e({r:(o.r-r.r)*i+r.r,g:(o.g-r.g)*i+r.g,b:(o.b-r.b)*i+r.b,a:(o.a-r.a)*i+r.a})},e.prototype.analogous=function(t,n){void 0===t&&(t=6),void 0===n&&(n=30);var r=this.toHsl(),o=360/n,i=[this];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,i.push(new e(r));return i},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){void 0===t&&(t=6);for(var n=this.toHsv(),r=n.h,o=n.s,i=n.v,a=[],l=1/t;t--;)a.push(new e({h:r,s:o,v:i})),i=(i+l)%1;return a},e.prototype.splitcomplement=function(){var t=this.toHsl(),n=t.h;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var n=this.toRgb(),r=new e(t).toRgb(),o=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/o,g:(n.g*n.a+r.g*r.a*(1-n.a))/o,b:(n.b*n.a+r.b*r.a*(1-n.a))/o,a:o})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var n=this.toHsl(),r=n.h,o=[this],i=360/t,a=1;a{"use strict";function r(e,t){(function(e){return"string"==typeof e&&-1!==e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!==e.indexOf("%")}(e);return e=360===t?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:e=360===t?(e<0?e%t+t:e%t)/parseFloat(String(t)):e%t/parseFloat(String(t))}function o(e){return Math.min(1,Math.max(0,e))}function i(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function a(e){return e<=1?"".concat(100*Number(e),"%"):e}function l(e){return 1===e.length?"0"+e:String(e)}n.d(t,{Cg:()=>r,J$:()=>o,Px:()=>a,TV:()=>i,wl:()=>l})},5470:(e,t,n)=>{"use strict";n.d(t,{A:()=>y});var r=n(6636),o=n(6540),i=n(961),a=n(998),l=(n(8210),n(8719));const c=o.createContext(null);var s=n(4241),u=n(981),d=[];var f=n(5089);function p(e){var t="rc-scrollbar-measure-".concat(Math.random().toString(36).substring(7)),n=document.createElement("div");n.id=t;var r,o,i=n.style;if(i.position="absolute",i.left="0",i.top="0",i.width="100px",i.height="100px",i.overflow="scroll",e){var a=getComputedStyle(e);i.scrollbarColor=a.scrollbarColor,i.scrollbarWidth=a.scrollbarWidth;var l=getComputedStyle(e,"::-webkit-scrollbar"),c=parseInt(l.width,10),s=parseInt(l.height,10);try{var u=c?"width: ".concat(l.width,";"):"",d=s?"height: ".concat(l.height,";"):"";(0,f.BD)("\n#".concat(t,"::-webkit-scrollbar {\n").concat(u,"\n").concat(d,"\n}"),t)}catch(m){console.error(m),r=c,o=s}}document.body.appendChild(n);var p=e&&r&&!isNaN(r)?r:n.offsetWidth-n.clientWidth,v=e&&o&&!isNaN(o)?o:n.offsetHeight-n.clientHeight;return document.body.removeChild(n),(0,f.m6)(t),{width:p,height:v}}var v="rc-util-locker-".concat(Date.now()),m=0;function h(e){var t=!!e,n=o.useState((function(){return m+=1,"".concat(v,"_").concat(m)})),i=(0,r.A)(n,1)[0];(0,u.A)((function(){if(t){var e=(r=document.body,"undefined"!=typeof document&&r&&r instanceof Element?p(r):{width:0,height:0}).width,n=document.body.scrollHeight>(window.innerHeight||document.documentElement.clientHeight)&&window.innerWidth>document.body.offsetWidth;(0,f.BD)("\nhtml body {\n overflow-y: hidden;\n ".concat(n?"width: calc(100% - ".concat(e,"px);"):"","\n}"),i)}else(0,f.m6)(i);var r;return function(){(0,f.m6)(i)}}),[t,i])}var g=!1;var b=function(e){return!1!==e&&((0,a.A)()&&e?"string"==typeof e?document.querySelector(e):"function"==typeof e?e():e:null)};const y=o.forwardRef((function(e,t){var n=e.open,f=e.autoLock,p=e.getContainer,v=(e.debug,e.autoDestroy),m=void 0===v||v,y=e.children,A=o.useState(n),w=(0,r.A)(A,2),S=w[0],x=w[1],C=S||n;o.useEffect((function(){(m||n)&&x(n)}),[n,m]);var k=o.useState((function(){return b(p)})),E=(0,r.A)(k,2),M=E[0],$=E[1];o.useEffect((function(){var e=b(p);$(null!=e?e:null)}));var O=function(e,t){var n=o.useState((function(){return(0,a.A)()?document.createElement("div"):null})),i=(0,r.A)(n,1)[0],l=o.useRef(!1),f=o.useContext(c),p=o.useState(d),v=(0,r.A)(p,2),m=v[0],h=v[1],g=f||(l.current?void 0:function(e){h((function(t){return[e].concat((0,s.A)(t))}))});function b(){i.parentElement||document.body.appendChild(i),l.current=!0}function y(){var e;null===(e=i.parentElement)||void 0===e||e.removeChild(i),l.current=!1}return(0,u.A)((function(){return e?f?f(b):b():y(),y}),[e]),(0,u.A)((function(){m.length&&(m.forEach((function(e){return e()})),h(d))}),[m]),[i,g]}(C&&!M),T=(0,r.A)(O,2),R=T[0],z=T[1],P=null!=M?M:R;h(f&&n&&(0,a.A)()&&(P===R||P===document.body));var N=null;y&&(0,l.f3)(y)&&t&&(N=y.ref);var I=(0,l.xK)(N,t);if(!C||!(0,a.A)()||void 0===M)return null;var L,j=!1===P||("boolean"==typeof L&&(g=L),g),_=y;return t&&(_=o.cloneElement(y,{ref:I})),o.createElement(c.Provider,{value:z},j?_:(0,i.createPortal)(_,P))}))},3723:(e,t,n)=>{"use strict";n.d(t,{b:()=>r});const r=(e,t,n)=>void 0!==n?n:`${e}-${t}`},3864:(e,t,n)=>{"use strict";n.d(t,{A:()=>bo});var r=n(6540),o=n(6942),i=n.n(o),a=n(9853),l=n(2279);const c=r.createContext(void 0),s=c,u=e=>{const t=r.useContext(s);return r.useMemo((()=>e?"string"==typeof e?null!=e?e:t:e instanceof Function?e(t):t:t),[e,t])},d=e=>{const{prefixCls:t,className:n,style:o,size:a,shape:l}=e,c=i()({[`${t}-lg`]:"large"===a,[`${t}-sm`]:"small"===a}),s=i()({[`${t}-circle`]:"circle"===l,[`${t}-square`]:"square"===l,[`${t}-round`]:"round"===l}),u=r.useMemo((()=>"number"==typeof a?{width:a,height:a,lineHeight:`${a}px`}:{}),[a]);return r.createElement("span",{className:i()(t,c,s,n),style:Object.assign(Object.assign({},u),o)})};var f=n(1466),p=n(665),v=n(336);const m=new f.Mo("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),h=e=>({height:e,lineHeight:(0,f.zA)(e)}),g=e=>Object.assign({width:e},h(e)),b=e=>({background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:m,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"}),y=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},h(e)),A=e=>{const{skeletonAvatarCls:t,gradientFromColor:n,controlHeight:r,controlHeightLG:o,controlHeightSM:i}=e;return{[`${t}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:n},g(r)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},g(o)),[`${t}${t}-sm`]:Object.assign({},g(i))}},w=e=>{const{controlHeight:t,borderRadiusSM:n,skeletonInputCls:r,controlHeightLG:o,controlHeightSM:i,gradientFromColor:a,calc:l}=e;return{[`${r}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:a,borderRadius:n},y(t,l)),[`${r}-lg`]:Object.assign({},y(o,l)),[`${r}-sm`]:Object.assign({},y(i,l))}},S=e=>Object.assign({width:e},h(e)),x=e=>{const{skeletonImageCls:t,imageSizeBase:n,gradientFromColor:r,borderRadiusSM:o,calc:i}=e;return{[`${t}`]:Object.assign(Object.assign({display:"flex",alignItems:"center",justifyContent:"center",verticalAlign:"top",background:r,borderRadius:o},S(i(n).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},S(n)),{maxWidth:i(n).mul(4).equal(),maxHeight:i(n).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}},C=(e,t,n)=>{const{skeletonButtonCls:r}=e;return{[`${n}${r}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${n}${r}-round`]:{borderRadius:t}}},k=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},h(e)),E=e=>{const{borderRadiusSM:t,skeletonButtonCls:n,controlHeight:r,controlHeightLG:o,controlHeightSM:i,gradientFromColor:a,calc:l}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[`${n}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:a,borderRadius:t,width:l(r).mul(2).equal(),minWidth:l(r).mul(2).equal()},k(r,l))},C(e,r,n)),{[`${n}-lg`]:Object.assign({},k(o,l))}),C(e,o,`${n}-lg`)),{[`${n}-sm`]:Object.assign({},k(i,l))}),C(e,i,`${n}-sm`))},M=e=>{const{componentCls:t,skeletonAvatarCls:n,skeletonTitleCls:r,skeletonParagraphCls:o,skeletonButtonCls:i,skeletonInputCls:a,skeletonImageCls:l,controlHeight:c,controlHeightLG:s,controlHeightSM:u,gradientFromColor:d,padding:f,marginSM:p,borderRadius:v,titleHeight:m,blockRadius:h,paragraphLiHeight:y,controlHeightXS:S,paragraphMarginTop:C}=e;return{[`${t}`]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:f,verticalAlign:"top",[`${n}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:d},g(c)),[`${n}-circle`]:{borderRadius:"50%"},[`${n}-lg`]:Object.assign({},g(s)),[`${n}-sm`]:Object.assign({},g(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[`${r}`]:{width:"100%",height:m,background:d,borderRadius:h,[`+ ${o}`]:{marginBlockStart:u}},[`${o}`]:{padding:0,"> li":{width:"100%",height:y,listStyle:"none",background:d,borderRadius:h,"+ li":{marginBlockStart:S}}},[`${o}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${r}, ${o} > li`]:{borderRadius:v}}},[`${t}-with-avatar ${t}-content`]:{[`${r}`]:{marginBlockStart:p,[`+ ${o}`]:{marginBlockStart:C}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},E(e)),A(e)),w(e)),x(e)),[`${t}${t}-block`]:{width:"100%",[`${i}`]:{width:"100%"},[`${a}`]:{width:"100%"}},[`${t}${t}-active`]:{[`\n ${r},\n ${o} > li,\n ${n},\n ${i},\n ${a},\n ${l}\n `]:Object.assign({},b(e))}}},$=(0,p.OF)("Skeleton",(e=>{const{componentCls:t,calc:n}=e,r=(0,v.h1)(e,{skeletonAvatarCls:`${t}-avatar`,skeletonTitleCls:`${t}-title`,skeletonParagraphCls:`${t}-paragraph`,skeletonButtonCls:`${t}-button`,skeletonInputCls:`${t}-input`,skeletonImageCls:`${t}-image`,imageSizeBase:n(e.controlHeight).mul(1.5).equal(),borderRadius:100,skeletonLoadingBackground:`linear-gradient(90deg, ${e.gradientFromColor} 25%, ${e.gradientToColor} 37%, ${e.gradientFromColor} 63%)`,skeletonLoadingMotionDuration:"1.4s"});return[M(r)]}),(e=>{const{colorFillContent:t,colorFill:n}=e;return{color:t,colorGradientEnd:n,gradientFromColor:t,gradientToColor:n,titleHeight:e.controlHeight/2,blockRadius:e.borderRadiusSM,paragraphMarginTop:e.marginLG+e.marginXXS,paragraphLiHeight:e.controlHeight/2}}),{deprecatedTokens:[["color","gradientFromColor"],["colorGradientEnd","gradientToColor"]]}),O=e=>{const{prefixCls:t,className:n,rootClassName:o,active:c,shape:s="circle",size:u="default"}=e,{getPrefixCls:f}=r.useContext(l.QO),p=f("skeleton",t),[v,m,h]=$(p),g=(0,a.A)(e,["prefixCls","className"]),b=i()(p,`${p}-element`,{[`${p}-active`]:c},n,o,m,h);return v(r.createElement("div",{className:b},r.createElement(d,Object.assign({prefixCls:`${p}-avatar`,shape:s,size:u},g))))},T=e=>{const{prefixCls:t,className:n,rootClassName:o,active:c,block:s=!1,size:u="default"}=e,{getPrefixCls:f}=r.useContext(l.QO),p=f("skeleton",t),[v,m,h]=$(p),g=(0,a.A)(e,["prefixCls"]),b=i()(p,`${p}-element`,{[`${p}-active`]:c,[`${p}-block`]:s},n,o,m,h);return v(r.createElement("div",{className:b},r.createElement(d,Object.assign({prefixCls:`${p}-button`,size:u},g))))},R=e=>{const{prefixCls:t,className:n,rootClassName:o,style:a,active:c}=e,{getPrefixCls:s}=r.useContext(l.QO),u=s("skeleton",t),[d,f,p]=$(u),v=i()(u,`${u}-element`,{[`${u}-active`]:c},n,o,f,p);return d(r.createElement("div",{className:v},r.createElement("div",{className:i()(`${u}-image`,n),style:a},r.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${u}-image-svg`},r.createElement("path",{d:"M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z",className:`${u}-image-path`})))))},z=e=>{const{prefixCls:t,className:n,rootClassName:o,active:c,block:s,size:u="default"}=e,{getPrefixCls:f}=r.useContext(l.QO),p=f("skeleton",t),[v,m,h]=$(p),g=(0,a.A)(e,["prefixCls"]),b=i()(p,`${p}-element`,{[`${p}-active`]:c,[`${p}-block`]:s},n,o,m,h);return v(r.createElement("div",{className:b},r.createElement(d,Object.assign({prefixCls:`${p}-input`,size:u},g))))};var P=n(8168);const N={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM288 604a64 64 0 10128 0 64 64 0 10-128 0zm118-224a48 48 0 1096 0 48 48 0 10-96 0zm158 228a96 96 0 10192 0 96 96 0 10-192 0zm148-314a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"dot-chart",theme:"outlined"};var I=n(8046),L=function(e,t){return r.createElement(I.A,(0,P.A)({},e,{ref:t,icon:N}))};const j=r.forwardRef(L),_=e=>{const{prefixCls:t,className:n,rootClassName:o,style:a,active:c,children:s}=e,{getPrefixCls:u}=r.useContext(l.QO),d=u("skeleton",t),[f,p,v]=$(d),m=i()(d,`${d}-element`,{[`${d}-active`]:c},p,n,o,v),h=null!=s?s:r.createElement(j,null);return f(r.createElement("div",{className:m},r.createElement("div",{className:i()(`${d}-image`,n),style:a},h)))};var H=n(4241);const D=(e,t)=>{const{width:n,rows:r=2}=t;return Array.isArray(n)?n[e]:r-1===e?n:void 0},B=e=>{const{prefixCls:t,className:n,style:o,rows:a}=e,l=(0,H.A)(Array(a)).map(((t,n)=>r.createElement("li",{key:n,style:{width:D(n,e)}})));return r.createElement("ul",{className:i()(t,n),style:o},l)},W=e=>{let{prefixCls:t,className:n,width:o,style:a}=e;return r.createElement("h3",{className:i()(t,n),style:Object.assign({width:o},a)})};function F(e){return e&&"object"==typeof e?e:{}}const X=e=>{const{prefixCls:t,loading:n,className:o,rootClassName:a,style:c,children:s,avatar:u=!1,title:f=!0,paragraph:p=!0,active:v,round:m}=e,{getPrefixCls:h,direction:g,skeleton:b}=r.useContext(l.QO),y=h("skeleton",t),[A,w,S]=$(y);if(n||!("loading"in e)){const e=!!u,t=!!f,n=!!p;let l,s;if(e){const e=Object.assign(Object.assign({prefixCls:`${y}-avatar`},function(e,t){return e&&!t?{size:"large",shape:"square"}:{size:"large",shape:"circle"}}(t,n)),F(u));l=r.createElement("div",{className:`${y}-header`},r.createElement(d,Object.assign({},e)))}if(t||n){let o,i;if(t){const t=Object.assign(Object.assign({prefixCls:`${y}-title`},function(e,t){return!e&&t?{width:"38%"}:e&&t?{width:"50%"}:{}}(e,n)),F(f));o=r.createElement(W,Object.assign({},t))}if(n){const n=Object.assign(Object.assign({prefixCls:`${y}-paragraph`},function(e,t){const n={};return e&&t||(n.width="61%"),n.rows=!e&&t?3:2,n}(e,t)),F(p));i=r.createElement(B,Object.assign({},n))}s=r.createElement("div",{className:`${y}-content`},o,i)}const h=i()(y,{[`${y}-with-avatar`]:e,[`${y}-active`]:v,[`${y}-rtl`]:"rtl"===g,[`${y}-round`]:m},null==b?void 0:b.className,o,a,w,S);return A(r.createElement("div",{className:h,style:Object.assign(Object.assign({},null==b?void 0:b.style),c)},l,s))}return null!=s?s:null};X.Button=T,X.Avatar=O,X.Input=z,X.Image=R,X.Node=_;const K=X;var G=n(6467);const q={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M176 511a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"ellipsis",theme:"outlined"};var Y=function(e,t){return r.createElement(I.A,(0,P.A)({},e,{ref:t,icon:q}))};const U=r.forwardRef(Y);const V={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z"}},{tag:"path",attrs:{d:"M192 474h672q8 0 8 8v60q0 8-8 8H160q-8 0-8-8v-60q0-8 8-8z"}}]},name:"plus",theme:"outlined"};var Q=function(e,t){return r.createElement(I.A,(0,P.A)({},e,{ref:t,icon:V}))};const Z=r.forwardRef(Q);var J=n(4467),ee=n(9379),te=n(6636),ne=n(2284),re=n(45),oe=n(2533);const ie=function(){if("undefined"==typeof navigator||"undefined"==typeof window)return!1;var e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(null==e?void 0:e.substr(0,4))},ae=(0,r.createContext)(null);var le=n(6351);function ce(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[];return r.Children.forEach(e,(function(e){(null!=e||t.keepEmpty)&&(Array.isArray(e)?n=n.concat(ce(e)):(0,le.isFragment)(e)&&e.props?n=n.concat(ce(e.props.children,t)):n.push(e))})),n}var se=n(8210),ue=n(4207),de=n(8719),fe=r.createContext(null);var pe=n(3591),ve=new Map;var me=new pe.A((function(e){e.forEach((function(e){var t,n=e.target;null===(t=ve.get(n))||void 0===t||t.forEach((function(e){return e(n)}))}))}));var he=n(3029),ge=n(2901),be=n(5501),ye=n(9426),Ae=function(e){(0,be.A)(n,e);var t=(0,ye.A)(n);function n(){return(0,he.A)(this,n),t.apply(this,arguments)}return(0,ge.A)(n,[{key:"render",value:function(){return this.props.children}}]),n}(r.Component);function we(e,t){var n=e.children,o=e.disabled,i=r.useRef(null),a=r.useRef(null),l=r.useContext(fe),c="function"==typeof n,s=c?n(i):n,u=r.useRef({width:-1,height:-1,offsetWidth:-1,offsetHeight:-1}),d=!c&&r.isValidElement(s)&&(0,de.f3)(s),f=d?s.ref:null,p=(0,de.xK)(f,i),v=function(){var e;return(0,ue.A)(i.current)||(i.current&&"object"===(0,ne.A)(i.current)?(0,ue.A)(null===(e=i.current)||void 0===e?void 0:e.nativeElement):null)||(0,ue.A)(a.current)};r.useImperativeHandle(t,(function(){return v()}));var m=r.useRef(e);m.current=e;var h=r.useCallback((function(e){var t=m.current,n=t.onResize,r=t.data,o=e.getBoundingClientRect(),i=o.width,a=o.height,c=e.offsetWidth,s=e.offsetHeight,d=Math.floor(i),f=Math.floor(a);if(u.current.width!==d||u.current.height!==f||u.current.offsetWidth!==c||u.current.offsetHeight!==s){var p={width:d,height:f,offsetWidth:c,offsetHeight:s};u.current=p;var v=c===Math.round(i)?i:c,h=s===Math.round(a)?a:s,g=(0,ee.A)((0,ee.A)({},p),{},{offsetWidth:v,offsetHeight:h});null==l||l(g,e,r),n&&Promise.resolve().then((function(){n(g,e)}))}}),[]);return r.useEffect((function(){var e,t,n=v();return n&&!o&&(e=n,t=h,ve.has(e)||(ve.set(e,new Set),me.observe(e)),ve.get(e).add(t)),function(){return function(e,t){ve.has(e)&&(ve.get(e).delete(t),ve.get(e).size||(me.unobserve(e),ve.delete(e)))}(n,h)}}),[i.current,o]),r.createElement(Ae,{ref:a},d?r.cloneElement(s,{ref:p}):s)}const Se=r.forwardRef(we);function xe(e,t){var n=e.children;return("function"==typeof n?[n]:ce(n)).map((function(n,o){var i=(null==n?void 0:n.key)||"".concat("rc-observer-key","-").concat(o);return r.createElement(Se,(0,P.A)({},e,{key:i,ref:0===o?t:void 0}),n)}))}var Ce=r.forwardRef(xe);Ce.Collection=function(e){var t=e.children,n=e.onBatchResize,o=r.useRef(0),i=r.useRef([]),a=r.useContext(fe),l=r.useCallback((function(e,t,r){o.current+=1;var l=o.current;i.current.push({size:e,element:t,data:r}),Promise.resolve().then((function(){l===o.current&&(null==n||n(i.current),i.current=[])})),null==a||a(e,t,r)}),[n,a]);return r.createElement(fe.Provider,{value:l},t)};const ke=Ce;var Ee=n(6956),Me=n(5371);const $e=function(e){var t=e.activeTabOffset,n=e.horizontal,o=e.rtl,i=e.indicator,a=void 0===i?{}:i,l=a.size,c=a.align,s=void 0===c?"center":c,u=(0,r.useState)(),d=(0,te.A)(u,2),f=d[0],p=d[1],v=(0,r.useRef)(),m=r.useCallback((function(e){return"function"==typeof l?l(e):"number"==typeof l?l:e}),[l]);function h(){Me.A.cancel(v.current)}return(0,r.useEffect)((function(){var e={};if(t)if(n){e.width=m(t.width);var r=o?"right":"left";"start"===s&&(e[r]=t[r]),"center"===s&&(e[r]=t[r]+t.width/2,e.transform=o?"translateX(50%)":"translateX(-50%)"),"end"===s&&(e[r]=t[r]+t.width,e.transform="translateX(-100%)")}else e.height=m(t.height),"start"===s&&(e.top=t.top),"center"===s&&(e.top=t.top+t.height/2,e.transform="translateY(-50%)"),"end"===s&&(e.top=t.top+t.height,e.transform="translateY(-100%)");return h(),v.current=(0,Me.A)((function(){p(e)})),h}),[t,n,o,s,m]),{style:f}};var Oe={width:0,height:0,left:0,top:0};function Te(e,t){var n=r.useRef(e),o=r.useState({}),i=(0,te.A)(o,2)[1];return[n.current,function(e){var r="function"==typeof e?e(n.current):e;r!==n.current&&t(r,n.current),n.current=r,i({})}]}var Re=Math.pow(.995,20);var ze=n(981);function Pe(e){var t=(0,r.useState)(0),n=(0,te.A)(t,2),o=n[0],i=n[1],a=(0,r.useRef)(0),l=(0,r.useRef)();return l.current=e,(0,ze.o)((function(){var e;null===(e=l.current)||void 0===e||e.call(l)}),[o]),function(){a.current===o&&(a.current+=1,i(a.current))}}var Ne={width:0,height:0,left:0,top:0,right:0};function Ie(e){var t;return e instanceof Map?(t={},e.forEach((function(e,n){t[n]=e}))):t=e,JSON.stringify(t)}function Le(e){return String(e).replace(/"/g,"TABS_DQ")}function je(e,t,n,r){return!(!n||r||!1===e||void 0===e&&(!1===t||null===t))}var _e=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.editable,i=e.locale,a=e.style;return o&&!1!==o.showAdd?r.createElement("button",{ref:t,type:"button",className:"".concat(n,"-nav-add"),style:a,"aria-label":(null==i?void 0:i.addAriaLabel)||"Add tab",onClick:function(e){o.onEdit("add",{event:e})}},o.addIcon||"+"):null}));const He=_e;const De=r.forwardRef((function(e,t){var n,o=e.position,i=e.prefixCls,a=e.extra;if(!a)return null;var l={};return"object"!==(0,ne.A)(a)||r.isValidElement(a)?l.right=a:l=a,"right"===o&&(n=l.right),"left"===o&&(n=l.left),n?r.createElement("div",{className:"".concat(i,"-extra-content"),ref:t},n):null}));var Be=n(5470),We=n(2633),Fe=n(6855),Xe=n(8542);function Ke(e){var t=e.prefixCls,n=e.align,o=e.arrow,a=e.arrowPos,l=o||{},c=l.className,s=l.content,u=a.x,d=void 0===u?0:u,f=a.y,p=void 0===f?0:f,v=r.useRef();if(!n||!n.points)return null;var m={position:"absolute"};if(!1!==n.autoArrow){var h=n.points[0],g=n.points[1],b=h[0],y=h[1],A=g[0],w=g[1];b!==A&&["t","b"].includes(b)?"t"===b?m.top=0:m.bottom=0:m.top=p,y!==w&&["l","r"].includes(y)?"l"===y?m.left=0:m.right=0:m.left=d}return r.createElement("div",{ref:v,className:i()("".concat(t,"-arrow"),c),style:m},s)}function Ge(e){var t=e.prefixCls,n=e.open,o=e.zIndex,a=e.mask,l=e.motion;return a?r.createElement(Xe.Ay,(0,P.A)({},l,{motionAppear:!0,visible:n,removeOnLeave:!0}),(function(e){var n=e.className;return r.createElement("div",{style:{zIndex:o},className:i()("".concat(t,"-mask"),n)})})):null}const qe=r.memo((function(e){return e.children}),(function(e,t){return t.cache}));var Ye=r.forwardRef((function(e,t){var n=e.popup,o=e.className,a=e.prefixCls,l=e.style,c=e.target,s=e.onVisibleChanged,u=e.open,d=e.keepDom,f=e.fresh,p=e.onClick,v=e.mask,m=e.arrow,h=e.arrowPos,g=e.align,b=e.motion,y=e.maskMotion,A=e.forceRender,w=e.getPopupContainer,S=e.autoDestroy,x=e.portal,C=e.zIndex,k=e.onMouseEnter,E=e.onMouseLeave,M=e.onPointerEnter,$=e.ready,O=e.offsetX,T=e.offsetY,R=e.offsetR,z=e.offsetB,N=e.onAlign,I=e.onPrepare,L=e.stretch,j=e.targetWidth,_=e.targetHeight,H="function"==typeof n?n():n,D=u||d,B=(null==w?void 0:w.length)>0,W=r.useState(!w||!B),F=(0,te.A)(W,2),X=F[0],K=F[1];if((0,ze.A)((function(){!X&&B&&c&&K(!0)}),[X,B,c]),!X)return null;var G="auto",q={left:"-1000vw",top:"-1000vh",right:G,bottom:G};if($||!u){var Y,U=g.points,V=g.dynamicInset||(null===(Y=g._experimental)||void 0===Y?void 0:Y.dynamicInset),Q=V&&"r"===U[0][1],Z=V&&"b"===U[0][0];Q?(q.right=R,q.left=G):(q.left=O,q.right=G),Z?(q.bottom=z,q.top=G):(q.top=T,q.bottom=G)}var J={};return L&&(L.includes("height")&&_?J.height=_:L.includes("minHeight")&&_&&(J.minHeight=_),L.includes("width")&&j?J.width=j:L.includes("minWidth")&&j&&(J.minWidth=j)),u||(J.pointerEvents="none"),r.createElement(x,{open:A||D,getContainer:w&&function(){return w(c)},autoDestroy:S},r.createElement(Ge,{prefixCls:a,open:u,zIndex:C,mask:v,motion:y}),r.createElement(ke,{onResize:N,disabled:!u},(function(e){return r.createElement(Xe.Ay,(0,P.A)({motionAppear:!0,motionEnter:!0,motionLeave:!0,removeOnLeave:!1,forceRender:A,leavedClassName:"".concat(a,"-hidden")},b,{onAppearPrepare:I,onEnterPrepare:I,visible:u,onVisibleChanged:function(e){var t;null==b||null===(t=b.onVisibleChanged)||void 0===t||t.call(b,e),s(e)}}),(function(n,c){var s=n.className,d=n.style,v=i()(a,s,o);return r.createElement("div",{ref:(0,de.K4)(e,t,c),className:v,style:(0,ee.A)((0,ee.A)((0,ee.A)((0,ee.A)({"--arrow-x":"".concat(h.x||0,"px"),"--arrow-y":"".concat(h.y||0,"px")},q),J),d),{},{boxSizing:"border-box",zIndex:C},l),onMouseEnter:k,onMouseLeave:E,onPointerEnter:M,onClick:p},m&&r.createElement(Ke,{prefixCls:a,arrow:m,arrowPos:h,align:g}),r.createElement(qe,{cache:!u&&!f},H))}))})))}));const Ue=Ye;const Ve=r.forwardRef((function(e,t){var n=e.children,o=e.getTriggerDOMNode,i=(0,de.f3)(n),a=r.useCallback((function(e){(0,de.Xf)(t,o?o(e):e)}),[o]),l=(0,de.xK)(a,n.ref);return i?r.cloneElement(n,{ref:l}):n}));const Qe=r.createContext(null);function Ze(e){return e?Array.isArray(e)?e:[e]:[]}const Je=function(e){if(!e)return!1;if(e instanceof Element){if(e.offsetParent)return!0;if(e.getBBox){var t=e.getBBox(),n=t.width,r=t.height;if(n||r)return!0}if(e.getBoundingClientRect){var o=e.getBoundingClientRect(),i=o.width,a=o.height;if(i||a)return!0}}return!1};function et(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return(arguments.length>2?arguments[2]:void 0)?e[0]===t[0]:e[0]===t[0]&&e[1]===t[1]}function tt(e,t,n,r){return t||(n?{motionName:"".concat(e,"-").concat(n)}:r?{motionName:r}:null)}function nt(e){return e.ownerDocument.defaultView}function rt(e){for(var t=[],n=null==e?void 0:e.parentElement,r=["hidden","scroll","clip","auto"];n;){var o=nt(n).getComputedStyle(n);[o.overflowX,o.overflowY,o.overflow].some((function(e){return r.includes(e)}))&&t.push(n),n=n.parentElement}return t}function ot(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return Number.isNaN(e)?t:e}function it(e){return ot(parseFloat(e),0)}function at(e,t){var n=(0,ee.A)({},e);return(t||[]).forEach((function(e){if(!(e instanceof HTMLBodyElement||e instanceof HTMLHtmlElement)){var t=nt(e).getComputedStyle(e),r=t.overflow,o=t.overflowClipMargin,i=t.borderTopWidth,a=t.borderBottomWidth,l=t.borderLeftWidth,c=t.borderRightWidth,s=e.getBoundingClientRect(),u=e.offsetHeight,d=e.clientHeight,f=e.offsetWidth,p=e.clientWidth,v=it(i),m=it(a),h=it(l),g=it(c),b=ot(Math.round(s.width/f*1e3)/1e3),y=ot(Math.round(s.height/u*1e3)/1e3),A=(f-p-h-g)*b,w=(u-d-v-m)*y,S=v*y,x=m*y,C=h*b,k=g*b,E=0,M=0;if("clip"===r){var $=it(o);E=$*b,M=$*y}var O=s.x+C-E,T=s.y+S-M,R=O+s.width+2*E-C-k-A,z=T+s.height+2*M-S-x-w;n.left=Math.max(n.left,O),n.top=Math.max(n.top,T),n.right=Math.min(n.right,R),n.bottom=Math.min(n.bottom,z)}})),n}function lt(e){var t="".concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0),n=t.match(/^(.*)\%$/);return n?e*(parseFloat(n[1])/100):parseFloat(t)}function ct(e,t){var n=t||[],r=(0,te.A)(n,2),o=r[0],i=r[1];return[lt(e.width,o),lt(e.height,i)]}function st(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return[e[0],e[1]]}function ut(e,t){var n,r=t[0],o=t[1];return n="t"===r?e.y:"b"===r?e.y+e.height:e.y+e.height/2,{x:"l"===o?e.x:"r"===o?e.x+e.width:e.x+e.width/2,y:n}}function dt(e,t){var n={t:"b",b:"t",l:"r",r:"l"};return e.map((function(e,r){return r===t?n[e]||"c":e})).join("")}var ft=["prefixCls","children","action","showAction","hideAction","popupVisible","defaultPopupVisible","onPopupVisibleChange","afterPopupVisibleChange","mouseEnterDelay","mouseLeaveDelay","focusDelay","blurDelay","mask","maskClosable","getPopupContainer","forceRender","autoDestroy","destroyPopupOnHide","popup","popupClassName","popupStyle","popupPlacement","builtinPlacements","popupAlign","zIndex","stretch","getPopupClassNameFromAlign","fresh","alignPoint","onPopupClick","onPopupAlign","arrow","popupMotion","maskMotion","popupTransitionName","popupAnimation","maskTransitionName","maskAnimation","className","getTriggerDOMNode"];const pt=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Be.A,t=r.forwardRef((function(t,n){var o=t.prefixCls,a=void 0===o?"rc-trigger-popup":o,l=t.children,c=t.action,s=void 0===c?"hover":c,u=t.showAction,d=t.hideAction,f=t.popupVisible,p=t.defaultPopupVisible,v=t.onPopupVisibleChange,m=t.afterPopupVisibleChange,h=t.mouseEnterDelay,g=t.mouseLeaveDelay,b=void 0===g?.1:g,y=t.focusDelay,A=t.blurDelay,w=t.mask,S=t.maskClosable,x=void 0===S||S,C=t.getPopupContainer,k=t.forceRender,E=t.autoDestroy,M=t.destroyPopupOnHide,$=t.popup,O=t.popupClassName,T=t.popupStyle,R=t.popupPlacement,z=t.builtinPlacements,P=void 0===z?{}:z,N=t.popupAlign,I=t.zIndex,L=t.stretch,j=t.getPopupClassNameFromAlign,_=t.fresh,D=t.alignPoint,B=t.onPopupClick,W=t.onPopupAlign,F=t.arrow,X=t.popupMotion,K=t.maskMotion,G=t.popupTransitionName,q=t.popupAnimation,Y=t.maskTransitionName,U=t.maskAnimation,V=t.className,Q=t.getTriggerDOMNode,Z=(0,re.A)(t,ft),J=E||M||!1,ne=r.useState(!1),oe=(0,te.A)(ne,2),ae=oe[0],le=oe[1];(0,ze.A)((function(){le(ie())}),[]);var ce=r.useRef({}),se=r.useContext(Qe),de=r.useMemo((function(){return{registerSubPopup:function(e,t){ce.current[e]=t,null==se||se.registerSubPopup(e,t)}}}),[se]),fe=(0,Fe.A)(),pe=r.useState(null),ve=(0,te.A)(pe,2),me=ve[0],he=ve[1],ge=r.useRef(null),be=(0,Ee.A)((function(e){ge.current=e,(0,ue.f)(e)&&me!==e&&he(e),null==se||se.registerSubPopup(fe,e)})),ye=r.useState(null),Ae=(0,te.A)(ye,2),we=Ae[0],Se=Ae[1],xe=r.useRef(null),Ce=(0,Ee.A)((function(e){(0,ue.f)(e)&&we!==e&&(Se(e),xe.current=e)})),Me=r.Children.only(l),$e=(null==Me?void 0:Me.props)||{},Oe={},Te=(0,Ee.A)((function(e){var t,n,r=we;return(null==r?void 0:r.contains(e))||(null===(t=(0,We.j)(r))||void 0===t?void 0:t.host)===e||e===r||(null==me?void 0:me.contains(e))||(null===(n=(0,We.j)(me))||void 0===n?void 0:n.host)===e||e===me||Object.values(ce.current).some((function(t){return(null==t?void 0:t.contains(e))||e===t}))})),Re=tt(a,X,q,G),Pe=tt(a,K,U,Y),Ne=r.useState(p||!1),Ie=(0,te.A)(Ne,2),Le=Ie[0],je=Ie[1],_e=null!=f?f:Le,He=(0,Ee.A)((function(e){void 0===f&&je(e)}));(0,ze.A)((function(){je(f||!1)}),[f]);var De=r.useRef(_e);De.current=_e;var Be=r.useRef([]);Be.current=[];var Xe=(0,Ee.A)((function(e){var t;He(e),(null!==(t=Be.current[Be.current.length-1])&&void 0!==t?t:_e)!==e&&(Be.current.push(e),null==v||v(e))})),Ke=r.useRef(),Ge=function(){clearTimeout(Ke.current)},qe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;Ge(),0===t?Xe(e):Ke.current=setTimeout((function(){Xe(e)}),1e3*t)};r.useEffect((function(){return Ge}),[]);var Ye=r.useState(!1),it=(0,te.A)(Ye,2),lt=it[0],pt=it[1];(0,ze.A)((function(e){e&&!_e||pt(!0)}),[_e]);var vt=r.useState(null),mt=(0,te.A)(vt,2),ht=mt[0],gt=mt[1],bt=r.useState([0,0]),yt=(0,te.A)(bt,2),At=yt[0],wt=yt[1],St=function(e){wt([e.clientX,e.clientY])},xt=function(e,t,n,o,i,a,l){var c=r.useState({ready:!1,offsetX:0,offsetY:0,offsetR:0,offsetB:0,arrowX:0,arrowY:0,scaleX:1,scaleY:1,align:i[o]||{}}),s=(0,te.A)(c,2),u=s[0],d=s[1],f=r.useRef(0),p=r.useMemo((function(){return t?rt(t):[]}),[t]),v=r.useRef({});e||(v.current={});var m=(0,Ee.A)((function(){if(t&&n&&e){var r,c,s,u=t,f=u.ownerDocument,m=nt(u).getComputedStyle(u),h=m.width,g=m.height,b=m.position,y=u.style.left,A=u.style.top,w=u.style.right,S=u.style.bottom,x=u.style.overflow,C=(0,ee.A)((0,ee.A)({},i[o]),a),k=f.createElement("div");if(null===(r=u.parentElement)||void 0===r||r.appendChild(k),k.style.left="".concat(u.offsetLeft,"px"),k.style.top="".concat(u.offsetTop,"px"),k.style.position=b,k.style.height="".concat(u.offsetHeight,"px"),k.style.width="".concat(u.offsetWidth,"px"),u.style.left="0",u.style.top="0",u.style.right="auto",u.style.bottom="auto",u.style.overflow="hidden",Array.isArray(n))s={x:n[0],y:n[1],width:0,height:0};else{var E=n.getBoundingClientRect();s={x:E.x,y:E.y,width:E.width,height:E.height}}var M=u.getBoundingClientRect(),$=f.documentElement,O=$.clientWidth,T=$.clientHeight,R=$.scrollWidth,z=$.scrollHeight,P=$.scrollTop,N=$.scrollLeft,I=M.height,L=M.width,j=s.height,_=s.width,H={left:0,top:0,right:O,bottom:T},D={left:-N,top:-P,right:R-N,bottom:z-P},B=C.htmlRegion,W="visible",F="visibleFirst";"scroll"!==B&&B!==F&&(B=W);var X=B===F,K=at(D,p),G=at(H,p),q=B===W?G:K,Y=X?G:q;u.style.left="auto",u.style.top="auto",u.style.right="0",u.style.bottom="0";var U=u.getBoundingClientRect();u.style.left=y,u.style.top=A,u.style.right=w,u.style.bottom=S,u.style.overflow=x,null===(c=u.parentElement)||void 0===c||c.removeChild(k);var V=ot(Math.round(L/parseFloat(h)*1e3)/1e3),Q=ot(Math.round(I/parseFloat(g)*1e3)/1e3);if(0===V||0===Q||(0,ue.f)(n)&&!Je(n))return;var Z=C.offset,J=C.targetOffset,ne=ct(M,Z),re=(0,te.A)(ne,2),oe=re[0],ie=re[1],ae=ct(s,J),le=(0,te.A)(ae,2),ce=le[0],se=le[1];s.x-=ce,s.y-=se;var de=C.points||[],fe=(0,te.A)(de,2),pe=fe[0],ve=st(fe[1]),me=st(pe),he=ut(s,ve),ge=ut(M,me),be=(0,ee.A)({},C),ye=he.x-ge.x+oe,Ae=he.y-ge.y+ie;function wt(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:q,r=M.x+e,o=M.y+t,i=r+L,a=o+I,l=Math.max(r,n.left),c=Math.max(o,n.top),s=Math.min(i,n.right),u=Math.min(a,n.bottom);return Math.max(0,(s-l)*(u-c))}var we,Se,xe,Ce,ke=wt(ye,Ae),Ee=wt(ye,Ae,G),Me=ut(s,["t","l"]),$e=ut(M,["t","l"]),Oe=ut(s,["b","r"]),Te=ut(M,["b","r"]),Re=C.overflow||{},ze=Re.adjustX,Pe=Re.adjustY,Ne=Re.shiftX,Ie=Re.shiftY,Le=function(e){return"boolean"==typeof e?e:e>=0};function St(){we=M.y+Ae,Se=we+I,xe=M.x+ye,Ce=xe+L}St();var je=Le(Pe),_e=me[0]===ve[0];if(je&&"t"===me[0]&&(Se>Y.bottom||v.current.bt)){var He=Ae;_e?He-=I-j:He=Me.y-Te.y-ie;var De=wt(ye,He),Be=wt(ye,He,G);De>ke||De===ke&&(!X||Be>=Ee)?(v.current.bt=!0,Ae=He,ie=-ie,be.points=[dt(me,0),dt(ve,0)]):v.current.bt=!1}if(je&&"b"===me[0]&&(weke||Fe===ke&&(!X||Xe>=Ee)?(v.current.tb=!0,Ae=We,ie=-ie,be.points=[dt(me,0),dt(ve,0)]):v.current.tb=!1}var Ke=Le(ze),Ge=me[1]===ve[1];if(Ke&&"l"===me[1]&&(Ce>Y.right||v.current.rl)){var qe=ye;Ge?qe-=L-_:qe=Me.x-Te.x-oe;var Ye=wt(qe,Ae),Ue=wt(qe,Ae,G);Ye>ke||Ye===ke&&(!X||Ue>=Ee)?(v.current.rl=!0,ye=qe,oe=-oe,be.points=[dt(me,1),dt(ve,1)]):v.current.rl=!1}if(Ke&&"r"===me[1]&&(xeke||Qe===ke&&(!X||Ze>=Ee)?(v.current.lr=!0,ye=Ve,oe=-oe,be.points=[dt(me,1),dt(ve,1)]):v.current.lr=!1}St();var et=!0===Ne?0:Ne;"number"==typeof et&&(xeG.right&&(ye-=Ce-G.right-oe,s.x>G.right-et&&(ye+=s.x-G.right+et)));var tt=!0===Ie?0:Ie;"number"==typeof tt&&(weG.bottom&&(Ae-=Se-G.bottom-ie,s.y>G.bottom-tt&&(Ae+=s.y-G.bottom+tt)));var rt=M.x+ye,it=rt+L,lt=M.y+Ae,ft=lt+I,pt=s.x,vt=pt+_,mt=s.y,ht=mt+j,gt=(Math.max(rt,pt)+Math.min(it,vt))/2-rt,bt=(Math.max(lt,mt)+Math.min(ft,ht))/2-lt;null==l||l(t,be);var yt=U.right-M.x-(ye+M.width),At=U.bottom-M.y-(Ae+M.height);d({ready:!0,offsetX:ye/V,offsetY:Ae/Q,offsetR:yt/V,offsetB:At/Q,arrowX:gt/V,arrowY:bt/Q,scaleX:V,scaleY:Q,align:be})}})),h=function(){d((function(e){return(0,ee.A)((0,ee.A)({},e),{},{ready:!1})}))};return(0,ze.A)(h,[o]),(0,ze.A)((function(){e||h()}),[e]),[u.ready,u.offsetX,u.offsetY,u.offsetR,u.offsetB,u.arrowX,u.arrowY,u.scaleX,u.scaleY,u.align,function(){f.current+=1;var e=f.current;Promise.resolve().then((function(){f.current===e&&m()}))}]}(_e,me,D?At:we,R,P,N,W),Ct=(0,te.A)(xt,11),kt=Ct[0],Et=Ct[1],Mt=Ct[2],$t=Ct[3],Ot=Ct[4],Tt=Ct[5],Rt=Ct[6],zt=Ct[7],Pt=Ct[8],Nt=Ct[9],It=Ct[10],Lt=function(e,t,n,o){return r.useMemo((function(){var r=Ze(null!=n?n:t),i=Ze(null!=o?o:t),a=new Set(r),l=new Set(i);return e&&(a.has("hover")&&(a.delete("hover"),a.add("click")),l.has("hover")&&(l.delete("hover"),l.add("click"))),[a,l]}),[e,t,n,o])}(ae,s,u,d),jt=(0,te.A)(Lt,2),_t=jt[0],Ht=jt[1],Dt=_t.has("click"),Bt=Ht.has("click")||Ht.has("contextMenu"),Wt=(0,Ee.A)((function(){lt||It()}));!function(e,t,n,r,o){(0,ze.A)((function(){if(e&&t&&n){var i=n,a=rt(t),l=rt(i),c=nt(i),s=new Set([c].concat((0,H.A)(a),(0,H.A)(l)));function u(){r(),o()}return s.forEach((function(e){e.addEventListener("scroll",u,{passive:!0})})),c.addEventListener("resize",u,{passive:!0}),r(),function(){s.forEach((function(e){e.removeEventListener("scroll",u),c.removeEventListener("resize",u)}))}}}),[e,t,n])}(_e,we,me,Wt,(function(){De.current&&D&&Bt&&qe(!1)})),(0,ze.A)((function(){Wt()}),[At,R]),(0,ze.A)((function(){!_e||null!=P&&P[R]||Wt()}),[JSON.stringify(N)]);var Ft=r.useMemo((function(){var e=function(e,t,n,r){for(var o=n.points,i=Object.keys(e),a=0;a1?a-1:0),c=1;c1?n-1:0),o=1;o1?n-1:0),o=1;oh,ge=(0,r.useMemo)((function(){var e=l;return ve?e=null===O&&k?l:l.slice(0,Math.min(l.length,R/f)):"number"==typeof h&&(e=l.slice(0,h)),e}),[l,f,O,h,ve]),be=(0,r.useMemo)((function(){return ve?l.slice(ae+1):l.slice(ge.length)}),[l,ge,ve,ae]),ye=(0,r.useCallback)((function(e,t){var n;return"function"==typeof u?u(e):null!==(n=u&&(null==e?void 0:e[u]))&&void 0!==n?n:t}),[u]),Ae=(0,r.useCallback)(c||function(e){return e},[c]);function we(e,t,n){(oe!==e||void 0!==t&&t!==Q)&&(ie(e),n||(ue(eR){we(r-1,e-o-q+F);break}}y&&xe(0)+q>R&&Z(null)}}),[R,I,F,q,ye,ge]);var Ce=se&&!!be.length,Ee={};null!==Q&&ve&&(Ee={position:"absolute",left:Q,top:0});var Me,$e={prefixCls:de,responsive:ve,component:S,invalidate:me},Oe=s?function(e,t){var n=ye(e,t);return r.createElement(zt.Provider,{key:n,value:(0,ee.A)((0,ee.A)({},$e),{},{order:t,item:e,itemKey:n,registerSize:Se,display:t<=ae})},s(e,t))}:function(e,t){var n=ye(e,t);return r.createElement($t,(0,P.A)({},$e,{order:t,key:n,item:e,renderItem:Ae,itemKey:n,registerSize:Se,display:t<=ae}))},Te={order:Ce?ae:Number.MAX_SAFE_INTEGER,className:"".concat(de,"-rest"),registerSize:function(e,t){X(t),D(F)},display:Ce};if(b)b&&(Me=r.createElement(zt.Provider,{value:(0,ee.A)((0,ee.A)({},$e),Te)},b(be)));else{var Re=g||Wt;Me=r.createElement($t,(0,P.A)({},$e,Te),"function"==typeof Re?Re(be):Re)}var Pe=r.createElement(w,(0,P.A)({className:i()(!me&&o,m),style:v,ref:t},C),ge.map(Oe),he?Me:null,y&&r.createElement($t,(0,P.A)({},$e,{responsive:pe,responsiveDisabled:!ve,order:ae,className:"".concat(de,"-suffix"),registerSize:function(e,t){Y(t)},display:!0,style:Ee}),y));return pe&&(Pe=r.createElement(ke,{onResize:function(e,t){T(t.clientWidth)},disabled:!ve},Pe)),Pe}var Xt=r.forwardRef(Ft);Xt.displayName="Overflow",Xt.Item=_t,Xt.RESPONSIVE=Dt,Xt.INVALIDATE=Bt;const Kt=Xt;var Gt=n(3210),qt=r.createContext(null);function Yt(e,t){return void 0===e?null:"".concat(e,"-").concat(t)}function Ut(e){return Yt(r.useContext(qt),e)}var Vt=n(8104),Qt=["children","locked"],Zt=r.createContext(null);function Jt(e){var t=e.children,n=e.locked,o=(0,re.A)(e,Qt),i=r.useContext(Zt),a=(0,Vt.A)((function(){return e=i,t=o,n=(0,ee.A)({},e),Object.keys(t).forEach((function(e){var r=t[e];void 0!==r&&(n[e]=r)})),n;var e,t,n}),[i,o],(function(e,t){return!(n||e[0]===t[0]&&(0,Gt.A)(e[1],t[1],!0))}));return r.createElement(Zt.Provider,{value:a},t)}var en=[],tn=r.createContext(null);function nn(){return r.useContext(tn)}var rn=r.createContext(en);function on(e){var t=r.useContext(rn);return r.useMemo((function(){return void 0!==e?[].concat((0,H.A)(t),[e]):t}),[t,e])}var an=r.createContext(null);const ln=r.createContext({});function cn(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(Je(e)){var n=e.nodeName.toLowerCase(),r=["input","select","textarea","button"].includes(n)||e.isContentEditable||"a"===n&&!!e.getAttribute("href"),o=e.getAttribute("tabindex"),i=Number(o),a=null;return o&&!Number.isNaN(i)?a=i:r&&null===a&&(a=0),r&&e.disabled&&(a=null),null!==a&&(a>=0||t&&a<0)}return!1}function sn(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=(0,H.A)(e.querySelectorAll("*")).filter((function(e){return cn(e,t)}));return cn(e,t)&&n.unshift(e),n}var un=vt.A.LEFT,dn=vt.A.RIGHT,fn=vt.A.UP,pn=vt.A.DOWN,vn=vt.A.ENTER,mn=vt.A.ESC,hn=vt.A.HOME,gn=vt.A.END,bn=[fn,pn,un,dn];function yn(e,t){return sn(e,!0).filter((function(e){return t.has(e)}))}function An(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;if(!e)return null;var o=yn(e,t),i=o.length,a=o.findIndex((function(e){return n===e}));return r<0?-1===a?a=i-1:a-=1:r>0&&(a+=1),o[a=(a+i)%i]}var wn=function(e,t){var n=new Set,r=new Map,o=new Map;return e.forEach((function(e){var i=document.querySelector("[data-menu-id='".concat(Yt(t,e),"']"));i&&(n.add(i),o.set(i,e),r.set(e,i))})),{elements:n,key2element:r,element2key:o}};function Sn(e,t,n,o,i,a,l,c,s,u){var d=r.useRef(),f=r.useRef();f.current=t;var p=function(){Me.A.cancel(d.current)};return r.useEffect((function(){return function(){p()}}),[]),function(r){var v=r.which;if([].concat(bn,[vn,mn,hn,gn]).includes(v)){var m=a(),h=wn(m,o),g=h,b=g.elements,y=g.key2element,A=g.element2key,w=function(e,t){for(var n=e||document.activeElement;n;){if(t.has(n))return n;n=n.parentElement}return null}(y.get(t),b),S=A.get(w),x=function(e,t,n,r){var o,i="prev",a="next",l="children",c="parent";if("inline"===e&&r===vn)return{inlineTrigger:!0};var s=(0,J.A)((0,J.A)({},fn,i),pn,a),u=(0,J.A)((0,J.A)((0,J.A)((0,J.A)({},un,n?a:i),dn,n?i:a),pn,l),vn,l),d=(0,J.A)((0,J.A)((0,J.A)((0,J.A)((0,J.A)((0,J.A)({},fn,i),pn,a),vn,l),mn,c),un,n?l:c),dn,n?c:l);switch(null===(o={inline:s,horizontal:u,vertical:d,inlineSub:s,horizontalSub:d,verticalSub:d}["".concat(e).concat(t?"":"Sub")])||void 0===o?void 0:o[r]){case i:return{offset:-1,sibling:!0};case a:return{offset:1,sibling:!0};case c:return{offset:-1,sibling:!1};case l:return{offset:1,sibling:!1};default:return null}}(e,1===l(S,!0).length,n,v);if(!x&&v!==hn&&v!==gn)return;(bn.includes(v)||[hn,gn].includes(v))&&r.preventDefault();var C=function(e){if(e){var t=e,n=e.querySelector("a");null!=n&&n.getAttribute("href")&&(t=n);var r=A.get(e);c(r),p(),d.current=(0,Me.A)((function(){f.current===r&&t.focus()}))}};if([hn,gn].includes(v)||x.sibling||!w){var k,E,M=yn(k=w&&"inline"!==e?function(e){for(var t=e;t;){if(t.getAttribute("data-menu-list"))return t;t=t.parentElement}return null}(w):i.current,b);E=v===hn?M[0]:v===gn?M[M.length-1]:An(k,b,w,x.offset),C(E)}else if(x.inlineTrigger)s(S);else if(x.offset>0)s(S,!0),p(),d.current=(0,Me.A)((function(){h=wn(m,o);var e=w.getAttribute("aria-controls"),t=An(document.getElementById(e),h.elements);C(t)}),5);else if(x.offset<0){var $=l(S,!0),O=$[$.length-2],T=y.get(O);s(O,!1),C(T)}}null==u||u(r)}}var xn="__RC_UTIL_PATH_SPLIT__",Cn=function(e){return e.join(xn)},kn="rc-menu-more";function En(){var e=r.useState({}),t=(0,te.A)(e,2)[1],n=(0,r.useRef)(new Map),o=(0,r.useRef)(new Map),i=r.useState([]),a=(0,te.A)(i,2),l=a[0],c=a[1],s=(0,r.useRef)(0),u=(0,r.useRef)(!1),d=(0,r.useCallback)((function(e,r){var i=Cn(r);o.current.set(i,e),n.current.set(e,i),s.current+=1;var a,l=s.current;a=function(){l===s.current&&(u.current||t({}))},Promise.resolve().then(a)}),[]),f=(0,r.useCallback)((function(e,t){var r=Cn(t);o.current.delete(r),n.current.delete(e)}),[]),p=(0,r.useCallback)((function(e){c(e)}),[]),v=(0,r.useCallback)((function(e,t){var r=n.current.get(e)||"",o=r.split(xn);return t&&l.includes(o[0])&&o.unshift(kn),o}),[l]),m=(0,r.useCallback)((function(e,t){return e.some((function(e){return v(e,!0).includes(t)}))}),[v]),h=(0,r.useCallback)((function(e){var t="".concat(n.current.get(e)).concat(xn),r=new Set;return(0,H.A)(o.current.keys()).forEach((function(e){e.startsWith(t)&&r.add(o.current.get(e))})),r}),[]);return r.useEffect((function(){return function(){u.current=!0}}),[]),{registerPath:d,unregisterPath:f,refreshOverflowKeys:p,isSubPathKey:m,getKeyPath:v,getKeys:function(){var e=(0,H.A)(n.current.keys());return l.length&&e.push(kn),e},getSubPathKeys:h}}function Mn(e){var t=r.useRef(e);t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o1&&(y.motionAppear=!1);var A=y.onVisibleChanged;return y.onVisibleChanged=function(e){return p.current||e||g(!0),null==A?void 0:A(e)},h?null:r.createElement(Jt,{mode:a,locked:!p.current},r.createElement(Xe.Ay,(0,P.A)({visible:b},y,{forceRender:s,removeOnLeave:!1,leavedClassName:"".concat(c,"-hidden")}),(function(e){var n=e.className,o=e.style;return r.createElement(Kn,{id:t,className:n,style:o},i)})))}var er=["style","className","title","eventKey","warnKey","disabled","internalPopupClose","children","itemIcon","expandIcon","popupClassName","popupOffset","popupStyle","onClick","onMouseEnter","onMouseLeave","onTitleClick","onTitleMouseEnter","onTitleMouseLeave"],tr=["active"],nr=function(e){var t=e.style,n=e.className,o=e.title,a=e.eventKey,l=(e.warnKey,e.disabled),c=e.internalPopupClose,s=e.children,u=e.itemIcon,d=e.expandIcon,f=e.popupClassName,p=e.popupOffset,v=e.popupStyle,m=e.onClick,h=e.onMouseEnter,g=e.onMouseLeave,b=e.onTitleClick,y=e.onTitleMouseEnter,A=e.onTitleMouseLeave,w=(0,re.A)(e,er),S=Ut(a),x=r.useContext(Zt),C=x.prefixCls,k=x.mode,E=x.openKeys,M=x.disabled,$=x.overflowDisabled,O=x.activeKey,T=x.selectedKeys,R=x.itemIcon,z=x.expandIcon,N=x.onItemClick,I=x.onOpenChange,L=x.onActive,j=r.useContext(ln)._internalRenderSubMenuItem,_=r.useContext(an).isSubPathKey,H=on(),D="".concat(C,"-submenu"),B=M||l,W=r.useRef(),F=r.useRef();var X=null!=u?u:R,K=null!=d?d:z,G=E.includes(a),q=!$&&G,Y=_(T,a),U=Tn(a,B,y,A),V=U.active,Q=(0,re.A)(U,tr),Z=r.useState(!1),ne=(0,te.A)(Z,2),oe=ne[0],ie=ne[1],ae=function(e){B||ie(e)},le=r.useMemo((function(){return V||"inline"!==k&&(oe||_([O],a))}),[k,V,O,oe,a,_]),ce=Rn(H.length),se=Mn((function(e){null==m||m(Nn(e)),N(e)})),ue=S&&"".concat(S,"-popup"),de=r.createElement("div",(0,P.A)({role:"menuitem",style:ce,className:"".concat(D,"-title"),tabIndex:B?null:-1,ref:W,title:"string"==typeof o?o:null,"data-menu-id":$&&S?null:S,"aria-expanded":q,"aria-haspopup":!0,"aria-controls":ue,"aria-disabled":B,onClick:function(e){B||(null==b||b({key:a,domEvent:e}),"inline"===k&&I(a,!G))},onFocus:function(){L(a)}},Q),o,r.createElement(zn,{icon:"horizontal"!==k?K:void 0,props:(0,ee.A)((0,ee.A)({},e),{},{isOpen:q,isSubMenu:!0})},r.createElement("i",{className:"".concat(D,"-arrow")}))),fe=r.useRef(k);if("inline"!==k&&H.length>1?fe.current="vertical":fe.current=k,!$){var pe=fe.current;de=r.createElement(Zn,{mode:pe,prefixCls:D,visible:!c&&q&&"inline"!==k,popupClassName:f,popupOffset:p,popupStyle:v,popup:r.createElement(Jt,{mode:"horizontal"===pe?"vertical":pe},r.createElement(Kn,{id:ue,ref:F},s)),disabled:B,onVisibleChange:function(e){"inline"!==k&&I(a,e)}},de)}var ve=r.createElement(Kt.Item,(0,P.A)({role:"none"},w,{component:"li",style:t,className:i()(D,"".concat(D,"-").concat(k),n,(0,J.A)((0,J.A)((0,J.A)((0,J.A)({},"".concat(D,"-open"),q),"".concat(D,"-active"),le),"".concat(D,"-selected"),Y),"".concat(D,"-disabled"),B)),onMouseEnter:function(e){ae(!0),null==h||h({key:a,domEvent:e})},onMouseLeave:function(e){ae(!1),null==g||g({key:a,domEvent:e})}}),de,!$&&r.createElement(Jn,{id:ue,open:q,keyPath:H},s));return j&&(ve=j(ve,e,{selected:Y,active:le,open:q,disabled:B})),r.createElement(Jt,{onItemClick:se,mode:"horizontal"===k?"vertical":k,itemIcon:X,expandIcon:K},ve)};function rr(e){var t,n=e.eventKey,o=e.children,i=on(n),a=Gn(o,i),l=nn();return r.useEffect((function(){if(l)return l.registerPath(n,i),function(){l.unregisterPath(n,i)}}),[i]),t=l?a:r.createElement(nr,e,a),r.createElement(rn.Provider,{value:i},t)}var or=["className","title","eventKey","children"],ir=["children"],ar=function(e){var t=e.className,n=e.title,o=(e.eventKey,e.children),a=(0,re.A)(e,or),l=r.useContext(Zt).prefixCls,c="".concat(l,"-item-group");return r.createElement("li",(0,P.A)({role:"presentation"},a,{onClick:function(e){return e.stopPropagation()},className:i()(c,t)}),r.createElement("div",{role:"presentation",className:"".concat(c,"-title"),title:"string"==typeof n?n:void 0},n),r.createElement("ul",{role:"group",className:"".concat(c,"-list")},o))};function lr(e){var t=e.children,n=(0,re.A)(e,ir),o=Gn(t,on(n.eventKey));return nn()?o:r.createElement(ar,(0,a.A)(n,["warnKey"]),o)}function cr(e){var t=e.className,n=e.style,o=r.useContext(Zt).prefixCls;return nn()?null:r.createElement("li",{role:"separator",className:i()("".concat(o,"-item-divider"),t),style:n})}var sr=["label","children","key","type"];function ur(e){return(e||[]).map((function(e,t){if(e&&"object"===(0,ne.A)(e)){var n=e,o=n.label,i=n.children,a=n.key,l=n.type,c=(0,re.A)(n,sr),s=null!=a?a:"tmp-".concat(t);return i||"group"===l?"group"===l?r.createElement(lr,(0,P.A)({key:s},c,{title:o}),ur(i)):r.createElement(rr,(0,P.A)({key:s},c,{title:o}),ur(i)):"divider"===l?r.createElement(cr,(0,P.A)({key:s},c)):r.createElement(Bn,(0,P.A)({key:s},c),o)}return null})).filter((function(e){return e}))}function dr(e,t,n){var r=e;return t&&(r=ur(t)),Gn(r,n)}var fr=["prefixCls","rootClassName","style","className","tabIndex","items","children","direction","id","mode","inlineCollapsed","disabled","disabledOverflow","subMenuOpenDelay","subMenuCloseDelay","forceSubMenuRender","defaultOpenKeys","openKeys","activeKey","defaultActiveFirst","selectable","multiple","defaultSelectedKeys","selectedKeys","onSelect","onDeselect","inlineIndent","motion","defaultMotions","triggerSubMenuAction","builtinPlacements","itemIcon","expandIcon","overflowedIndicator","overflowedIndicatorPopupClassName","getPopupContainer","onClick","onOpenChange","onKeyDown","openAnimation","openTransitionName","_internalRenderMenuItem","_internalRenderSubMenuItem"],pr=[],vr=r.forwardRef((function(e,t){var n,o=e,a=o.prefixCls,l=void 0===a?"rc-menu":a,c=o.rootClassName,s=o.style,u=o.className,d=o.tabIndex,f=void 0===d?0:d,p=o.items,v=o.children,m=o.direction,h=o.id,g=o.mode,b=void 0===g?"vertical":g,y=o.inlineCollapsed,A=o.disabled,w=o.disabledOverflow,S=o.subMenuOpenDelay,x=void 0===S?.1:S,C=o.subMenuCloseDelay,k=void 0===C?.1:C,E=o.forceSubMenuRender,M=o.defaultOpenKeys,$=o.openKeys,O=o.activeKey,T=o.defaultActiveFirst,R=o.selectable,z=void 0===R||R,N=o.multiple,I=void 0!==N&&N,L=o.defaultSelectedKeys,j=o.selectedKeys,_=o.onSelect,D=o.onDeselect,B=o.inlineIndent,W=void 0===B?24:B,F=o.motion,X=o.defaultMotions,K=o.triggerSubMenuAction,G=void 0===K?"hover":K,q=o.builtinPlacements,Y=o.itemIcon,U=o.expandIcon,V=o.overflowedIndicator,Q=void 0===V?"...":V,Z=o.overflowedIndicatorPopupClassName,ne=o.getPopupContainer,ie=o.onClick,ae=o.onOpenChange,le=o.onKeyDown,ce=(o.openAnimation,o.openTransitionName,o._internalRenderMenuItem),se=o._internalRenderSubMenuItem,ue=(0,re.A)(o,fr),de=r.useMemo((function(){return dr(v,p,pr)}),[v,p]),fe=r.useState(!1),pe=(0,te.A)(fe,2),ve=pe[0],me=pe[1],he=r.useRef(),ge=function(e){var t=(0,oe.A)(e,{value:e}),n=(0,te.A)(t,2),o=n[0],i=n[1];return r.useEffect((function(){On+=1;var e="".concat($n,"-").concat(On);i("rc-menu-uuid-".concat(e))}),[]),o}(h),be="rtl"===m;var ye=(0,oe.A)(M,{value:$,postState:function(e){return e||pr}}),Ae=(0,te.A)(ye,2),we=Ae[0],Se=Ae[1],xe=function(e){function t(){Se(e),null==ae||ae(e)}arguments.length>1&&void 0!==arguments[1]&&arguments[1]?(0,Ot.flushSync)(t):t()},Ce=r.useState(we),ke=(0,te.A)(Ce,2),Ee=ke[0],Me=ke[1],$e=r.useRef(!1),Oe=r.useMemo((function(){return"inline"!==b&&"vertical"!==b||!y?[b,!1]:["vertical",y]}),[b,y]),Te=(0,te.A)(Oe,2),Re=Te[0],ze=Te[1],Pe="inline"===Re,Ne=r.useState(Re),Ie=(0,te.A)(Ne,2),Le=Ie[0],je=Ie[1],_e=r.useState(ze),He=(0,te.A)(_e,2),De=He[0],Be=He[1];r.useEffect((function(){je(Re),Be(ze),$e.current&&(Pe?Se(Ee):xe(pr))}),[Re,ze]);var We=r.useState(0),Fe=(0,te.A)(We,2),Xe=Fe[0],Ke=Fe[1],Ge=Xe>=de.length-1||"horizontal"!==Le||w;r.useEffect((function(){Pe&&Me(we)}),[we]),r.useEffect((function(){return $e.current=!0,function(){$e.current=!1}}),[]);var qe=En(),Ye=qe.registerPath,Ue=qe.unregisterPath,Ve=qe.refreshOverflowKeys,Qe=qe.isSubPathKey,Ze=qe.getKeyPath,Je=qe.getKeys,et=qe.getSubPathKeys,tt=r.useMemo((function(){return{registerPath:Ye,unregisterPath:Ue}}),[Ye,Ue]),nt=r.useMemo((function(){return{isSubPathKey:Qe}}),[Qe]);r.useEffect((function(){Ve(Ge?pr:de.slice(Xe+1).map((function(e){return e.key})))}),[Xe,Ge]);var rt=(0,oe.A)(O||T&&(null===(n=de[0])||void 0===n?void 0:n.key),{value:O}),ot=(0,te.A)(rt,2),it=ot[0],at=ot[1],lt=Mn((function(e){at(e)})),ct=Mn((function(){at(void 0)}));(0,r.useImperativeHandle)(t,(function(){return{list:he.current,focus:function(e){var t,n,r=Je(),o=wn(r,ge),i=o.elements,a=o.key2element,l=o.element2key,c=yn(he.current,i),s=null!=it?it:c[0]?l.get(c[0]):null===(t=de.find((function(e){return!e.props.disabled})))||void 0===t?void 0:t.key,u=a.get(s);s&&u&&(null==u||null===(n=u.focus)||void 0===n||n.call(u,e))}}}));var st=(0,oe.A)(L||[],{value:j,postState:function(e){return Array.isArray(e)?e:null==e?pr:[e]}}),ut=(0,te.A)(st,2),dt=ut[0],ft=ut[1],pt=Mn((function(e){null==ie||ie(Nn(e)),function(e){if(z){var t,n=e.key,r=dt.includes(n);t=I?r?dt.filter((function(e){return e!==n})):[].concat((0,H.A)(dt),[n]):[n],ft(t);var o=(0,ee.A)((0,ee.A)({},e),{},{selectedKeys:t});r?null==D||D(o):null==_||_(o)}!I&&we.length&&"inline"!==Le&&xe(pr)}(e)})),vt=Mn((function(e,t){var n=we.filter((function(t){return t!==e}));if(t)n.push(e);else if("inline"!==Le){var r=et(e);n=n.filter((function(e){return!r.has(e)}))}(0,Gt.A)(we,n,!0)||xe(n,!0)})),mt=Sn(Le,it,be,ge,he,Je,Ze,at,(function(e,t){var n=null!=t?t:!we.includes(e);vt(e,n)}),le);r.useEffect((function(){me(!0)}),[]);var ht=r.useMemo((function(){return{_internalRenderMenuItem:ce,_internalRenderSubMenuItem:se}}),[ce,se]),gt="horizontal"!==Le||w?de:de.map((function(e,t){return r.createElement(Jt,{key:e.key,overflowDisabled:t>Xe},e)})),bt=r.createElement(Kt,(0,P.A)({id:h,ref:he,prefixCls:"".concat(l,"-overflow"),component:"ul",itemComponent:Bn,className:i()(l,"".concat(l,"-root"),"".concat(l,"-").concat(Le),u,(0,J.A)((0,J.A)({},"".concat(l,"-inline-collapsed"),De),"".concat(l,"-rtl"),be),c),dir:m,style:s,role:"menu",tabIndex:f,data:gt,renderRawItem:function(e){return e},renderRawRest:function(e){var t=e.length,n=t?de.slice(-t):null;return r.createElement(rr,{eventKey:kn,title:Q,disabled:Ge,internalPopupClose:0===t,popupClassName:Z},n)},maxCount:"horizontal"!==Le||w?Kt.INVALIDATE:Kt.RESPONSIVE,ssr:"full","data-menu-list":!0,onVisibleChange:function(e){Ke(e)},onKeyDown:mt},ue));return r.createElement(ln.Provider,{value:ht},r.createElement(qt.Provider,{value:ge},r.createElement(Jt,{prefixCls:l,rootClassName:c,mode:Le,openKeys:we,rtl:be,disabled:A,motion:ve?F:null,defaultMotions:ve?X:null,activeKey:it,onActive:lt,onInactive:ct,selectedKeys:dt,inlineIndent:W,subMenuOpenDelay:x,subMenuCloseDelay:k,forceSubMenuRender:E,builtinPlacements:q,triggerSubMenuAction:G,getPopupContainer:ne,itemIcon:Y,expandIcon:U,onItemClick:pt,onOpenChange:vt},r.createElement(an.Provider,{value:nt},bt),r.createElement("div",{style:{display:"none"},"aria-hidden":!0},r.createElement(tn.Provider,{value:tt},de)))))}));var mr=vr;mr.Item=Bn,mr.SubMenu=rr,mr.ItemGroup=lr,mr.Divider=cr;const hr=mr;var gr=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.id,a=e.tabs,l=e.locale,c=e.mobile,s=e.moreIcon,u=void 0===s?"More":s,d=e.moreTransitionName,f=e.style,p=e.className,v=e.editable,m=e.tabBarGutter,h=e.rtl,g=e.removeAriaLabel,b=e.onTabClick,y=e.getPopupContainer,A=e.popupClassName,w=(0,r.useState)(!1),S=(0,te.A)(w,2),x=S[0],C=S[1],k=(0,r.useState)(null),E=(0,te.A)(k,2),M=E[0],$=E[1],O="".concat(o,"-more-popup"),T="".concat(n,"-dropdown"),R=null!==M?"".concat(O,"-").concat(M):null,z=null==l?void 0:l.dropdownAriaLabel;var P=r.createElement(hr,{onClick:function(e){var t=e.key,n=e.domEvent;b(t,n),C(!1)},prefixCls:"".concat(T,"-menu"),id:O,tabIndex:-1,role:"listbox","aria-activedescendant":R,selectedKeys:[M],"aria-label":void 0!==z?z:"expanded dropdown"},a.map((function(e){var t=e.closable,n=e.disabled,i=e.closeIcon,a=e.key,l=e.label,c=je(t,i,v,n);return r.createElement(Bn,{key:a,id:"".concat(O,"-").concat(a),role:"option","aria-controls":o&&"".concat(o,"-panel-").concat(a),disabled:n},r.createElement("span",null,l),c&&r.createElement("button",{type:"button","aria-label":g||"remove",tabIndex:0,className:"".concat(T,"-menu-item-remove"),onClick:function(e){e.stopPropagation(),function(e,t){e.preventDefault(),e.stopPropagation(),v.onEdit("remove",{key:t,event:e})}(e,a)}},i||v.removeIcon||"\xd7"))})));function N(e){for(var t=a.filter((function(e){return!e.disabled})),n=t.findIndex((function(e){return e.key===M}))||0,r=t.length,o=0;ot?"left":"right"})})),R=(0,te.A)(T,2),z=R[0],N=R[1],I=Te(0,(function(e,t){!O&&g&&g({direction:e>t?"top":"bottom"})})),L=(0,te.A)(I,2),j=L[0],_=L[1],D=(0,r.useState)([0,0]),B=(0,te.A)(D,2),W=B[0],F=B[1],X=(0,r.useState)([0,0]),K=(0,te.A)(X,2),G=K[0],q=K[1],Y=(0,r.useState)([0,0]),U=(0,te.A)(Y,2),V=U[0],Q=U[1],Z=(0,r.useState)([0,0]),ne=(0,te.A)(Z,2),re=ne[0],oe=ne[1],ie=function(e){var t=(0,r.useRef)([]),n=(0,r.useState)({}),o=(0,te.A)(n,2)[1],i=(0,r.useRef)("function"==typeof e?e():e),a=Pe((function(){var e=i.current;t.current.forEach((function(t){e=t(e)})),t.current=[],i.current=e,o({})}));return[i.current,function(e){t.current.push(e),a()}]}(new Map),le=(0,te.A)(ie,2),ce=le[0],se=le[1],ue=function(e,t,n){return(0,r.useMemo)((function(){for(var n,r=new Map,o=t.get(null===(n=e[0])||void 0===n?void 0:n.key)||Oe,i=o.left+o.width,a=0;aAe?Ae:e}O&&s?(ye=0,Ae=Math.max(0,pe-ge)):(ye=Math.min(0,ge-pe),Ae=0);var Se=(0,r.useRef)(null),xe=(0,r.useState)(),Ce=(0,te.A)(xe,2),Me=Ce[0],ze=Ce[1];function je(){ze(Date.now())}function _e(){Se.current&&clearTimeout(Se.current)}!function(e,t){var n=(0,r.useState)(),o=(0,te.A)(n,2),i=o[0],a=o[1],l=(0,r.useState)(0),c=(0,te.A)(l,2),s=c[0],u=c[1],d=(0,r.useState)(0),f=(0,te.A)(d,2),p=f[0],v=f[1],m=(0,r.useState)(),h=(0,te.A)(m,2),g=h[0],b=h[1],y=(0,r.useRef)(),A=(0,r.useRef)(),w=(0,r.useRef)(null);w.current={onTouchStart:function(e){var t=e.touches[0],n=t.screenX,r=t.screenY;a({x:n,y:r}),window.clearInterval(y.current)},onTouchMove:function(e){if(i){e.preventDefault();var n=e.touches[0],r=n.screenX,o=n.screenY;a({x:r,y:o});var l=r-i.x,c=o-i.y;t(l,c);var d=Date.now();u(d),v(d-s),b({x:l,y:c})}},onTouchEnd:function(){if(i&&(a(null),b(null),g)){var e=g.x/p,n=g.y/p,r=Math.abs(e),o=Math.abs(n);if(Math.max(r,o)<.1)return;var l=e,c=n;y.current=window.setInterval((function(){Math.abs(l)<.01&&Math.abs(c)<.01?window.clearInterval(y.current):t(20*(l*=Re),20*(c*=Re))}),20)}},onWheel:function(e){var n=e.deltaX,r=e.deltaY,o=0,i=Math.abs(n),a=Math.abs(r);i===a?o="x"===A.current?n:r:i>a?(o=n,A.current="x"):(o=r,A.current="y"),t(-o,-o)&&e.preventDefault()}},r.useEffect((function(){function t(e){w.current.onTouchMove(e)}function n(e){w.current.onTouchEnd(e)}return document.addEventListener("touchmove",t,{passive:!1}),document.addEventListener("touchend",n,{passive:!1}),e.current.addEventListener("touchstart",(function(e){w.current.onTouchStart(e)}),{passive:!1}),e.current.addEventListener("wheel",(function(e){w.current.onWheel(e)})),function(){document.removeEventListener("touchmove",t),document.removeEventListener("touchend",n)}}),[])}(k,(function(e,t){function n(e,t){e((function(e){return we(e+t)}))}return!!he&&(O?n(N,e):n(_,t),_e(),je(),!0)})),(0,r.useEffect)((function(){return _e(),Me&&(Se.current=setTimeout((function(){ze(0)}),100)),_e}),[Me]);var Be=function(e,t,n,o,i,a,l){var c,s,u,d=l.tabs,f=l.tabPosition,p=l.rtl;return["top","bottom"].includes(f)?(c="width",s=p?"right":"left",u=Math.abs(n)):(c="height",s="top",u=-n),(0,r.useMemo)((function(){if(!d.length)return[0,0];for(var n=d.length,r=n,o=0;ou+t){r=o-1;break}}for(var a=0,l=n-1;l>=0;l-=1)if((e.get(d[l].key)||Ne)[s]=r?[0,0]:[a,r]}),[e,t,o,i,a,u,f,d.map((function(e){return e.key})).join("_"),p])}(ue,ge,O?z:j,pe,ve,me,(0,ee.A)((0,ee.A)({},e),{},{tabs:w})),We=(0,te.A)(Be,2),Fe=We[0],Xe=We[1],Ke=(0,Ee.A)((function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:c,t=ue.get(e)||{width:0,height:0,left:0,right:0,top:0};if(O){var n=z;s?t.rightz+ge&&(n=t.right+t.width-ge):t.left<-z?n=-t.left:t.left+t.width>-z+ge&&(n=-(t.left+t.width-ge)),_(0),N(we(n))}else{var r=j;t.top<-j?r=-t.top:t.top+t.height>-j+ge&&(r=-(t.top+t.height-ge)),N(0),_(we(r))}})),Ge={};"top"===p||"bottom"===p?Ge[s?"marginRight":"marginLeft"]=v:Ge.marginTop=v;var qe=w.map((function(e,t){var n=e.key;return r.createElement(yr,{id:a,prefixCls:A,key:n,tab:e,style:0===t?void 0:Ge,closable:e.closable,editable:d,active:n===c,renderWrapper:m,removeAriaLabel:null==f?void 0:f.removeAriaLabel,onClick:function(e){h(n,e)},onFocus:function(){Ke(n),je(),k.current&&(s||(k.current.scrollLeft=0),k.current.scrollTop=0)}})})),Ye=function(){return se((function(){var e,t=new Map,n=null===(e=E.current)||void 0===e?void 0:e.getBoundingClientRect();return w.forEach((function(e){var r,o=e.key,i=null===(r=E.current)||void 0===r?void 0:r.querySelector('[data-node-key="'.concat(Le(o),'"]'));if(i){var a=function(e,t){var n=e.offsetWidth,r=e.offsetHeight,o=e.offsetTop,i=e.offsetLeft,a=e.getBoundingClientRect(),l=a.width,c=a.height,s=a.x,u=a.y;return Math.abs(l-n)<1?[l,c,s-t.x,u-t.y]:[n,r,i,o]}(i,n),l=(0,te.A)(a,4),c=l[0],s=l[1],u=l[2],d=l[3];t.set(o,{width:c,height:s,left:u,top:d})}})),t}))};(0,r.useEffect)((function(){Ye()}),[w.map((function(e){return e.key})).join("_")]);var Ue=Pe((function(){var e=Ar(S),t=Ar(x),n=Ar(C);F([e[0]-t[0]-n[0],e[1]-t[1]-n[1]]);var r=Ar($);Q(r);var o=Ar(M);oe(o);var i=Ar(E);q([i[0]-r[0],i[1]-r[1]]),Ye()})),Ve=w.slice(0,Fe),Qe=w.slice(Xe+1),Ze=[].concat((0,H.A)(Ve),(0,H.A)(Qe)),Je=ue.get(c),et=$e({activeTabOffset:Je,horizontal:O,indicator:b,rtl:s}).style;(0,r.useEffect)((function(){Ke()}),[c,ye,Ae,Ie(Je),Ie(ue),O]),(0,r.useEffect)((function(){Ue()}),[s]);var tt,nt,rt,ot,it=!!Ze.length,at="".concat(A,"-nav-wrap");return O?s?(nt=z>0,tt=z!==Ae):(tt=z<0,nt=z!==ye):(rt=j<0,ot=j!==ye),r.createElement(ke,{onResize:Ue},r.createElement("div",{ref:(0,de.xK)(t,S),role:"tablist",className:i()("".concat(A,"-nav"),n),style:o,onKeyDown:function(){je()}},r.createElement(De,{ref:x,position:"left",extra:u,prefixCls:A}),r.createElement(ke,{onResize:Ue},r.createElement("div",{className:i()(at,(0,J.A)((0,J.A)((0,J.A)((0,J.A)({},"".concat(at,"-ping-left"),tt),"".concat(at,"-ping-right"),nt),"".concat(at,"-ping-top"),rt),"".concat(at,"-ping-bottom"),ot)),ref:k},r.createElement(ke,{onResize:Ue},r.createElement("div",{ref:E,className:"".concat(A,"-nav-list"),style:{transform:"translate(".concat(z,"px, ").concat(j,"px)"),transition:Me?"none":void 0}},qe,r.createElement(He,{ref:$,prefixCls:A,locale:f,editable:d,style:(0,ee.A)((0,ee.A)({},0===qe.length?void 0:Ge),{},{visibility:it?"hidden":null})}),r.createElement("div",{className:i()("".concat(A,"-ink-bar"),(0,J.A)({},"".concat(A,"-ink-bar-animated"),l.inkBar)),style:et}))))),r.createElement(br,(0,P.A)({},e,{removeAriaLabel:null==f?void 0:f.removeAriaLabel,ref:M,prefixCls:A,tabs:Ze,className:!it&&be,tabMoving:!!Me})),r.createElement(De,{ref:C,position:"right",extra:u,prefixCls:A})))}));const xr=Sr;var Cr=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.className,a=e.style,l=e.id,c=e.active,s=e.tabKey,u=e.children;return r.createElement("div",{id:l&&"".concat(l,"-panel-").concat(s),role:"tabpanel",tabIndex:c?0:-1,"aria-labelledby":l&&"".concat(l,"-tab-").concat(s),"aria-hidden":!c,style:a,className:i()(n,c&&"".concat(n,"-active"),o),ref:t},u)}));const kr=Cr;var Er=["renderTabBar"],Mr=["label","key"];const $r=function(e){var t=e.renderTabBar,n=(0,re.A)(e,Er),o=r.useContext(ae).tabs;return t?t((0,ee.A)((0,ee.A)({},n),{},{panes:o.map((function(e){var t=e.label,n=e.key,o=(0,re.A)(e,Mr);return r.createElement(kr,(0,P.A)({tab:t,key:n,tabKey:n},o))}))}),xr):r.createElement(xr,n)};var Or=["key","forceRender","style","className","destroyInactiveTabPane"];const Tr=function(e){var t=e.id,n=e.activeKey,o=e.animated,a=e.tabPosition,l=e.destroyInactiveTabPane,c=r.useContext(ae),s=c.prefixCls,u=c.tabs,d=o.tabPane,f="".concat(s,"-tabpane");return r.createElement("div",{className:i()("".concat(s,"-content-holder"))},r.createElement("div",{className:i()("".concat(s,"-content"),"".concat(s,"-content-").concat(a),(0,J.A)({},"".concat(s,"-content-animated"),d))},u.map((function(e){var a=e.key,c=e.forceRender,s=e.style,u=e.className,p=e.destroyInactiveTabPane,v=(0,re.A)(e,Or),m=a===n;return r.createElement(Xe.Ay,(0,P.A)({key:a,visible:m,forceRender:c,removeOnLeave:!(!l&&!p),leavedClassName:"".concat(f,"-hidden")},o.tabPaneMotion),(function(e,n){var o=e.style,l=e.className;return r.createElement(kr,(0,P.A)({},v,{prefixCls:f,id:t,tabKey:a,animated:d,active:m,style:(0,ee.A)((0,ee.A)({},s),o),className:i()(u,l),ref:n}))}))}))))};var Rr=["id","prefixCls","className","items","direction","activeKey","defaultActiveKey","editable","animated","tabPosition","tabBarGutter","tabBarStyle","tabBarExtraContent","locale","moreIcon","moreTransitionName","destroyInactiveTabPane","renderTabBar","onChange","onTabClick","onTabScroll","getPopupContainer","popupClassName","indicator"],zr=0;const Pr=r.forwardRef((function(e,t){var n=e.id,o=e.prefixCls,a=void 0===o?"rc-tabs":o,l=e.className,c=e.items,s=e.direction,u=e.activeKey,d=e.defaultActiveKey,f=e.editable,p=e.animated,v=e.tabPosition,m=void 0===v?"top":v,h=e.tabBarGutter,g=e.tabBarStyle,b=e.tabBarExtraContent,y=e.locale,A=e.moreIcon,w=e.moreTransitionName,S=e.destroyInactiveTabPane,x=e.renderTabBar,C=e.onChange,k=e.onTabClick,E=e.onTabScroll,M=e.getPopupContainer,$=e.popupClassName,O=e.indicator,T=(0,re.A)(e,Rr),R=r.useMemo((function(){return(c||[]).filter((function(e){return e&&"object"===(0,ne.A)(e)&&"key"in e}))}),[c]),z="rtl"===s,N=function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{inkBar:!0,tabPane:!1};return(e=!1===t?{inkBar:!1,tabPane:!1}:!0===t?{inkBar:!0,tabPane:!1}:(0,ee.A)({inkBar:!0},"object"===(0,ne.A)(t)?t:{})).tabPaneMotion&&void 0===e.tabPane&&(e.tabPane=!0),!e.tabPaneMotion&&e.tabPane&&(e.tabPane=!1),e}(p),I=(0,r.useState)(!1),L=(0,te.A)(I,2),j=L[0],_=L[1];(0,r.useEffect)((function(){_(ie())}),[]);var H=(0,oe.A)((function(){var e;return null===(e=R[0])||void 0===e?void 0:e.key}),{value:u,defaultValue:d}),D=(0,te.A)(H,2),B=D[0],W=D[1],F=(0,r.useState)((function(){return R.findIndex((function(e){return e.key===B}))})),X=(0,te.A)(F,2),K=X[0],G=X[1];(0,r.useEffect)((function(){var e,t=R.findIndex((function(e){return e.key===B}));-1===t&&(t=Math.max(0,Math.min(K,R.length-1)),W(null===(e=R[t])||void 0===e?void 0:e.key));G(t)}),[R.map((function(e){return e.key})).join("_"),B,K]);var q=(0,oe.A)(null,{value:n}),Y=(0,te.A)(q,2),U=Y[0],V=Y[1];(0,r.useEffect)((function(){n||(V("rc-tabs-".concat(zr)),zr+=1)}),[]);var Q={id:U,activeKey:B,animated:N,tabPosition:m,rtl:z,mobile:j},Z=(0,ee.A)((0,ee.A)({},Q),{},{editable:f,locale:y,moreIcon:A,moreTransitionName:w,tabBarGutter:h,onTabClick:function(e,t){null==k||k(e,t);var n=e!==B;W(e),n&&(null==C||C(e))},onTabScroll:E,extra:b,style:g,panes:null,getPopupContainer:M,popupClassName:$,indicator:O});return r.createElement(ae.Provider,{value:{tabs:R,prefixCls:a}},r.createElement("div",(0,P.A)({ref:t,id:n,className:i()(a,"".concat(a,"-").concat(m),(0,J.A)((0,J.A)((0,J.A)({},"".concat(a,"-mobile"),j),"".concat(a,"-editable"),f),"".concat(a,"-rtl"),z),l)},T),r.createElement($r,(0,P.A)({},Z,{renderTabBar:x})),r.createElement(Tr,(0,P.A)({destroyInactiveTabPane:S},Q,{animated:N}))))}));var Nr=n(934),Ir=n(3723);const Lr={motionAppear:!1,motionEnter:!0,motionLeave:!0};var jr=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{antCls:n}=e,r=`${n}-${t}`,{inKeyframes:o,outKeyframes:i}=Dr[t];return[(0,Hr.b)(r,o,i,e.motionDurationMid),{[`\n ${r}-enter,\n ${r}-appear\n `]:{transform:"scale(0)",transformOrigin:"0% 0%",opacity:0,animationTimingFunction:e.motionEaseOutQuint,"&-prepare":{transform:"scale(1)"}},[`${r}-leave`]:{animationTimingFunction:e.motionEaseInQuint}}]},Wr=e=>{const{componentCls:t,motionDurationSlow:n}=e;return[{[t]:{[`${t}-switch`]:{"&-appear, &-enter":{transition:"none","&-start":{opacity:0},"&-active":{opacity:1,transition:`opacity ${n}`}},"&-leave":{position:"absolute",transition:"none",inset:0,"&-start":{opacity:1},"&-active":{opacity:0,transition:`opacity ${n}`}}}}},[Br(e,"slide-up"),Br(e,"slide-down")]]},Fr=e=>{const{componentCls:t,tabsCardPadding:n,cardBg:r,cardGutter:o,colorBorderSecondary:i,itemSelectedColor:a}=e;return{[`${t}-card`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{margin:0,padding:n,background:r,border:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${i}`,transition:`all ${e.motionDurationSlow} ${e.motionEaseInOut}`},[`${t}-tab-active`]:{color:a,background:e.colorBgContainer},[`${t}-ink-bar`]:{visibility:"hidden"}},[`&${t}-top, &${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab + ${t}-tab`]:{marginLeft:{_skip_check_:!0,value:(0,f.zA)(o)}}}},[`&${t}-top`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0`},[`${t}-tab-active`]:{borderBottomColor:e.colorBgContainer}}},[`&${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:`0 0 ${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)}`},[`${t}-tab-active`]:{borderTopColor:e.colorBgContainer}}},[`&${t}-left, &${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab + ${t}-tab`]:{marginTop:(0,f.zA)(o)}}},[`&${t}-left`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`${(0,f.zA)(e.borderRadiusLG)} 0 0 ${(0,f.zA)(e.borderRadiusLG)}`}},[`${t}-tab-active`]:{borderRightColor:{_skip_check_:!0,value:e.colorBgContainer}}}},[`&${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`0 ${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0`}},[`${t}-tab-active`]:{borderLeftColor:{_skip_check_:!0,value:e.colorBgContainer}}}}}}},Xr=e=>{const{componentCls:t,itemHoverColor:n,dropdownEdgeChildVerticalPadding:r}=e;return{[`${t}-dropdown`]:Object.assign(Object.assign({},(0,_r.dF)(e)),{position:"absolute",top:-9999,left:{_skip_check_:!0,value:-9999},zIndex:e.zIndexPopup,display:"block","&-hidden":{display:"none"},[`${t}-dropdown-menu`]:{maxHeight:e.tabsDropdownHeight,margin:0,padding:`${(0,f.zA)(r)} 0`,overflowX:"hidden",overflowY:"auto",textAlign:{_skip_check_:!0,value:"left"},listStyleType:"none",backgroundColor:e.colorBgContainer,backgroundClip:"padding-box",borderRadius:e.borderRadiusLG,outline:"none",boxShadow:e.boxShadowSecondary,"&-item":Object.assign(Object.assign({},_r.L9),{display:"flex",alignItems:"center",minWidth:e.tabsDropdownWidth,margin:0,padding:`${(0,f.zA)(e.paddingXXS)} ${(0,f.zA)(e.paddingSM)}`,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer",transition:`all ${e.motionDurationSlow}`,"> span":{flex:1,whiteSpace:"nowrap"},"&-remove":{flex:"none",marginLeft:{_skip_check_:!0,value:e.marginSM},color:e.colorTextDescription,fontSize:e.fontSizeSM,background:"transparent",border:0,cursor:"pointer","&:hover":{color:n}},"&:hover":{background:e.controlItemBgHover},"&-disabled":{"&, &:hover":{color:e.colorTextDisabled,background:"transparent",cursor:"not-allowed"}}})}})}},Kr=e=>{const{componentCls:t,margin:n,colorBorderSecondary:r,horizontalMargin:o,verticalItemPadding:i,verticalItemMargin:a,calc:l}=e;return{[`${t}-top, ${t}-bottom`]:{flexDirection:"column",[`> ${t}-nav, > div > ${t}-nav`]:{margin:o,"&::before":{position:"absolute",right:{_skip_check_:!0,value:0},left:{_skip_check_:!0,value:0},borderBottom:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${r}`,content:"''"},[`${t}-ink-bar`]:{height:e.lineWidthBold,"&-animated":{transition:`width ${e.motionDurationSlow}, left ${e.motionDurationSlow},\n right ${e.motionDurationSlow}`}},[`${t}-nav-wrap`]:{"&::before, &::after":{top:0,bottom:0,width:e.controlHeight},"&::before":{left:{_skip_check_:!0,value:0},boxShadow:e.boxShadowTabsOverflowLeft},"&::after":{right:{_skip_check_:!0,value:0},boxShadow:e.boxShadowTabsOverflowRight},[`&${t}-nav-wrap-ping-left::before`]:{opacity:1},[`&${t}-nav-wrap-ping-right::after`]:{opacity:1}}}},[`${t}-top`]:{[`> ${t}-nav,\n > div > ${t}-nav`]:{"&::before":{bottom:0},[`${t}-ink-bar`]:{bottom:0}}},[`${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{order:1,marginTop:n,marginBottom:0,"&::before":{top:0},[`${t}-ink-bar`]:{top:0}},[`> ${t}-content-holder, > div > ${t}-content-holder`]:{order:0}},[`${t}-left, ${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{flexDirection:"column",minWidth:l(e.controlHeight).mul(1.25).equal(),[`${t}-tab`]:{padding:i,textAlign:"center"},[`${t}-tab + ${t}-tab`]:{margin:a},[`${t}-nav-wrap`]:{flexDirection:"column","&::before, &::after":{right:{_skip_check_:!0,value:0},left:{_skip_check_:!0,value:0},height:e.controlHeight},"&::before":{top:0,boxShadow:e.boxShadowTabsOverflowTop},"&::after":{bottom:0,boxShadow:e.boxShadowTabsOverflowBottom},[`&${t}-nav-wrap-ping-top::before`]:{opacity:1},[`&${t}-nav-wrap-ping-bottom::after`]:{opacity:1}},[`${t}-ink-bar`]:{width:e.lineWidthBold,"&-animated":{transition:`height ${e.motionDurationSlow}, top ${e.motionDurationSlow}`}},[`${t}-nav-list, ${t}-nav-operations`]:{flex:"1 0 auto",flexDirection:"column"}}},[`${t}-left`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-ink-bar`]:{right:{_skip_check_:!0,value:0}}},[`> ${t}-content-holder, > div > ${t}-content-holder`]:{marginLeft:{_skip_check_:!0,value:(0,f.zA)(l(e.lineWidth).mul(-1).equal())},borderLeft:{_skip_check_:!0,value:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`},[`> ${t}-content > ${t}-tabpane`]:{paddingLeft:{_skip_check_:!0,value:e.paddingLG}}}},[`${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{order:1,[`${t}-ink-bar`]:{left:{_skip_check_:!0,value:0}}},[`> ${t}-content-holder, > div > ${t}-content-holder`]:{order:0,marginRight:{_skip_check_:!0,value:l(e.lineWidth).mul(-1).equal()},borderRight:{_skip_check_:!0,value:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`},[`> ${t}-content > ${t}-tabpane`]:{paddingRight:{_skip_check_:!0,value:e.paddingLG}}}}}},Gr=e=>{const{componentCls:t,cardPaddingSM:n,cardPaddingLG:r,horizontalItemPaddingSM:o,horizontalItemPaddingLG:i}=e;return{[t]:{"&-small":{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:o,fontSize:e.titleFontSizeSM}}},"&-large":{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:i,fontSize:e.titleFontSizeLG}}}},[`${t}-card`]:{[`&${t}-small`]:{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:n}},[`&${t}-bottom`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:`0 0 ${(0,f.zA)(e.borderRadius)} ${(0,f.zA)(e.borderRadius)}`}},[`&${t}-top`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:`${(0,f.zA)(e.borderRadius)} ${(0,f.zA)(e.borderRadius)} 0 0`}},[`&${t}-right`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`0 ${(0,f.zA)(e.borderRadius)} ${(0,f.zA)(e.borderRadius)} 0`}}},[`&${t}-left`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`${(0,f.zA)(e.borderRadius)} 0 0 ${(0,f.zA)(e.borderRadius)}`}}}},[`&${t}-large`]:{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:r}}}}}},qr=e=>{const{componentCls:t,itemActiveColor:n,itemHoverColor:r,iconCls:o,tabsHorizontalItemMargin:i,horizontalItemPadding:a,itemSelectedColor:l,itemColor:c}=e,s=`${t}-tab`;return{[s]:{position:"relative",WebkitTouchCallout:"none",WebkitTapHighlightColor:"transparent",display:"inline-flex",alignItems:"center",padding:a,fontSize:e.titleFontSize,background:"transparent",border:0,outline:"none",cursor:"pointer",color:c,"&-btn, &-remove":Object.assign({"&:focus:not(:focus-visible), &:active":{color:n}},(0,_r.K8)(e)),"&-btn":{outline:"none",transition:`all ${e.motionDurationSlow}`,[`${s}-icon:not(:last-child)`]:{marginInlineEnd:e.marginSM}},"&-remove":{flex:"none",marginRight:{_skip_check_:!0,value:e.calc(e.marginXXS).mul(-1).equal()},marginLeft:{_skip_check_:!0,value:e.marginXS},color:e.colorTextDescription,fontSize:e.fontSizeSM,background:"transparent",border:"none",outline:"none",cursor:"pointer",transition:`all ${e.motionDurationSlow}`,"&:hover":{color:e.colorTextHeading}},"&:hover":{color:r},[`&${s}-active ${s}-btn`]:{color:l,textShadow:e.tabsActiveTextShadow},[`&${s}-disabled`]:{color:e.colorTextDisabled,cursor:"not-allowed"},[`&${s}-disabled ${s}-btn, &${s}-disabled ${t}-remove`]:{"&:focus, &:active":{color:e.colorTextDisabled}},[`& ${s}-remove ${o}`]:{margin:0},[`${o}:not(:last-child)`]:{marginRight:{_skip_check_:!0,value:e.marginSM}}},[`${s} + ${s}`]:{margin:{_skip_check_:!0,value:i}}}},Yr=e=>{const{componentCls:t,tabsHorizontalItemMarginRTL:n,iconCls:r,cardGutter:o,calc:i}=e,a=`${t}-rtl`;return{[a]:{direction:"rtl",[`${t}-nav`]:{[`${t}-tab`]:{margin:{_skip_check_:!0,value:n},[`${t}-tab:last-of-type`]:{marginLeft:{_skip_check_:!0,value:0}},[r]:{marginRight:{_skip_check_:!0,value:0},marginLeft:{_skip_check_:!0,value:(0,f.zA)(e.marginSM)}},[`${t}-tab-remove`]:{marginRight:{_skip_check_:!0,value:(0,f.zA)(e.marginXS)},marginLeft:{_skip_check_:!0,value:(0,f.zA)(i(e.marginXXS).mul(-1).equal())},[r]:{margin:0}}}},[`&${t}-left`]:{[`> ${t}-nav`]:{order:1},[`> ${t}-content-holder`]:{order:0}},[`&${t}-right`]:{[`> ${t}-nav`]:{order:0},[`> ${t}-content-holder`]:{order:1}},[`&${t}-card${t}-top, &${t}-card${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab + ${t}-tab`]:{marginRight:{_skip_check_:!0,value:o},marginLeft:{_skip_check_:!0,value:0}}}}},[`${t}-dropdown-rtl`]:{direction:"rtl"},[`${t}-menu-item`]:{[`${t}-dropdown-rtl`]:{textAlign:{_skip_check_:!0,value:"right"}}}}},Ur=e=>{const{componentCls:t,tabsCardPadding:n,cardHeight:r,cardGutter:o,itemHoverColor:i,itemActiveColor:a,colorBorderSecondary:l}=e;return{[t]:Object.assign(Object.assign(Object.assign(Object.assign({},(0,_r.dF)(e)),{display:"flex",[`> ${t}-nav, > div > ${t}-nav`]:{position:"relative",display:"flex",flex:"none",alignItems:"center",[`${t}-nav-wrap`]:{position:"relative",display:"flex",flex:"auto",alignSelf:"stretch",overflow:"hidden",whiteSpace:"nowrap",transform:"translate(0)","&::before, &::after":{position:"absolute",zIndex:1,opacity:0,transition:`opacity ${e.motionDurationSlow}`,content:"''",pointerEvents:"none"}},[`${t}-nav-list`]:{position:"relative",display:"flex",transition:`opacity ${e.motionDurationSlow}`},[`${t}-nav-operations`]:{display:"flex",alignSelf:"stretch"},[`${t}-nav-operations-hidden`]:{position:"absolute",visibility:"hidden",pointerEvents:"none"},[`${t}-nav-more`]:{position:"relative",padding:n,background:"transparent",border:0,color:e.colorText,"&::after":{position:"absolute",right:{_skip_check_:!0,value:0},bottom:0,left:{_skip_check_:!0,value:0},height:e.calc(e.controlHeightLG).div(8).equal(),transform:"translateY(100%)",content:"''"}},[`${t}-nav-add`]:Object.assign({minWidth:r,minHeight:r,marginLeft:{_skip_check_:!0,value:o},padding:`0 ${(0,f.zA)(e.paddingXS)}`,background:"transparent",border:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${l}`,borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0`,outline:"none",cursor:"pointer",color:e.colorText,transition:`all ${e.motionDurationSlow} ${e.motionEaseInOut}`,"&:hover":{color:i},"&:active, &:focus:not(:focus-visible)":{color:a}},(0,_r.K8)(e))},[`${t}-extra-content`]:{flex:"none"},[`${t}-ink-bar`]:{position:"absolute",background:e.inkBarColor,pointerEvents:"none"}}),qr(e)),{[`${t}-content`]:{position:"relative",width:"100%"},[`${t}-content-holder`]:{flex:"auto",minWidth:0,minHeight:0},[`${t}-tabpane`]:{outline:"none","&-hidden":{display:"none"}}}),[`${t}-centered`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-nav-wrap`]:{[`&:not([class*='${t}-nav-wrap-ping'])`]:{justifyContent:"center"}}}}}},Vr=(0,p.OF)("Tabs",(e=>{const t=(0,v.h1)(e,{tabsCardPadding:e.cardPadding,dropdownEdgeChildVerticalPadding:e.paddingXXS,tabsActiveTextShadow:"0 0 0.25px currentcolor",tabsDropdownHeight:200,tabsDropdownWidth:120,tabsHorizontalItemMargin:`0 0 0 ${(0,f.zA)(e.horizontalItemGutter)}`,tabsHorizontalItemMarginRTL:`0 0 0 ${(0,f.zA)(e.horizontalItemGutter)}`});return[Gr(t),Yr(t),Kr(t),Xr(t),Fr(t),Ur(t),Wr(t)]}),(e=>{const t=e.controlHeightLG;return{zIndexPopup:e.zIndexPopupBase+50,cardBg:e.colorFillAlter,cardHeight:t,cardPadding:`${(t-Math.round(e.fontSize*e.lineHeight))/2-e.lineWidth}px ${e.padding}px`,cardPaddingSM:`${1.5*e.paddingXXS}px ${e.padding}px`,cardPaddingLG:`${e.paddingXS}px ${e.padding}px ${1.5*e.paddingXXS}px`,titleFontSize:e.fontSize,titleFontSizeLG:e.fontSizeLG,titleFontSizeSM:e.fontSize,inkBarColor:e.colorPrimary,horizontalMargin:`0 0 ${e.margin}px 0`,horizontalItemGutter:32,horizontalItemMargin:"",horizontalItemMarginRTL:"",horizontalItemPadding:`${e.paddingSM}px 0`,horizontalItemPaddingSM:`${e.paddingXS}px 0`,horizontalItemPaddingLG:`${e.padding}px 0`,verticalItemPadding:`${e.paddingXS}px ${e.paddingLG}px`,verticalItemMargin:`${e.margin}px 0 0 0`,itemColor:e.colorText,itemSelectedColor:e.colorPrimary,itemHoverColor:e.colorPrimaryHover,itemActiveColor:e.colorPrimaryActive,cardGutter:e.marginXXS/2}}));var Qr=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{var t,n,o,a,c,s,d,f;const{type:p,className:v,rootClassName:m,size:h,onEdit:g,hideAdd:b,centered:y,addIcon:A,removeIcon:w,moreIcon:S,popupClassName:x,children:C,items:k,animated:E,style:M,indicatorSize:$,indicator:O}=e,T=Qr(e,["type","className","rootClassName","size","onEdit","hideAdd","centered","addIcon","removeIcon","moreIcon","popupClassName","children","items","animated","style","indicatorSize","indicator"]),{prefixCls:R}=T,{direction:z,tabs:P,getPrefixCls:N,getPopupContainer:I}=r.useContext(l.QO),L=N("tabs",R),j=(0,Nr.A)(L),[_,H,D]=Vr(L,j);let B;"editable-card"===p&&(B={onEdit:(e,t)=>{let{key:n,event:r}=t;null==g||g("add"===e?r:n,e)},removeIcon:null!==(t=null!=w?w:null==P?void 0:P.removeIcon)&&void 0!==t?t:r.createElement(G.A,null),addIcon:(null!=A?A:null==P?void 0:P.addIcon)||r.createElement(Z,null),showAdd:!0!==b});const W=N();const F=u(h),X=function(e,t){return e||function(e){return e.filter((e=>e))}(ce(t).map((e=>{if(r.isValidElement(e)){const{key:t,props:n}=e,r=n||{},{tab:o}=r,i=jr(r,["tab"]);return Object.assign(Object.assign({key:String(t)},i),{label:o})}return null})))}(k,C),K=function(e){let t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{inkBar:!0,tabPane:!1};return t=!1===n?{inkBar:!1,tabPane:!1}:!0===n?{inkBar:!0,tabPane:!0}:Object.assign({inkBar:!0},"object"==typeof n?n:{}),t.tabPane&&(t.tabPaneMotion=Object.assign(Object.assign({},Lr),{motionName:(0,Ir.b)(e,"switch")})),t}(L,E),q=Object.assign(Object.assign({},null==P?void 0:P.style),M),Y={align:null!==(n=null==O?void 0:O.align)&&void 0!==n?n:null===(o=null==P?void 0:P.indicator)||void 0===o?void 0:o.align,size:null!==(d=null!==(c=null!==(a=null==O?void 0:O.size)&&void 0!==a?a:$)&&void 0!==c?c:null===(s=null==P?void 0:P.indicator)||void 0===s?void 0:s.size)&&void 0!==d?d:null==P?void 0:P.indicatorSize};return _(r.createElement(Pr,Object.assign({direction:z,getPopupContainer:I,moreTransitionName:`${W}-slide-up`},T,{items:X,className:i()({[`${L}-${F}`]:F,[`${L}-card`]:["card","editable-card"].includes(p),[`${L}-editable-card`]:"editable-card"===p,[`${L}-centered`]:y},null==P?void 0:P.className,v,m,H,D,j),popupClassName:i()(x,H,D,j),style:q,editable:B,moreIcon:null!==(f=null!=S?S:null==P?void 0:P.moreIcon)&&void 0!==f?f:r.createElement(U,null),prefixCls:L,animated:K,indicator:Y})))};Zr.TabPane=()=>null;const Jr=Zr;var eo=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{var{prefixCls:t,className:n,hoverable:o=!0}=e,a=eo(e,["prefixCls","className","hoverable"]);const{getPrefixCls:c}=r.useContext(l.QO),s=c("card",t),u=i()(`${s}-grid`,n,{[`${s}-grid-hoverable`]:o});return r.createElement("div",Object.assign({},a,{className:u}))},no=e=>{const{antCls:t,componentCls:n,headerHeight:r,cardPaddingBase:o,tabsMarginBottom:i}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:r,marginBottom:-1,padding:`0 ${(0,f.zA)(o)}`,color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.headerFontSize,background:e.headerBg,borderBottom:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`,borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0`},(0,_r.t6)()),{"&-wrapper":{width:"100%",display:"flex",alignItems:"center"},"&-title":Object.assign(Object.assign({display:"inline-block",flex:1},_r.L9),{[`\n > ${n}-typography,\n > ${n}-typography-edit-content\n `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:i,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,"&-bar":{borderBottom:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})},ro=e=>{const{cardPaddingBase:t,colorBorderSecondary:n,cardShadow:r,lineWidth:o}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:`\n ${(0,f.zA)(o)} 0 0 0 ${n},\n 0 ${(0,f.zA)(o)} 0 0 ${n},\n ${(0,f.zA)(o)} ${(0,f.zA)(o)} 0 0 ${n},\n ${(0,f.zA)(o)} 0 0 0 ${n} inset,\n 0 ${(0,f.zA)(o)} 0 0 ${n} inset;\n `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:r}}},oo=e=>{const{componentCls:t,iconCls:n,actionsLiMargin:r,cardActionsIconSize:o,colorBorderSecondary:i,actionsBg:a}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:a,borderTop:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${i}`,display:"flex",borderRadius:`0 0 ${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)}`},(0,_r.t6)()),{"& > li":{margin:r,color:e.colorTextDescription,textAlign:"center","> span":{position:"relative",display:"block",minWidth:e.calc(e.cardActionsIconSize).mul(2).equal(),fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer","&:hover":{color:e.colorPrimary,transition:`color ${e.motionDurationMid}`},[`a:not(${t}-btn), > ${n}`]:{display:"inline-block",width:"100%",color:e.colorTextDescription,lineHeight:(0,f.zA)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${n}`]:{fontSize:o,lineHeight:(0,f.zA)(e.calc(o).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${i}`}}})},io=e=>Object.assign(Object.assign({margin:`${(0,f.zA)(e.calc(e.marginXXS).mul(-1).equal())} 0`,display:"flex"},(0,_r.t6)()),{"&-avatar":{paddingInlineEnd:e.padding},"&-detail":{overflow:"hidden",flex:1,"> div:not(:last-child)":{marginBottom:e.marginXS}},"&-title":Object.assign({color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG},_r.L9),"&-description":{color:e.colorTextDescription}}),ao=e=>{const{componentCls:t,cardPaddingBase:n,colorFillAlter:r}=e;return{[`${t}-head`]:{padding:`0 ${(0,f.zA)(n)}`,background:r,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,f.zA)(e.padding)} ${(0,f.zA)(n)}`}}},lo=e=>{const{componentCls:t}=e;return{overflow:"hidden",[`${t}-body`]:{userSelect:"none"}}},co=e=>{const{antCls:t,componentCls:n,cardShadow:r,cardHeadPadding:o,colorBorderSecondary:i,boxShadowTertiary:a,cardPaddingBase:l,extraColor:c}=e;return{[n]:Object.assign(Object.assign({},(0,_r.dF)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${n}-bordered)`]:{boxShadow:a},[`${n}-head`]:no(e),[`${n}-extra`]:{marginInlineStart:"auto",color:c,fontWeight:"normal",fontSize:e.fontSize},[`${n}-body`]:Object.assign({padding:l,borderRadius:`0 0 ${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)}`},(0,_r.t6)()),[`${n}-grid`]:ro(e),[`${n}-cover`]:{"> *":{display:"block",width:"100%"},[`img, img + ${t}-image-mask`]:{borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0`}},[`${n}-actions`]:oo(e),[`${n}-meta`]:io(e)}),[`${n}-bordered`]:{border:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${i}`,[`${n}-cover`]:{marginTop:-1,marginInlineStart:-1,marginInlineEnd:-1}},[`${n}-hoverable`]:{cursor:"pointer",transition:`box-shadow ${e.motionDurationMid}, border-color ${e.motionDurationMid}`,"&:hover":{borderColor:"transparent",boxShadow:r}},[`${n}-contain-grid`]:{borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0 `,[`${n}-body`]:{display:"flex",flexWrap:"wrap"},[`&:not(${n}-loading) ${n}-body`]:{marginBlockStart:e.calc(e.lineWidth).mul(-1).equal(),marginInlineStart:e.calc(e.lineWidth).mul(-1).equal(),padding:0}},[`${n}-contain-tabs`]:{[`> ${n}-head`]:{minHeight:0,[`${n}-head-title, ${n}-extra`]:{paddingTop:o}}},[`${n}-type-inner`]:ao(e),[`${n}-loading`]:lo(e),[`${n}-rtl`]:{direction:"rtl"}}},so=e=>{const{componentCls:t,cardPaddingSM:n,headerHeightSM:r,headerFontSizeSM:o}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:r,padding:`0 ${(0,f.zA)(n)}`,fontSize:o,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:n}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}},uo=(0,p.OF)("Card",(e=>{const t=(0,v.h1)(e,{cardShadow:e.boxShadowCard,cardHeadPadding:e.padding,cardPaddingBase:e.paddingLG,cardActionsIconSize:e.fontSize,cardPaddingSM:12});return[co(t),so(t)]}),(e=>({headerBg:"transparent",headerFontSize:e.fontSizeLG,headerFontSizeSM:e.fontSize,headerHeight:e.fontSizeLG*e.lineHeightLG+2*e.padding,headerHeightSM:e.fontSize*e.lineHeight+2*e.paddingXS,actionsBg:e.colorBgContainer,actionsLiMargin:`${e.paddingSM}px 0`,tabsMarginBottom:-e.padding-e.lineWidth,extraColor:e.colorText})));var fo=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{actionClasses:t,actions:n=[],actionStyle:o}=e;return r.createElement("ul",{className:t,style:o},n.map(((e,t)=>{const o=`action-${t}`;return r.createElement("li",{style:{width:100/n.length+"%"},key:o},r.createElement("span",null,e))})))},vo=r.forwardRef(((e,t)=>{const{prefixCls:n,className:o,rootClassName:c,style:s,extra:d,headStyle:f={},bodyStyle:p={},title:v,loading:m,bordered:h=!0,size:g,type:b,cover:y,actions:A,tabList:w,children:S,activeTabKey:x,defaultActiveTabKey:C,tabBarExtraContent:k,hoverable:E,tabProps:M={},classNames:$,styles:O}=e,T=fo(e,["prefixCls","className","rootClassName","style","extra","headStyle","bodyStyle","title","loading","bordered","size","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey","tabBarExtraContent","hoverable","tabProps","classNames","styles"]),{getPrefixCls:R,direction:z,card:P}=r.useContext(l.QO);const N=e=>{var t;return i()(null===(t=null==P?void 0:P.classNames)||void 0===t?void 0:t[e],null==$?void 0:$[e])},I=e=>{var t;return Object.assign(Object.assign({},null===(t=null==P?void 0:P.styles)||void 0===t?void 0:t[e]),null==O?void 0:O[e])},L=r.useMemo((()=>{let e=!1;return r.Children.forEach(S,(t=>{t&&t.type&&t.type===to&&(e=!0)})),e}),[S]),j=R("card",n),[_,H,D]=uo(j),B=r.createElement(K,{loading:!0,active:!0,paragraph:{rows:4},title:!1},S),W=void 0!==x,F=Object.assign(Object.assign({},M),{[W?"activeKey":"defaultActiveKey"]:W?x:C,tabBarExtraContent:k});let X;const G=u(g),q=G&&"default"!==G?G:"large",Y=w?r.createElement(Jr,Object.assign({size:q},F,{className:`${j}-head-tabs`,onChange:t=>{var n;null===(n=e.onTabChange)||void 0===n||n.call(e,t)},items:w.map((e=>{var{tab:t}=e,n=fo(e,["tab"]);return Object.assign({label:t},n)}))})):null;if(v||d||Y){const e=i()(`${j}-head`,N("header")),t=i()(`${j}-head-title`,N("title")),n=i()(`${j}-extra`,N("extra")),o=Object.assign(Object.assign({},f),I("header"));X=r.createElement("div",{className:e,style:o},r.createElement("div",{className:`${j}-head-wrapper`},v&&r.createElement("div",{className:t,style:I("title")},v),d&&r.createElement("div",{className:n,style:I("extra")},d)),Y)}const U=i()(`${j}-cover`,N("cover")),V=y?r.createElement("div",{className:U,style:I("cover")},y):null,Q=i()(`${j}-body`,N("body")),Z=Object.assign(Object.assign({},p),I("body")),J=r.createElement("div",{className:Q,style:Z},m?B:S),ee=i()(`${j}-actions`,N("actions")),te=A&&A.length?r.createElement(po,{actionClasses:ee,actionStyle:I("actions"),actions:A}):null,ne=(0,a.A)(T,["onTabChange"]),re=i()(j,null==P?void 0:P.className,{[`${j}-loading`]:m,[`${j}-bordered`]:h,[`${j}-hoverable`]:E,[`${j}-contain-grid`]:L,[`${j}-contain-tabs`]:w&&w.length,[`${j}-${G}`]:G,[`${j}-type-${b}`]:!!b,[`${j}-rtl`]:"rtl"===z},o,c,H,D),oe=Object.assign(Object.assign({},null==P?void 0:P.style),s);return _(r.createElement("div",Object.assign({ref:t},ne,{className:re,style:oe}),X,V,J,te))}));var mo=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{prefixCls:t,className:n,avatar:o,title:a,description:c}=e,s=mo(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:u}=r.useContext(l.QO),d=u("card",t),f=i()(`${d}-meta`,n),p=o?r.createElement("div",{className:`${d}-meta-avatar`},o):null,v=a?r.createElement("div",{className:`${d}-meta-title`},a):null,m=c?r.createElement("div",{className:`${d}-meta-description`},c):null,h=v||m?r.createElement("div",{className:`${d}-meta-detail`},v,m):null;return r.createElement("div",Object.assign({},s,{className:f}),p,h)},go=vo;go.Grid=to,go.Meta=ho;const bo=go},3517:(e,t,n)=>{"use strict";n.d(t,{A:()=>ge});var r=n(6540),o=n(8168),i=n(9379),a=n(3029),l=n(2901),c=n(6822),s=n(2176),u=n(3954),d=n(5501),f=n(4467),p=n(2284),v=n(45);const m={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0};function h(e,t,n){var r=(n||{}).atBegin;return function(e,t,n){var r,o=n||{},i=o.noTrailing,a=void 0!==i&&i,l=o.noLeading,c=void 0!==l&&l,s=o.debounceMode,u=void 0===s?void 0:s,d=!1,f=0;function p(){r&&clearTimeout(r)}function v(){for(var n=arguments.length,o=new Array(n),i=0;ie?c?(f=Date.now(),a||(r=setTimeout(u?m:v,e))):v():!0!==a&&(r=setTimeout(u?m:v,void 0===u?e-s:e)))}return v.cancel=function(e){var t=(e||{}).upcomingOnly,n=void 0!==t&&t;p(),d=!n},v}(e,t,{debounceMode:!1!==(void 0!==r&&r)})}var g=n(6942),b=n.n(g);const y={accessibility:!0,adaptiveHeight:!1,afterChange:null,appendDots:function(e){return r.createElement("ul",{style:{display:"block"}},e)},arrows:!0,autoplay:!1,autoplaySpeed:3e3,beforeChange:null,centerMode:!1,centerPadding:"50px",className:"",cssEase:"ease",customPaging:function(e){return r.createElement("button",null,e+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:null,nextArrow:null,onEdge:null,onInit:null,onLazyLoadError:null,onReInit:null,pauseOnDotsHover:!1,pauseOnFocus:!1,pauseOnHover:!0,prevArrow:null,responsive:null,rows:1,rtl:!1,slide:"div",slidesPerRow:1,slidesToScroll:1,slidesToShow:1,speed:500,swipe:!0,swipeEvent:null,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,waitForAnimate:!0,asNavFor:null};function A(e,t,n){return Math.max(t,Math.min(e,n))}var w=function(e){["onTouchStart","onTouchMove","onWheel"].includes(e._reactName)||e.preventDefault()},S=function(e){for(var t=[],n=x(e),r=C(e),o=n;o0?1:0):0},E=function(e){return e.centerMode?Math.floor((e.slidesToShow-1)/2)+1+(parseInt(e.centerPadding)>0?1:0):e.slidesToShow},M=function(e){return e&&e.offsetWidth||0},$=function(e){return e&&e.offsetHeight||0},O=function(e){var t,n,r,o,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t=e.startX-e.curX,n=e.startY-e.curY,r=Math.atan2(n,t),(o=Math.round(180*r/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0||o<=360&&o>=315?"left":o>=135&&o<=225?"right":!0===i?o>=35&&o<=135?"up":"down":"vertical"},T=function(e){var t=!0;return e.infinite||(e.centerMode&&e.currentSlide>=e.slideCount-1||e.slideCount<=e.slidesToShow||e.currentSlide>=e.slideCount-e.slidesToShow)&&(t=!1),t},R=function(e,t){var n={};return t.forEach((function(t){return n[t]=e[t]})),n},z=function(e,t){var n=function(e){for(var t=e.infinite?2*e.slideCount:e.slideCount,n=e.infinite?-1*e.slidesToShow:0,r=e.infinite?-1*e.slidesToShow:0,o=[];nn[n.length-1])t=n[n.length-1];else for(var o in n){if(t-1*e.swipeLeft)return n=r,!1}else if(r.offsetLeft-t+M(r)/2>-1*e.swipeLeft)return n=r,!1;return!0})),!n)return 0;var i=!0===e.rtl?e.slideCount-e.currentSlide:e.currentSlide;return Math.abs(n.dataset.index-i)||1}return e.slidesToScroll},N=function(e,t){return t.reduce((function(t,n){return t&&e.hasOwnProperty(n)}),!0)?null:console.error("Keys Missing:",e)},I=function(e){var t,n;(N(e,["left","variableWidth","slideCount","slidesToShow","slideWidth"]),e.vertical)?n=(e.unslick?e.slideCount:e.slideCount+2*e.slidesToShow)*e.slideHeight:t=D(e)*e.slideWidth;var r={opacity:1,transition:"",WebkitTransition:""};if(e.useTransform){var o=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",a=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",l=e.vertical?"translateY("+e.left+"px)":"translateX("+e.left+"px)";r=(0,i.A)((0,i.A)({},r),{},{WebkitTransform:o,transform:a,msTransform:l})}else e.vertical?r.top=e.left:r.left=e.left;return e.fade&&(r={opacity:1}),t&&(r.width=t),n&&(r.height=n),window&&!window.addEventListener&&window.attachEvent&&(e.vertical?r.marginTop=e.left+"px":r.marginLeft=e.left+"px"),r},L=function(e){N(e,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var t=I(e);return e.useTransform?(t.WebkitTransition="-webkit-transform "+e.speed+"ms "+e.cssEase,t.transition="transform "+e.speed+"ms "+e.cssEase):e.vertical?t.transition="top "+e.speed+"ms "+e.cssEase:t.transition="left "+e.speed+"ms "+e.cssEase,t},j=function(e){if(e.unslick)return 0;N(e,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var t,n,r=e.slideIndex,o=e.trackRef,i=e.infinite,a=e.centerMode,l=e.slideCount,c=e.slidesToShow,s=e.slidesToScroll,u=e.slideWidth,d=e.listWidth,f=e.variableWidth,p=e.slideHeight,v=e.fade,m=e.vertical;if(v||1===e.slideCount)return 0;var h=0;if(i?(h=-_(e),l%s!=0&&r+s>l&&(h=-(r>l?c-(r-l):l%s)),a&&(h+=parseInt(c/2))):(l%s!=0&&r+s>l&&(h=c-l%s),a&&(h=parseInt(c/2))),t=m?r*p*-1+h*p:r*u*-1+h*u,!0===f){var g,b=o&&o.node;if(g=r+_(e),t=(n=b&&b.childNodes[g])?-1*n.offsetLeft:0,!0===a){g=i?r+_(e):r,n=b&&b.children[g],t=0;for(var y=0;ye.currentSlide?e.targetSlide>e.currentSlide+W(e)?"left":"right":e.targetSlide0&&(i+=1),r&&t%2==0&&(i+=1),i}return r?0:t-1},F=function(e){var t=e.slidesToShow,n=e.centerMode,r=e.rtl,o=e.centerPadding;if(n){var i=(t-1)/2+1;return parseInt(o)>0&&(i+=1),r||t%2!=0||(i+=1),i}return r?t-1:0},X=function(){return!("undefined"==typeof window||!window.document||!window.document.createElement)},K=Object.keys(y);var G=function(e){var t,n,r,o,i;return r=(i=e.rtl?e.slideCount-1-e.index:e.index)<0||i>=e.slideCount,e.centerMode?(o=Math.floor(e.slidesToShow/2),n=(i-e.currentSlide)%e.slideCount==0,i>e.currentSlide-o-1&&i<=e.currentSlide+o&&(t=!0)):t=e.currentSlide<=i&&i=e.slideCount?e.targetSlide-e.slideCount:e.targetSlide)}},q=function(e,t){return e.key+"-"+t},Y=function(e){var t,n=[],o=[],a=[],l=r.Children.count(e.children),c=x(e),s=C(e);return r.Children.forEach(e.children,(function(u,d){var f,p={message:"children",index:d,slidesToScroll:e.slidesToScroll,currentSlide:e.currentSlide};f=!e.lazyLoad||e.lazyLoad&&e.lazyLoadedList.indexOf(d)>=0?u:r.createElement("div",null);var v=function(e){var t={};return void 0!==e.variableWidth&&!1!==e.variableWidth||(t.width=e.slideWidth),e.fade&&(t.position="relative",e.vertical&&e.slideHeight?t.top=-e.index*parseInt(e.slideHeight):t.left=-e.index*parseInt(e.slideWidth),t.opacity=e.currentSlide===e.index?1:0,t.zIndex=e.currentSlide===e.index?999:998,e.useCSS&&(t.transition="opacity "+e.speed+"ms "+e.cssEase+", visibility "+e.speed+"ms "+e.cssEase)),t}((0,i.A)((0,i.A)({},e),{},{index:d})),m=f.props.className||"",h=G((0,i.A)((0,i.A)({},e),{},{index:d}));if(n.push(r.cloneElement(f,{key:"original"+q(f,d),"data-index":d,className:b()(h,m),tabIndex:"-1","aria-hidden":!h["slick-active"],style:(0,i.A)((0,i.A)({outline:"none"},f.props.style||{}),v),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}})),e.infinite&&l>1&&!1===e.fade&&!e.unslick){var g=l-d;g<=_(e)&&((t=-g)>=c&&(f=u),h=G((0,i.A)((0,i.A)({},e),{},{index:t})),o.push(r.cloneElement(f,{key:"precloned"+q(f,t),"data-index":t,tabIndex:"-1",className:b()(h,m),"aria-hidden":!h["slick-active"],style:(0,i.A)((0,i.A)({},f.props.style||{}),v),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}}))),(t=l+d)=w&&d<=g:d===w}),x={message:"dots",index:m,slidesToScroll:c,currentSlide:d},C=this.clickHandler.bind(this,x);v=v.concat(r.createElement("li",{key:m,className:S},r.cloneElement(this.props.customPaging(m),{onClick:C})))}return r.cloneElement(this.props.appendDots(v),(0,i.A)({className:this.props.dotsClass},p))}}])}(r.PureComponent);function Q(e,t,n){return t=(0,u.A)(t),(0,c.A)(e,(0,s.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var Z=function(e){function t(){return(0,a.A)(this,t),Q(this,t,arguments)}return(0,d.A)(t,e),(0,l.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-prev":!0},t=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(0===this.props.currentSlide||this.props.slideCount<=this.props.slidesToShow)&&(e["slick-disabled"]=!0,t=null);var n={key:"0","data-role":"none",className:b()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.prevArrow?r.cloneElement(this.props.prevArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"0",type:"button"},n)," ","Previous")}}])}(r.PureComponent),J=function(e){function t(){return(0,a.A)(this,t),Q(this,t,arguments)}return(0,d.A)(t,e),(0,l.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-next":!0},t=this.clickHandler.bind(this,{message:"next"});T(this.props)||(e["slick-disabled"]=!0,t=null);var n={key:"1","data-role":"none",className:b()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.nextArrow?r.cloneElement(this.props.nextArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"1",type:"button"},n)," ","Next")}}])}(r.PureComponent),ee=n(3591),te=["animating"];var ne=function(e){function t(e){var n,l,d,p;(0,a.A)(this,t),l=this,d=t,p=[e],d=(0,u.A)(d),n=(0,c.A)(l,(0,s.A)()?Reflect.construct(d,p||[],(0,u.A)(l).constructor):d.apply(l,p)),(0,f.A)(n,"listRefHandler",(function(e){return n.list=e})),(0,f.A)(n,"trackRefHandler",(function(e){return n.track=e})),(0,f.A)(n,"adaptHeight",(function(){if(n.props.adaptiveHeight&&n.list){var e=n.list.querySelector('[data-index="'.concat(n.state.currentSlide,'"]'));n.list.style.height=$(e)+"px"}})),(0,f.A)(n,"componentDidMount",(function(){if(n.props.onInit&&n.props.onInit(),n.props.lazyLoad){var e=S((0,i.A)((0,i.A)({},n.props),n.state));e.length>0&&(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e))}var t=(0,i.A)({listRef:n.list,trackRef:n.track},n.props);n.updateState(t,!0,(function(){n.adaptHeight(),n.props.autoplay&&n.autoPlay("playing")})),"progressive"===n.props.lazyLoad&&(n.lazyLoadTimer=setInterval(n.progressiveLazyLoad,1e3)),n.ro=new ee.A((function(){n.state.animating?(n.onWindowResized(!1),n.callbackTimers.push(setTimeout((function(){return n.onWindowResized()}),n.props.speed))):n.onWindowResized()})),n.ro.observe(n.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),(function(e){e.onfocus=n.props.pauseOnFocus?n.onSlideFocus:null,e.onblur=n.props.pauseOnFocus?n.onSlideBlur:null})),window.addEventListener?window.addEventListener("resize",n.onWindowResized):window.attachEvent("onresize",n.onWindowResized)})),(0,f.A)(n,"componentWillUnmount",(function(){n.animationEndCallback&&clearTimeout(n.animationEndCallback),n.lazyLoadTimer&&clearInterval(n.lazyLoadTimer),n.callbackTimers.length&&(n.callbackTimers.forEach((function(e){return clearTimeout(e)})),n.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",n.onWindowResized):window.detachEvent("onresize",n.onWindowResized),n.autoplayTimer&&clearInterval(n.autoplayTimer),n.ro.disconnect()})),(0,f.A)(n,"componentDidUpdate",(function(e){if(n.checkImagesLoad(),n.props.onReInit&&n.props.onReInit(),n.props.lazyLoad){var t=S((0,i.A)((0,i.A)({},n.props),n.state));t.length>0&&(n.setState((function(e){return{lazyLoadedList:e.lazyLoadedList.concat(t)}})),n.props.onLazyLoad&&n.props.onLazyLoad(t))}n.adaptHeight();var o=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state),a=n.didPropsChange(e);a&&n.updateState(o,a,(function(){n.state.currentSlide>=r.Children.count(n.props.children)&&n.changeSlide({message:"index",index:r.Children.count(n.props.children)-n.props.slidesToShow,currentSlide:n.state.currentSlide}),e.autoplay===n.props.autoplay&&e.autoplaySpeed===n.props.autoplaySpeed||(!e.autoplay&&n.props.autoplay?n.autoPlay("playing"):n.props.autoplay?n.autoPlay("update"):n.pause("paused"))}))})),(0,f.A)(n,"onWindowResized",(function(e){n.debouncedResize&&n.debouncedResize.cancel(),n.debouncedResize=h(50,(function(){return n.resizeWindow(e)})),n.debouncedResize()})),(0,f.A)(n,"resizeWindow",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];if(Boolean(n.track&&n.track.node)){var t=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state);n.updateState(t,e,(function(){n.props.autoplay?n.autoPlay("update"):n.pause("paused")})),n.setState({animating:!1}),clearTimeout(n.animationEndCallback),delete n.animationEndCallback}})),(0,f.A)(n,"updateState",(function(e,t,o){var a=function(e){var t,n=r.Children.count(e.children),o=e.listRef,a=Math.ceil(M(o)),l=e.trackRef&&e.trackRef.node,c=Math.ceil(M(l));if(e.vertical)t=a;else{var s=e.centerMode&&2*parseInt(e.centerPadding);"string"==typeof e.centerPadding&&"%"===e.centerPadding.slice(-1)&&(s*=a/100),t=Math.ceil((a-s)/e.slidesToShow)}var u=o&&$(o.querySelector('[data-index="0"]')),d=u*e.slidesToShow,f=void 0===e.currentSlide?e.initialSlide:e.currentSlide;e.rtl&&void 0===e.currentSlide&&(f=n-1-e.initialSlide);var p=e.lazyLoadedList||[],v=S((0,i.A)((0,i.A)({},e),{},{currentSlide:f,lazyLoadedList:p})),m={slideCount:n,slideWidth:t,listWidth:a,trackWidth:c,currentSlide:f,slideHeight:u,listHeight:d,lazyLoadedList:p=p.concat(v)};return null===e.autoplaying&&e.autoplay&&(m.autoplaying="playing"),m}(e);e=(0,i.A)((0,i.A)((0,i.A)({},e),a),{},{slideIndex:a.currentSlide});var l=j(e);e=(0,i.A)((0,i.A)({},e),{},{left:l});var c=I(e);(t||r.Children.count(n.props.children)!==r.Children.count(e.children))&&(a.trackStyle=c),n.setState(a,o)})),(0,f.A)(n,"ssrInit",(function(){if(n.props.variableWidth){var e=0,t=0,o=[],a=_((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length})),l=H((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length}));n.props.children.forEach((function(t){o.push(t.props.style.width),e+=t.props.style.width}));for(var c=0;c=t&&n.onWindowResized()};if(e.onclick){var i=e.onclick;e.onclick=function(t){i(t),e.parentNode.focus()}}else e.onclick=function(){return e.parentNode.focus()};e.onload||(n.props.lazyLoad?e.onload=function(){n.adaptHeight(),n.callbackTimers.push(setTimeout(n.onWindowResized,n.props.speed))}:(e.onload=o,e.onerror=function(){o(),n.props.onLazyLoadError&&n.props.onLazyLoadError()}))}))})),(0,f.A)(n,"progressiveLazyLoad",(function(){for(var e=[],t=(0,i.A)((0,i.A)({},n.props),n.state),r=n.state.currentSlide;r=-_(t);o--)if(n.state.lazyLoadedList.indexOf(o)<0){e.push(o);break}e.length>0?(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e)):n.lazyLoadTimer&&(clearInterval(n.lazyLoadTimer),delete n.lazyLoadTimer)})),(0,f.A)(n,"slideHandler",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=n.props,o=r.asNavFor,a=r.beforeChange,l=r.onLazyLoad,c=r.speed,s=r.afterChange,u=n.state.currentSlide,d=function(e){var t=e.waitForAnimate,n=e.animating,r=e.fade,o=e.infinite,a=e.index,l=e.slideCount,c=e.lazyLoad,s=e.currentSlide,u=e.centerMode,d=e.slidesToScroll,f=e.slidesToShow,p=e.useCSS,v=e.lazyLoadedList;if(t&&n)return{};var m,h,g,b=a,y={},w={},x=o?a:A(a,0,l-1);if(r){if(!o&&(a<0||a>=l))return{};a<0?b=a+l:a>=l&&(b=a-l),c&&v.indexOf(b)<0&&(v=v.concat(b)),y={animating:!0,currentSlide:b,lazyLoadedList:v,targetSlide:b},w={animating:!1,targetSlide:b}}else m=b,b<0?(m=b+l,o?l%d!=0&&(m=l-l%d):m=0):!T(e)&&b>s?b=m=s:u&&b>=l?(b=o?l:l-1,m=o?0:l-1):b>=l&&(m=b-l,o?l%d!=0&&(m=0):m=l-f),!o&&b+f>=l&&(m=l-f),h=j((0,i.A)((0,i.A)({},e),{},{slideIndex:b})),g=j((0,i.A)((0,i.A)({},e),{},{slideIndex:m})),o||(h===g&&(b=m),h=g),c&&(v=v.concat(S((0,i.A)((0,i.A)({},e),{},{currentSlide:b})))),p?(y={animating:!0,currentSlide:m,trackStyle:L((0,i.A)((0,i.A)({},e),{},{left:h})),lazyLoadedList:v,targetSlide:x},w={animating:!1,currentSlide:m,trackStyle:I((0,i.A)((0,i.A)({},e),{},{left:g})),swipeLeft:null,targetSlide:x}):y={currentSlide:m,trackStyle:I((0,i.A)((0,i.A)({},e),{},{left:g})),lazyLoadedList:v,targetSlide:x};return{state:y,nextState:w}}((0,i.A)((0,i.A)((0,i.A)({index:e},n.props),n.state),{},{trackRef:n.track,useCSS:n.props.useCSS&&!t})),f=d.state,p=d.nextState;if(f){a&&a(u,f.currentSlide);var m=f.lazyLoadedList.filter((function(e){return n.state.lazyLoadedList.indexOf(e)<0}));l&&m.length>0&&l(m),!n.props.waitForAnimate&&n.animationEndCallback&&(clearTimeout(n.animationEndCallback),s&&s(u),delete n.animationEndCallback),n.setState(f,(function(){o&&n.asNavForIndex!==e&&(n.asNavForIndex=e,o.innerSlider.slideHandler(e)),p&&(n.animationEndCallback=setTimeout((function(){var e=p.animating,t=(0,v.A)(p,te);n.setState(t,(function(){n.callbackTimers.push(setTimeout((function(){return n.setState({animating:e})}),10)),s&&s(f.currentSlide),delete n.animationEndCallback}))}),c))}))}})),(0,f.A)(n,"changeSlide",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=function(e,t){var n,r,o,a,l=e.slidesToScroll,c=e.slidesToShow,s=e.slideCount,u=e.currentSlide,d=e.targetSlide,f=e.lazyLoad,p=e.infinite;if(n=s%l!=0?0:(s-u)%l,"previous"===t.message)a=u-(o=0===n?l:c-n),f&&!p&&(a=-1==(r=u-o)?s-1:r),p||(a=d-l);else if("next"===t.message)a=u+(o=0===n?l:n),f&&!p&&(a=(u+l)%s+n),p||(a=d+l);else if("dots"===t.message)a=t.index*t.slidesToScroll;else if("children"===t.message){if(a=t.index,p){var v=B((0,i.A)((0,i.A)({},e),{},{targetSlide:a}));a>t.currentSlide&&"left"===v?a-=s:a10)return{scrolling:!0};l&&(b.swipeLength=E);var M=(c?-1:1)*(b.curX>b.startX?1:-1);l&&(M=b.curY>b.startY?1:-1);var $=Math.ceil(m/h),R=O(t.touchObject,l),z=b.swipeLength;return g||(0===s&&("right"===R||"down"===R)||s+1>=$&&("left"===R||"up"===R)||!T(t)&&("left"===R||"up"===R))&&(z=b.swipeLength*u,!1===d&&f&&(f(R),C.edgeDragged=!0)),!p&&y&&(y(R),C.swiped=!0),x=o?k+z*(A/S)*M:c?k-z*M:k+z*M,l&&(x=k+z*M),C=(0,i.A)((0,i.A)({},C),{},{touchObject:b,swipeLeft:x,trackStyle:I((0,i.A)((0,i.A)({},t),{},{left:x}))}),Math.abs(b.curX-b.startX)<.8*Math.abs(b.curY-b.startY)||b.swipeLength>10&&(C.swiping=!0,w(e)),C}}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));t&&(t.swiping&&(n.clickable=!1),n.setState(t))})),(0,f.A)(n,"swipeEnd",(function(e){var t=function(e,t){var n=t.dragging,r=t.swipe,o=t.touchObject,a=t.listWidth,l=t.touchThreshold,c=t.verticalSwiping,s=t.listHeight,u=t.swipeToSlide,d=t.scrolling,f=t.onSwipe,p=t.targetSlide,v=t.currentSlide,m=t.infinite;if(!n)return r&&w(e),{};var h=c?s/l:a/l,g=O(o,c),b={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(d)return b;if(!o.swipeLength)return b;if(o.swipeLength>h){var y,A;w(e),f&&f(g);var S=m?v:p;switch(g){case"left":case"up":A=S+P(t),y=u?z(t,A):A,b.currentDirection=0;break;case"right":case"down":A=S-P(t),y=u?z(t,A):A,b.currentDirection=1;break;default:y=S}b.triggerSlideHandler=y}else{var x=j(t);b.trackStyle=L((0,i.A)((0,i.A)({},t),{},{left:x}))}return b}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));if(t){var r=t.triggerSlideHandler;delete t.triggerSlideHandler,n.setState(t),void 0!==r&&(n.slideHandler(r),n.props.verticalSwiping&&n.enableBodyScroll())}})),(0,f.A)(n,"touchEnd",(function(e){n.swipeEnd(e),n.clickable=!0})),(0,f.A)(n,"slickPrev",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"previous"})}),0))})),(0,f.A)(n,"slickNext",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"next"})}),0))})),(0,f.A)(n,"slickGoTo",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e=Number(e),isNaN(e))return"";n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"index",index:e,currentSlide:n.state.currentSlide},t)}),0))})),(0,f.A)(n,"play",(function(){var e;if(n.props.rtl)e=n.state.currentSlide-n.props.slidesToScroll;else{if(!T((0,i.A)((0,i.A)({},n.props),n.state)))return!1;e=n.state.currentSlide+n.props.slidesToScroll}n.slideHandler(e)})),(0,f.A)(n,"autoPlay",(function(e){n.autoplayTimer&&clearInterval(n.autoplayTimer);var t=n.state.autoplaying;if("update"===e){if("hovered"===t||"focused"===t||"paused"===t)return}else if("leave"===e){if("paused"===t||"focused"===t)return}else if("blur"===e&&("paused"===t||"hovered"===t))return;n.autoplayTimer=setInterval(n.play,n.props.autoplaySpeed+50),n.setState({autoplaying:"playing"})})),(0,f.A)(n,"pause",(function(e){n.autoplayTimer&&(clearInterval(n.autoplayTimer),n.autoplayTimer=null);var t=n.state.autoplaying;"paused"===e?n.setState({autoplaying:"paused"}):"focused"===e?"hovered"!==t&&"playing"!==t||n.setState({autoplaying:"focused"}):"playing"===t&&n.setState({autoplaying:"hovered"})})),(0,f.A)(n,"onDotsOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onDotsLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onTrackOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onTrackLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onSlideFocus",(function(){return n.props.autoplay&&n.pause("focused")})),(0,f.A)(n,"onSlideBlur",(function(){return n.props.autoplay&&"focused"===n.state.autoplaying&&n.autoPlay("blur")})),(0,f.A)(n,"render",(function(){var e,t,a,l=b()("slick-slider",n.props.className,{"slick-vertical":n.props.vertical,"slick-initialized":!0}),c=(0,i.A)((0,i.A)({},n.props),n.state),s=R(c,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),u=n.props.pauseOnHover;if(s=(0,i.A)((0,i.A)({},s),{},{onMouseEnter:u?n.onTrackOver:null,onMouseLeave:u?n.onTrackLeave:null,onMouseOver:u?n.onTrackOver:null,focusOnSelect:n.props.focusOnSelect&&n.clickable?n.selectHandler:null}),!0===n.props.dots&&n.state.slideCount>=n.props.slidesToShow){var d=R(c,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),f=n.props.pauseOnDotsHover;d=(0,i.A)((0,i.A)({},d),{},{clickHandler:n.changeSlide,onMouseEnter:f?n.onDotsLeave:null,onMouseOver:f?n.onDotsOver:null,onMouseLeave:f?n.onDotsLeave:null}),e=r.createElement(V,d)}var p=R(c,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);p.clickHandler=n.changeSlide,n.props.arrows&&(t=r.createElement(Z,p),a=r.createElement(J,p));var v=null;n.props.vertical&&(v={height:n.state.listHeight});var m=null;!1===n.props.vertical?!0===n.props.centerMode&&(m={padding:"0px "+n.props.centerPadding}):!0===n.props.centerMode&&(m={padding:n.props.centerPadding+" 0px"});var h=(0,i.A)((0,i.A)({},v),m),g=n.props.touchMove,y={className:"slick-list",style:h,onClick:n.clickHandler,onMouseDown:g?n.swipeStart:null,onMouseMove:n.state.dragging&&g?n.swipeMove:null,onMouseUp:g?n.swipeEnd:null,onMouseLeave:n.state.dragging&&g?n.swipeEnd:null,onTouchStart:g?n.swipeStart:null,onTouchMove:n.state.dragging&&g?n.swipeMove:null,onTouchEnd:g?n.touchEnd:null,onTouchCancel:n.state.dragging&&g?n.swipeEnd:null,onKeyDown:n.props.accessibility?n.keyHandler:null},A={className:l,dir:"ltr",style:n.props.style};return n.props.unslick&&(y={className:"slick-list"},A={className:l,style:n.props.style}),r.createElement("div",A,n.props.unslick?"":t,r.createElement("div",(0,o.A)({ref:n.listRefHandler},y),r.createElement(U,(0,o.A)({ref:n.trackRefHandler},s),n.props.children)),n.props.unslick?"":a,n.props.unslick?"":e)})),n.list=null,n.track=null,n.state=(0,i.A)((0,i.A)({},m),{},{currentSlide:n.props.initialSlide,targetSlide:n.props.initialSlide?n.props.initialSlide:0,slideCount:r.Children.count(n.props.children)}),n.callbackTimers=[],n.clickable=!0,n.debouncedResize=null;var g=n.ssrInit();return n.state=(0,i.A)((0,i.A)({},n.state),g),n}return(0,d.A)(t,e),(0,l.A)(t,[{key:"didPropsChange",value:function(e){for(var t=!1,n=0,o=Object.keys(this.props);n1&&void 0!==arguments[1]&&arguments[1];return n.innerSlider.slickGoTo(e,t)})),(0,f.A)(n,"slickPause",(function(){return n.innerSlider.pause("paused")})),(0,f.A)(n,"slickPlay",(function(){return n.innerSlider.autoPlay("play")})),n.state={breakpoint:null},n._responsiveMediaHandlers=[],n}return(0,d.A)(t,e),(0,l.A)(t,[{key:"media",value:function(e,t){var n=window.matchMedia(e),r=function(e){e.matches&&t()};n.addListener(r),r(n),this._responsiveMediaHandlers.push({mql:n,query:e,listener:r})}},{key:"componentDidMount",value:function(){var e=this;if(this.props.responsive){var t=this.props.responsive.map((function(e){return e.breakpoint}));t.sort((function(e,t){return e-t})),t.forEach((function(n,r){var o;o=0===r?oe()({minWidth:0,maxWidth:n}):oe()({minWidth:t[r-1]+1,maxWidth:n}),X()&&e.media(o,(function(){e.setState({breakpoint:n})}))}));var n=oe()({minWidth:t.slice(-1)[0]});X()&&this.media(n,(function(){e.setState({breakpoint:null})}))}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach((function(e){e.mql.removeListener(e.listener)}))}},{key:"render",value:function(){var e,t,n=this;(e=this.state.breakpoint?"unslick"===(t=this.props.responsive.filter((function(e){return e.breakpoint===n.state.breakpoint})))[0].settings?"unslick":(0,i.A)((0,i.A)((0,i.A)({},y),this.props),t[0].settings):(0,i.A)((0,i.A)({},y),this.props)).centerMode&&(e.slidesToScroll,e.slidesToScroll=1),e.fade&&(e.slidesToShow,e.slidesToScroll,e.slidesToShow=1,e.slidesToScroll=1);var a=r.Children.toArray(this.props.children);a=a.filter((function(e){return"string"==typeof e?!!e.trim():!!e})),e.variableWidth&&(e.rows>1||e.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),e.variableWidth=!1);for(var l=[],c=null,s=0;s=a.length));p+=1)f.push(r.cloneElement(a[p],{key:100*s+10*d+p,tabIndex:-1,style:{width:"".concat(100/e.slidesPerRow,"%"),display:"inline-block"}}));u.push(r.createElement("div",{key:10*s+d},f))}e.variableWidth?l.push(r.createElement("div",{key:s,style:{width:c}},u)):l.push(r.createElement("div",{key:s},u))}if("unslick"===e){var v="regular slider "+(this.props.className||"");return r.createElement("div",{className:v},a)}return l.length<=e.slidesToShow&&!e.infinite&&(e.unslick=!0),r.createElement(ne,(0,o.A)({style:this.props.style,ref:this.innerSliderRefHandler},function(e){return K.reduce((function(t,n){return e.hasOwnProperty(n)&&(t[n]=e[n]),t}),{})}(e)),l)}}])}(r.Component);var ae=n(2279),le=n(1466),ce=n(5905),se=n(665),ue=n(336);const de=e=>{const{componentCls:t,antCls:n,carouselArrowSize:r,carouselDotOffset:o,marginXXS:i}=e,a=e.calc(r).mul(-1.25).equal(),l=i;return{[t]:Object.assign(Object.assign({},(0,ce.dF)(e)),{".slick-slider":{position:"relative",display:"block",boxSizing:"border-box",touchAction:"pan-y",WebkitTouchCallout:"none",WebkitTapHighlightColor:"transparent",".slick-track, .slick-list":{transform:"translate3d(0, 0, 0)",touchAction:"pan-y"}},".slick-list":{position:"relative",display:"block",margin:0,padding:0,overflow:"hidden","&:focus":{outline:"none"},"&.dragging":{cursor:"pointer"},".slick-slide":{pointerEvents:"none",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"hidden"},"&.slick-active":{pointerEvents:"auto",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"visible"}},"> div > div":{verticalAlign:"bottom"}}},".slick-track":{position:"relative",top:0,insetInlineStart:0,display:"block","&::before, &::after":{display:"table",content:'""'},"&::after":{clear:"both"}},".slick-slide":{display:"none",float:"left",height:"100%",minHeight:1,img:{display:"block"},"&.dragging img":{pointerEvents:"none"}},".slick-initialized .slick-slide":{display:"block"},".slick-vertical .slick-slide":{display:"block",height:"auto"},".slick-arrow.slick-hidden":{display:"none"},".slick-prev, .slick-next":{position:"absolute",top:"50%",display:"block",width:r,height:r,marginTop:e.calc(r).mul(-1).div(2).equal(),padding:0,color:"transparent",fontSize:0,lineHeight:0,background:"transparent",border:0,outline:"none",cursor:"pointer","&:hover, &:focus":{color:"transparent",background:"transparent",outline:"none","&::before":{opacity:1}},"&.slick-disabled::before":{opacity:.25}},".slick-prev":{insetInlineStart:a,"&::before":{content:'"\u2190"'}},".slick-next":{insetInlineEnd:a,"&::before":{content:'"\u2192"'}},".slick-dots":{position:"absolute",insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:15,display:"flex !important",justifyContent:"center",paddingInlineStart:0,margin:0,listStyle:"none","&-bottom":{bottom:o},"&-top":{top:o,bottom:"auto"},li:{position:"relative",display:"inline-block",flex:"0 1 auto",boxSizing:"content-box",width:e.dotWidth,height:e.dotHeight,marginInline:l,padding:0,textAlign:"center",textIndent:-999,verticalAlign:"top",transition:`all ${e.motionDurationSlow}`,button:{position:"relative",display:"block",width:"100%",height:e.dotHeight,padding:0,color:"transparent",fontSize:0,background:e.colorBgContainer,border:0,borderRadius:e.dotHeight,outline:"none",cursor:"pointer",opacity:.3,transition:`all ${e.motionDurationSlow}`,"&: hover, &:focus":{opacity:.75},"&::after":{position:"absolute",inset:e.calc(l).mul(-1).equal(),content:'""'}},"&.slick-active":{width:e.dotActiveWidth,"& button":{background:e.colorBgContainer,opacity:1},"&: hover, &:focus":{opacity:1}}}}})}},fe=e=>{const{componentCls:t,carouselDotOffset:n,marginXXS:r}=e,o={width:e.dotHeight,height:e.dotWidth};return{[`${t}-vertical`]:{".slick-dots":{top:"50%",bottom:"auto",flexDirection:"column",width:e.dotHeight,height:"auto",margin:0,transform:"translateY(-50%)","&-left":{insetInlineEnd:"auto",insetInlineStart:n},"&-right":{insetInlineEnd:n,insetInlineStart:"auto"},li:Object.assign(Object.assign({},o),{margin:`${(0,le.zA)(r)} 0`,verticalAlign:"baseline",button:o,"&.slick-active":Object.assign(Object.assign({},o),{button:o})})}}}},pe=e=>{const{componentCls:t}=e;return[{[`${t}-rtl`]:{direction:"rtl",".slick-dots":{[`${t}-rtl&`]:{flexDirection:"row-reverse"}}}},{[`${t}-vertical`]:{".slick-dots":{[`${t}-rtl&`]:{flexDirection:"column"}}}}]},ve=(0,se.OF)("Carousel",(e=>{const{controlHeightLG:t,controlHeightSM:n}=e,r=(0,ue.h1)(e,{carouselArrowSize:e.calc(t).div(2).equal(),carouselDotOffset:e.calc(n).div(2).equal()});return[de(r),fe(r),pe(r)]}),(()=>({dotWidth:16,dotHeight:3,dotWidthActive:24,dotActiveWidth:24})),{deprecatedTokens:[["dotWidthActive","dotActiveWidth"]]});var me=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{dots:n=!0,arrows:o=!1,draggable:i=!1,waitForAnimate:a=!1,dotPosition:l="bottom",vertical:c="left"===l||"right"===l,rootClassName:s,className:u,style:d,id:f}=e,p=me(e,["dots","arrows","draggable","waitForAnimate","dotPosition","vertical","rootClassName","className","style","id"]),{getPrefixCls:v,direction:m,carousel:h}=r.useContext(ae.QO),g=r.useRef(),y=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];g.current.slickGoTo(e,t)};r.useImperativeHandle(t,(()=>({goTo:y,autoPlay:g.current.innerSlider.autoPlay,innerSlider:g.current.innerSlider,prev:g.current.slickPrev,next:g.current.slickNext})),[g.current]);const A=r.useRef(r.Children.count(e.children));r.useEffect((()=>{A.current!==r.Children.count(e.children)&&(y(e.initialSlide||0,!1),A.current=r.Children.count(e.children))}),[e.children]);const w=Object.assign({vertical:c,className:b()(u,null==h?void 0:h.className),style:Object.assign(Object.assign({},null==h?void 0:h.style),d)},p);"fade"===w.effect&&(w.fade=!0);const S=v("carousel",w.prefixCls),x="slick-dots",C=!!n,k=b()(x,`${x}-${l}`,"boolean"!=typeof n&&(null==n?void 0:n.className)),[E,M,$]=ve(S),O=b()(S,{[`${S}-rtl`]:"rtl"===m,[`${S}-vertical`]:w.vertical},M,$,s);return E(r.createElement("div",{className:O,id:f},r.createElement(ie,Object.assign({ref:g},w,{dots:C,dotsClass:k,arrows:o,draggable:i,verticalSwiping:c,waitForAnimate:a}))))}));const ge=he},2279:(e,t,n)=>{"use strict";n.d(t,{QO:()=>r});const r=n(6540).createContext({getPrefixCls:(e,t)=>t||(e?`ant-${e}`:"ant"),iconPrefixCls:"anticon"}),{Consumer:o}=r},934:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3511);const o=e=>{const[,,,,t]=(0,r.Ay)();return t?`${e}-css-var`:""}},4016:(e,t,n)=>{"use strict";n.d(t,{A:()=>x});var r=n(6540),o=n(6942),i=n.n(o),a=n(9853);function l(e){return["small","middle","large"].includes(e)}var c=n(2279),s=n(665),u=n(336);const d=["wrap","nowrap","wrap-reverse"],f=["flex-start","flex-end","start","end","center","space-between","space-around","space-evenly","stretch","normal","left","right"],p=["center","start","end","flex-start","flex-end","self-start","self-end","baseline","normal","stretch"];const v=function(e,t){return i()(Object.assign(Object.assign(Object.assign({},((e,t)=>{const n={};return d.forEach((r=>{n[`${e}-wrap-${r}`]=t.wrap===r})),n})(e,t)),((e,t)=>{const n={};return p.forEach((r=>{n[`${e}-align-${r}`]=t.align===r})),n[`${e}-align-stretch`]=!t.align&&!!t.vertical,n})(e,t)),((e,t)=>{const n={};return f.forEach((r=>{n[`${e}-justify-${r}`]=t.justify===r})),n})(e,t)))},m=e=>{const{componentCls:t}=e;return{[t]:{display:"flex","&-vertical":{flexDirection:"column"},"&-rtl":{direction:"rtl"},"&:empty":{display:"none"}}}},h=e=>{const{componentCls:t}=e;return{[t]:{"&-gap-small":{gap:e.flexGapSM},"&-gap-middle":{gap:e.flexGap},"&-gap-large":{gap:e.flexGapLG}}}},g=e=>{const{componentCls:t}=e,n={};return d.forEach((e=>{n[`${t}-wrap-${e}`]={flexWrap:e}})),n},b=e=>{const{componentCls:t}=e,n={};return p.forEach((e=>{n[`${t}-align-${e}`]={alignItems:e}})),n},y=e=>{const{componentCls:t}=e,n={};return f.forEach((e=>{n[`${t}-justify-${e}`]={justifyContent:e}})),n},A=(0,s.OF)("Flex",(e=>{const{paddingXS:t,padding:n,paddingLG:r}=e,o=(0,u.h1)(e,{flexGapSM:t,flexGap:n,flexGapLG:r});return[m(o),h(o),g(o),b(o),y(o)]}),(()=>({})),{resetStyle:!1});var w=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{prefixCls:n,rootClassName:o,className:s,style:u,flex:d,gap:f,children:p,vertical:m=!1,component:h="div"}=e,g=w(e,["prefixCls","rootClassName","className","style","flex","gap","children","vertical","component"]),{flex:b,direction:y,getPrefixCls:S}=r.useContext(c.QO),x=S("flex",n),[C,k,E]=A(x),M=null!=m?m:null==b?void 0:b.vertical,$=i()(s,o,null==b?void 0:b.className,x,k,E,v(x,e),{[`${x}-rtl`]:"rtl"===y,[`${x}-gap-${f}`]:l(f),[`${x}-vertical`]:M}),O=Object.assign(Object.assign({},null==b?void 0:b.style),u);return d&&(O.flex=d),f&&!l(f)&&(O.gap=f),C(r.createElement(h,Object.assign({ref:t,className:$,style:O},(0,a.A)(g,["justify","wrap","align"])),p))}));const x=S},3343:(e,t,n)=>{"use strict";n.d(t,{A:()=>$t});var r=n(6540),o=n(8168);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"}}]},name:"eye",theme:"outlined"};var a=n(8046),l=function(e,t){return r.createElement(a.A,(0,o.A)({},e,{ref:t,icon:i}))};const c=r.forwardRef(l);var s=n(6942),u=n.n(s),d=n(9379),f=n(4467),p=n(6636),v=n(2284),m=n(45);function h(){return{width:document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight}}var g=n(2533),b=["crossOrigin","decoding","draggable","loading","referrerPolicy","sizes","srcSet","useMap","alt"],y=r.createContext(null),A=0;function w(e){var t=e.src,n=e.isCustomPlaceholder,o=e.fallback,i=(0,r.useState)(n?"loading":"normal"),a=(0,p.A)(i,2),l=a[0],c=a[1],s=(0,r.useRef)(!1),u="error"===l;(0,r.useEffect)((function(){var e=!0;return function(e){return new Promise((function(t){var n=document.createElement("img");n.onerror=function(){return t(!1)},n.onload=function(){return t(!0)},n.src=e}))}(t).then((function(t){!t&&e&&c("error")})),function(){e=!1}}),[t]),(0,r.useEffect)((function(){n&&!s.current?c("loading"):u&&c("normal")}),[t]);var d=function(){c("normal")};return[function(e){s.current=!1,"loading"===l&&null!=e&&e.complete&&(e.naturalWidth||e.naturalHeight)&&(s.current=!0,d())},u&&o?{src:o}:{onLoad:d,src:t},l]}var S=n(5470),x=r.createContext({}),C=n(4808),k=n(6855),E=n(6928),M="".concat("accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap"," ").concat("onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError").split(/[\s\n]+/),$="aria-",O="data-";function T(e,t){return 0===e.indexOf(t)}function R(e){var t,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t=!1===n?{aria:!0,data:!0,attr:!0}:!0===n?{aria:!0}:(0,d.A)({},n);var r={};return Object.keys(e).forEach((function(n){(t.aria&&("role"===n||T(n,$))||t.data&&T(n,O)||t.attr&&M.includes(n))&&(r[n]=e[n])})),r}function z(e,t,n){var r=t;return!r&&n&&(r="".concat(e,"-").concat(n)),r}function P(e,t){var n=e["page".concat(t?"Y":"X","Offset")],r="scroll".concat(t?"Top":"Left");if("number"!=typeof n){var o=e.document;"number"!=typeof(n=o.documentElement[r])&&(n=o.body[r])}return n}var N=n(8542),I=n(8719);const L=r.memo((function(e){return e.children}),(function(e,t){return!t.shouldUpdate}));var j={width:0,height:0,overflow:"hidden",outline:"none"},_={outline:"none"},H=r.forwardRef((function(e,t){var n=e.prefixCls,i=e.className,a=e.style,l=e.title,c=e.ariaId,s=e.footer,f=e.closable,p=e.closeIcon,m=e.onClose,h=e.children,g=e.bodyStyle,b=e.bodyProps,y=e.modalRender,A=e.onMouseDown,w=e.onMouseUp,S=e.holderRef,C=e.visible,k=e.forceRender,E=e.width,M=e.height,$=e.classNames,O=e.styles,T=r.useContext(x).panel,z=(0,I.xK)(S,T),P=(0,r.useRef)(),N=(0,r.useRef)(),H=(0,r.useRef)();r.useImperativeHandle(t,(function(){return{focus:function(){var e;null===(e=H.current)||void 0===e||e.focus()},changeActive:function(e){var t=document.activeElement;e&&t===N.current?P.current.focus():e||t!==P.current||N.current.focus()}}}));var D,B,W={};void 0!==E&&(W.width=E),void 0!==M&&(W.height=M),s&&(D=r.createElement("div",{className:u()("".concat(n,"-footer"),null==$?void 0:$.footer),style:(0,d.A)({},null==O?void 0:O.footer)},s)),l&&(B=r.createElement("div",{className:u()("".concat(n,"-header"),null==$?void 0:$.header),style:(0,d.A)({},null==O?void 0:O.header)},r.createElement("div",{className:"".concat(n,"-title"),id:c},l)));var F,X=(0,r.useMemo)((function(){return"object"===(0,v.A)(f)&&null!==f?f:f?{closeIcon:null!=p?p:r.createElement("span",{className:"".concat(n,"-close-x")})}:{}}),[f,p]),K=R(X,!0);f&&(F=r.createElement("button",(0,o.A)({type:"button",onClick:m,"aria-label":"Close"},K,{className:"".concat(n,"-close")}),X.closeIcon));var G=r.createElement("div",{className:u()("".concat(n,"-content"),null==$?void 0:$.content),style:null==O?void 0:O.content},F,B,r.createElement("div",(0,o.A)({className:u()("".concat(n,"-body"),null==$?void 0:$.body),style:(0,d.A)((0,d.A)({},g),null==O?void 0:O.body)},b),h),D);return r.createElement("div",{key:"dialog-element",role:"dialog","aria-labelledby":l?c:null,"aria-modal":"true",ref:z,style:(0,d.A)((0,d.A)({},a),W),className:u()(n,i),onMouseDown:A,onMouseUp:w},r.createElement("div",{tabIndex:0,ref:P,style:j,"aria-hidden":"true"}),r.createElement("div",{ref:H,tabIndex:-1,style:_},r.createElement(L,{shouldUpdate:C||k},y?y(G):G)),r.createElement("div",{tabIndex:0,ref:N,style:j,"aria-hidden":"true"}))}));const D=H;var B=r.forwardRef((function(e,t){var n=e.prefixCls,i=e.title,a=e.style,l=e.className,c=e.visible,s=e.forceRender,f=e.destroyOnClose,v=e.motionName,m=e.ariaId,h=e.onVisibleChanged,g=e.mousePosition,b=(0,r.useRef)(),y=r.useState(),A=(0,p.A)(y,2),w=A[0],S=A[1],x={};function C(){var e,t,n,r,o,i=(e=b.current,t=e.getBoundingClientRect(),n={left:t.left,top:t.top},r=e.ownerDocument,o=r.defaultView||r.parentWindow,n.left+=P(o),n.top+=P(o,!0),n);S(g?"".concat(g.x-i.left,"px ").concat(g.y-i.top,"px"):"")}return w&&(x.transformOrigin=w),r.createElement(N.Ay,{visible:c,onVisibleChanged:h,onAppearPrepare:C,onEnterPrepare:C,forceRender:s,motionName:v,removeOnLeave:f,ref:b},(function(c,s){var f=c.className,p=c.style;return r.createElement(D,(0,o.A)({},e,{ref:t,title:i,ariaId:m,prefixCls:n,holderRef:s,style:(0,d.A)((0,d.A)((0,d.A)({},p),a),x),className:u()(l,f)}))}))}));B.displayName="Content";const W=B;function F(e){var t=e.prefixCls,n=e.style,i=e.visible,a=e.maskProps,l=e.motionName,c=e.className;return r.createElement(N.Ay,{key:"mask",visible:i,motionName:l,leavedClassName:"".concat(t,"-mask-hidden")},(function(e,i){var l=e.className,s=e.style;return r.createElement("div",(0,o.A)({ref:i,style:(0,d.A)((0,d.A)({},s),n),className:u()("".concat(t,"-mask"),l,c)},a))}))}var X=n(8210);function K(e){var t=e.prefixCls,n=void 0===t?"rc-dialog":t,i=e.zIndex,a=e.visible,l=void 0!==a&&a,c=e.keyboard,s=void 0===c||c,f=e.focusTriggerAfterClose,v=void 0===f||f,m=e.wrapStyle,h=e.wrapClassName,g=e.wrapProps,b=e.onClose,y=e.afterOpenChange,A=e.afterClose,w=e.transitionName,S=e.animation,x=e.closable,M=void 0===x||x,$=e.mask,O=void 0===$||$,T=e.maskTransitionName,P=e.maskAnimation,N=e.maskClosable,I=void 0===N||N,L=e.maskStyle,j=e.maskProps,_=e.rootClassName,H=e.classNames,D=e.styles;var B=(0,r.useRef)(),X=(0,r.useRef)(),K=(0,r.useRef)(),G=r.useState(l),q=(0,p.A)(G,2),Y=q[0],U=q[1],V=(0,k.A)();function Q(e){null==b||b(e)}var Z=(0,r.useRef)(!1),J=(0,r.useRef)(),ee=null;return I&&(ee=function(e){Z.current?Z.current=!1:X.current===e.target&&Q(e)}),(0,r.useEffect)((function(){l&&(U(!0),(0,C.A)(X.current,document.activeElement)||(B.current=document.activeElement))}),[l]),(0,r.useEffect)((function(){return function(){clearTimeout(J.current)}}),[]),r.createElement("div",(0,o.A)({className:u()("".concat(n,"-root"),_)},R(e,{data:!0})),r.createElement(F,{prefixCls:n,visible:O&&l,motionName:z(n,T,P),style:(0,d.A)((0,d.A)({zIndex:i},L),null==D?void 0:D.mask),maskProps:j,className:null==H?void 0:H.mask}),r.createElement("div",(0,o.A)({tabIndex:-1,onKeyDown:function(e){if(s&&e.keyCode===E.A.ESC)return e.stopPropagation(),void Q(e);l&&e.keyCode===E.A.TAB&&K.current.changeActive(!e.shiftKey)},className:u()("".concat(n,"-wrap"),h,null==H?void 0:H.wrapper),ref:X,onClick:ee,style:(0,d.A)((0,d.A)((0,d.A)({zIndex:i},m),null==D?void 0:D.wrapper),{},{display:Y?null:"none"})},g),r.createElement(W,(0,o.A)({},e,{onMouseDown:function(){clearTimeout(J.current),Z.current=!0},onMouseUp:function(){J.current=setTimeout((function(){Z.current=!1}))},ref:K,closable:M,ariaId:V,prefixCls:n,visible:l&&Y,onClose:Q,onVisibleChanged:function(e){if(e)(0,C.A)(X.current,document.activeElement)||null===(t=K.current)||void 0===t||t.focus();else{if(U(!1),O&&B.current&&v){try{B.current.focus({preventScroll:!0})}catch(n){}B.current=null}Y&&(null==A||A())}var t;null==y||y(e)},motionName:z(n,w,S)}))))}var G=function(e){var t=e.visible,n=e.getContainer,i=e.forceRender,a=e.destroyOnClose,l=void 0!==a&&a,c=e.afterClose,s=e.panelRef,u=r.useState(t),d=(0,p.A)(u,2),f=d[0],v=d[1],m=r.useMemo((function(){return{panel:s}}),[s]);return r.useEffect((function(){t&&v(!0)}),[t]),i||!l||f?r.createElement(x.Provider,{value:m},r.createElement(S.A,{open:t||i||f,autoDestroy:!1,getContainer:n,autoLock:t||f},r.createElement(K,(0,o.A)({},e,{destroyOnClose:l,afterClose:function(){null==c||c(),v(!1)}})))):null};G.displayName="Dialog";const q=G;var Y=n(961);function U(e,t,n,r){var o=Y.unstable_batchedUpdates?function(e){Y.unstable_batchedUpdates(n,e)}:n;return null!=e&&e.addEventListener&&e.addEventListener(t,o,r),{remove:function(){null!=e&&e.removeEventListener&&e.removeEventListener(t,o,r)}}}var V=n(3210),Q=n(5371),Z={x:0,y:0,rotate:0,scale:1,flipX:!1,flipY:!1};function J(e,t,n,r){var o=t+n,i=(n-r)/2;if(n>r){if(t>0)return(0,f.A)({},e,i);if(t<0&&or)return(0,f.A)({},e,t<0?i:-i);return{}}function ee(e,t,n,r){var o=h(),i=o.width,a=o.height,l=null;return e<=i&&t<=a?l={x:0,y:0}:(e>i||t>a)&&(l=(0,d.A)((0,d.A)({},J("x",n,e,i)),J("y",r,t,a))),l}function te(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.hypot(n,r)}function ne(e,t,n,o,i,a,l){var c=i.rotate,s=i.scale,u=i.x,f=i.y,v=(0,r.useState)(!1),m=(0,p.A)(v,2),h=m[0],g=m[1],b=(0,r.useRef)({point1:{x:0,y:0},point2:{x:0,y:0},eventType:"none"}),y=function(e){b.current=(0,d.A)((0,d.A)({},b.current),e)};return(0,r.useEffect)((function(){var e;return n&&t&&(e=U(window,"touchmove",(function(e){return e.preventDefault()}),{passive:!1})),function(){var t;null===(t=e)||void 0===t||t.remove()}}),[n,t]),{isTouching:h,onTouchStart:function(e){if(t){e.stopPropagation(),g(!0);var n=e.touches,r=void 0===n?[]:n;r.length>1?y({point1:{x:r[0].clientX,y:r[0].clientY},point2:{x:r[1].clientX,y:r[1].clientY},eventType:"touchZoom"}):y({point1:{x:r[0].clientX-u,y:r[0].clientY-f},eventType:"move"})}},onTouchMove:function(e){var t=e.touches,n=void 0===t?[]:t,r=b.current,o=r.point1,i=r.point2,c=r.eventType;if(n.length>1&&"touchZoom"===c){var s={x:n[0].clientX,y:n[0].clientY},u={x:n[1].clientX,y:n[1].clientY},d=function(e,t,n,r){var o=te(e,n),i=te(t,r);if(0===o&&0===i)return[e.x,e.y];var a=o/(o+i);return[e.x+a*(t.x-e.x),e.y+a*(t.y-e.y)]}(o,i,s,u),f=(0,p.A)(d,2),v=f[0],m=f[1],h=te(s,u)/te(o,i);l(h,"touchZoom",v,m,!0),y({point1:s,point2:u,eventType:"touchZoom"})}else"move"===c&&(a({x:n[0].clientX-o.x,y:n[0].clientY-o.y},"move"),y({eventType:"move"}))},onTouchEnd:function(){if(n){if(h&&g(!1),y({eventType:"none"}),o>s)return a({x:0,y:0,scale:o},"touchZoom");var t=e.current.offsetWidth*s,r=e.current.offsetHeight*s,i=e.current.getBoundingClientRect(),l=i.left,u=i.top,f=c%180!=0,p=ee(f?r:t,f?t:r,l,u);p&&a((0,d.A)({},p),"dragRebound")}}}}const re=function(e){var t=e.visible,n=e.maskTransitionName,o=e.getContainer,i=e.prefixCls,a=e.rootClassName,l=e.icons,c=e.countRender,s=e.showSwitch,p=e.showProgress,v=e.current,m=e.transform,h=e.count,g=e.scale,b=e.minScale,A=e.maxScale,w=e.closeIcon,x=e.onSwitchLeft,C=e.onSwitchRight,k=e.onClose,M=e.onZoomIn,$=e.onZoomOut,O=e.onRotateRight,T=e.onRotateLeft,R=e.onFlipX,z=e.onFlipY,P=e.toolbarRender,I=e.zIndex,L=(0,r.useContext)(y),j=l.rotateLeft,_=l.rotateRight,H=l.zoomIn,D=l.zoomOut,B=l.close,W=l.left,F=l.right,X=l.flipX,K=l.flipY,G="".concat(i,"-operations-operation");r.useEffect((function(){var e=function(e){e.keyCode===E.A.ESC&&k()};return t&&window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t]);var q=[{icon:K,onClick:z,type:"flipY"},{icon:X,onClick:R,type:"flipX"},{icon:j,onClick:T,type:"rotateLeft"},{icon:_,onClick:O,type:"rotateRight"},{icon:D,onClick:$,type:"zoomOut",disabled:g<=b},{icon:H,onClick:M,type:"zoomIn",disabled:g===A}].map((function(e){var t,n=e.icon,o=e.onClick,a=e.type,l=e.disabled;return r.createElement("div",{className:u()(G,(t={},(0,f.A)(t,"".concat(i,"-operations-operation-").concat(a),!0),(0,f.A)(t,"".concat(i,"-operations-operation-disabled"),!!l),t)),onClick:o,key:a},n)})),Y=r.createElement("div",{className:"".concat(i,"-operations")},q);return r.createElement(N.Ay,{visible:t,motionName:n},(function(e){var t=e.className,n=e.style;return r.createElement(S.A,{open:!0,getContainer:null!=o?o:document.body},r.createElement("div",{className:u()("".concat(i,"-operations-wrapper"),t,a),style:(0,d.A)((0,d.A)({},n),{},{zIndex:I})},null===w?null:r.createElement("button",{className:"".concat(i,"-close"),onClick:k},w||B),s&&r.createElement(r.Fragment,null,r.createElement("div",{className:u()("".concat(i,"-switch-left"),(0,f.A)({},"".concat(i,"-switch-left-disabled"),0===v)),onClick:x},W),r.createElement("div",{className:u()("".concat(i,"-switch-right"),(0,f.A)({},"".concat(i,"-switch-right-disabled"),v===h-1)),onClick:C},F)),r.createElement("div",{className:"".concat(i,"-footer")},p&&r.createElement("div",{className:"".concat(i,"-progress")},c?c(v+1,h):"".concat(v+1," / ").concat(h)),P?P(Y,(0,d.A)({icons:{flipYIcon:q[0],flipXIcon:q[1],rotateLeftIcon:q[2],rotateRightIcon:q[3],zoomOutIcon:q[4],zoomInIcon:q[5]},actions:{onFlipY:z,onFlipX:R,onRotateLeft:T,onRotateRight:O,onZoomOut:$,onZoomIn:M},transform:m},L?{current:v,total:h}:{})):Y)))}))};var oe=["fallback","src","imgRef"],ie=["prefixCls","src","alt","fallback","movable","onClose","visible","icons","rootClassName","closeIcon","getContainer","current","count","countRender","scaleStep","minScale","maxScale","transitionName","maskTransitionName","imageRender","imgCommonProps","toolbarRender","onTransform","onChange"],ae=function(e){var t=e.fallback,n=e.src,i=e.imgRef,a=(0,m.A)(e,oe),l=w({src:n,fallback:t}),c=(0,p.A)(l,2),s=c[0],u=c[1];return r.createElement("img",(0,o.A)({ref:function(e){i.current=e,s(e)}},a,u))};const le=function(e){var t=e.prefixCls,n=e.src,i=e.alt,a=e.fallback,l=e.movable,c=void 0===l||l,s=e.onClose,v=e.visible,g=e.icons,b=void 0===g?{}:g,A=e.rootClassName,w=e.closeIcon,S=e.getContainer,x=e.current,C=void 0===x?0:x,k=e.count,M=void 0===k?1:k,$=e.countRender,O=e.scaleStep,T=void 0===O?.5:O,R=e.minScale,z=void 0===R?1:R,P=e.maxScale,N=void 0===P?50:P,I=e.transitionName,L=void 0===I?"zoom":I,j=e.maskTransitionName,_=void 0===j?"fade":j,H=e.imageRender,D=e.imgCommonProps,B=e.toolbarRender,W=e.onTransform,F=e.onChange,K=(0,m.A)(e,ie),G=(0,r.useRef)(),Y=(0,r.useContext)(y),J=Y&&M>1,te=Y&&M>=1,oe=(0,r.useState)(!0),le=(0,p.A)(oe,2),ce=le[0],se=le[1],ue=function(e,t,n,o){var i=(0,r.useRef)(null),a=(0,r.useRef)([]),l=(0,r.useState)(Z),c=(0,p.A)(l,2),s=c[0],u=c[1],f=function(e,t){null===i.current&&(a.current=[],i.current=(0,Q.A)((function(){u((function(e){var n=e;return a.current.forEach((function(e){n=(0,d.A)((0,d.A)({},n),e)})),i.current=null,null==o||o({transform:n,action:t}),n}))}))),a.current.push((0,d.A)((0,d.A)({},s),e))};return{transform:s,resetTransform:function(e){u(Z),o&&!(0,V.A)(Z,s)&&o({transform:Z,action:e})},updateTransform:f,dispatchZoomChange:function(r,o,i,a,l){var c=e.current,u=c.width,d=c.height,p=c.offsetWidth,v=c.offsetHeight,m=c.offsetLeft,g=c.offsetTop,b=r,y=s.scale*r;y>n?(y=n,b=n/s.scale):y0&&(r=1/r),l(r,"wheel",e.clientX,e.clientY)}}}}(G,c,v,T,de,pe,ve),he=me.isMoving,ge=me.onMouseDown,be=me.onWheel,ye=ne(G,c,v,z,de,pe,ve),Ae=ye.isTouching,we=ye.onTouchStart,Se=ye.onTouchMove,xe=ye.onTouchEnd,Ce=de.rotate,ke=de.scale,Ee=u()((0,f.A)({},"".concat(t,"-moving"),he));(0,r.useEffect)((function(){ce||se(!0)}),[ce]);var Me=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),C>0&&(se(!1),fe("prev"),null==F||F(C-1,C))},$e=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),C1&&void 0!==arguments[1]&&arguments[1];const{antCls:n}=e,r=`${n}-fade`,o=t?"&":"";return[(0,Ze.b)(r,Je,et,e.motionDurationMid,t),{[`\n ${o}${r}-enter,\n ${o}${r}-appear\n `]:{opacity:0,animationTimingFunction:"linear"},[`${o}${r}-leave`]:{animationTimingFunction:"linear"}}]},nt=new Ue.Mo("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),rt=new Ue.Mo("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),ot=new Ue.Mo("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),it=new Ue.Mo("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),at=new Ue.Mo("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),lt=new Ue.Mo("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),ct={zoom:{inKeyframes:nt,outKeyframes:rt},"zoom-big":{inKeyframes:ot,outKeyframes:it},"zoom-big-fast":{inKeyframes:ot,outKeyframes:it},"zoom-left":{inKeyframes:new Ue.Mo("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),outKeyframes:new Ue.Mo("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}})},"zoom-right":{inKeyframes:new Ue.Mo("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),outKeyframes:new Ue.Mo("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}})},"zoom-up":{inKeyframes:at,outKeyframes:lt},"zoom-down":{inKeyframes:new Ue.Mo("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),outKeyframes:new Ue.Mo("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}})}},st=(e,t)=>{const{antCls:n}=e,r=`${n}-${t}`,{inKeyframes:o,outKeyframes:i}=ct[t];return[(0,Ze.b)(r,o,i,"zoom-big-fast"===t?e.motionDurationFast:e.motionDurationMid),{[`\n ${r}-enter,\n ${r}-appear\n `]:{transform:"scale(0)",opacity:0,animationTimingFunction:e.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${r}-leave`]:{animationTimingFunction:e.motionEaseInOutCirc}}]};var ut=n(336),dt=n(665);function ft(e){return{position:e,inset:0}}const pt=e=>{const{componentCls:t,antCls:n}=e;return[{[`${t}-root`]:{[`${t}${n}-zoom-enter, ${t}${n}-zoom-appear`]:{transform:"none",opacity:0,animationDuration:e.motionDurationSlow,userSelect:"none"},[`${t}${n}-zoom-leave ${t}-content`]:{pointerEvents:"none"},[`${t}-mask`]:Object.assign(Object.assign({},ft("fixed")),{zIndex:e.zIndexPopupBase,height:"100%",backgroundColor:e.colorBgMask,pointerEvents:"none",[`${t}-hidden`]:{display:"none"}}),[`${t}-wrap`]:Object.assign(Object.assign({},ft("fixed")),{zIndex:e.zIndexPopupBase,overflow:"auto",outline:0,WebkitOverflowScrolling:"touch"})}},{[`${t}-root`]:tt(e)}]},vt=e=>{const{componentCls:t}=e;return[{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl"},[`${t}-centered`]:{textAlign:"center","&::before":{display:"inline-block",width:0,height:"100%",verticalAlign:"middle",content:'""'},[t]:{top:0,display:"inline-block",paddingBottom:0,textAlign:"start",verticalAlign:"middle"}},[`@media (max-width: ${e.screenSMMax}px)`]:{[t]:{maxWidth:"calc(100vw - 16px)",margin:`${(0,Ue.zA)(e.marginXS)} auto`},[`${t}-centered`]:{[t]:{flex:1}}}}},{[t]:Object.assign(Object.assign({},(0,Qe.dF)(e)),{pointerEvents:"none",position:"relative",top:100,width:"auto",maxWidth:`calc(100vw - ${(0,Ue.zA)(e.calc(e.margin).mul(2).equal())})`,margin:"0 auto",paddingBottom:e.paddingLG,[`${t}-title`]:{margin:0,color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.titleFontSize,lineHeight:e.titleLineHeight,wordWrap:"break-word"},[`${t}-content`]:{position:"relative",backgroundColor:e.contentBg,backgroundClip:"padding-box",border:0,borderRadius:e.borderRadiusLG,boxShadow:e.boxShadow,pointerEvents:"auto",padding:e.contentPadding},[`${t}-close`]:Object.assign({position:"absolute",top:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),insetInlineEnd:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),zIndex:e.calc(e.zIndexPopupBase).add(10).equal(),padding:0,color:e.modalCloseIconColor,fontWeight:e.fontWeightStrong,lineHeight:1,textDecoration:"none",background:"transparent",borderRadius:e.borderRadiusSM,width:e.modalCloseBtnSize,height:e.modalCloseBtnSize,border:0,outline:0,cursor:"pointer",transition:`color ${e.motionDurationMid}, background-color ${e.motionDurationMid}`,"&-x":{display:"flex",fontSize:e.fontSizeLG,fontStyle:"normal",lineHeight:`${(0,Ue.zA)(e.modalCloseBtnSize)}`,justifyContent:"center",textTransform:"none",textRendering:"auto"},"&:hover":{color:e.modalCloseIconHoverColor,backgroundColor:e.colorBgTextHover,textDecoration:"none"},"&:active":{backgroundColor:e.colorBgTextActive}},(0,Qe.K8)(e)),[`${t}-header`]:{color:e.colorText,background:e.headerBg,borderRadius:`${(0,Ue.zA)(e.borderRadiusLG)} ${(0,Ue.zA)(e.borderRadiusLG)} 0 0`,marginBottom:e.headerMarginBottom,padding:e.headerPadding,borderBottom:e.headerBorderBottom},[`${t}-body`]:{fontSize:e.fontSize,lineHeight:e.lineHeight,wordWrap:"break-word",padding:e.bodyPadding},[`${t}-footer`]:{textAlign:"end",background:e.footerBg,marginTop:e.footerMarginTop,padding:e.footerPadding,borderTop:e.footerBorderTop,borderRadius:e.footerBorderRadius,[`> ${e.antCls}-btn + ${e.antCls}-btn`]:{marginInlineStart:e.marginXS}},[`${t}-open`]:{overflow:"hidden"}})},{[`${t}-pure-panel`]:{top:"auto",padding:0,display:"flex",flexDirection:"column",[`${t}-content,\n ${t}-body,\n ${t}-confirm-body-wrapper`]:{display:"flex",flexDirection:"column",flex:"auto"},[`${t}-confirm-body`]:{marginBottom:"auto"}}}]},mt=e=>{const{componentCls:t}=e;return{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl",[`${t}-confirm-body`]:{direction:"rtl"}}}}},ht=((0,dt.OF)("Modal",(e=>{const t=(e=>{const t=e.padding,n=e.fontSizeHeading5,r=e.lineHeightHeading5;return(0,ut.h1)(e,{modalHeaderHeight:e.calc(e.calc(r).mul(n).equal()).add(e.calc(t).mul(2).equal()).equal(),modalFooterBorderColorSplit:e.colorSplit,modalFooterBorderStyle:e.lineType,modalFooterBorderWidth:e.lineWidth,modalCloseIconColor:e.colorIcon,modalCloseIconHoverColor:e.colorIconHover,modalCloseBtnSize:e.controlHeight,modalConfirmIconSize:e.fontHeight,modalTitleHeight:e.calc(e.titleFontSize).mul(e.titleLineHeight).equal()})})(e);return[vt(t),mt(t),pt(t),st(t,"zoom")]}),(e=>({footerBg:"transparent",headerBg:e.colorBgElevated,titleLineHeight:e.lineHeightHeading5,titleFontSize:e.fontSizeHeading5,contentBg:e.colorBgElevated,titleColor:e.colorTextHeading,contentPadding:e.wireframe?0:`${(0,Ue.zA)(e.paddingMD)} ${(0,Ue.zA)(e.paddingContentHorizontalLG)}`,headerPadding:e.wireframe?`${(0,Ue.zA)(e.padding)} ${(0,Ue.zA)(e.paddingLG)}`:0,headerBorderBottom:e.wireframe?`${(0,Ue.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",headerMarginBottom:e.wireframe?0:e.marginXS,bodyPadding:e.wireframe?e.paddingLG:0,footerPadding:e.wireframe?`${(0,Ue.zA)(e.paddingXS)} ${(0,Ue.zA)(e.padding)}`:0,footerBorderTop:e.wireframe?`${(0,Ue.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",footerBorderRadius:e.wireframe?`0 0 ${(0,Ue.zA)(e.borderRadiusLG)} ${(0,Ue.zA)(e.borderRadiusLG)}`:0,footerMarginTop:e.wireframe?0:e.marginSM,confirmBodyPadding:e.wireframe?`${(0,Ue.zA)(2*e.padding)} ${(0,Ue.zA)(2*e.padding)} ${(0,Ue.zA)(e.paddingLG)}`:0,confirmIconMarginInlineEnd:e.wireframe?e.margin:e.marginSM,confirmBtnsMarginTop:e.wireframe?e.marginLG:e.marginSM})),{unitless:{titleLineHeight:!0}}),e=>({position:e||"absolute",inset:0})),gt=e=>{const{iconCls:t,motionDurationSlow:n,paddingXXS:r,marginXXS:o,prefixCls:i,colorTextLightSolid:a}=e;return{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",color:a,background:new Ve.q("#000").setAlpha(.5).toRgbString(),cursor:"pointer",opacity:0,transition:`opacity ${n}`,[`.${i}-mask-info`]:Object.assign(Object.assign({},Qe.L9),{padding:`0 ${(0,Ue.zA)(r)}`,[t]:{marginInlineEnd:o,svg:{verticalAlign:"baseline"}}})}},bt=e=>{const{previewCls:t,modalMaskBg:n,paddingSM:r,marginXL:o,margin:i,paddingLG:a,previewOperationColorDisabled:l,previewOperationHoverColor:c,motionDurationSlow:s,iconCls:u,colorTextLightSolid:d}=e,f=new Ve.q(n).setAlpha(.1),p=f.clone().setAlpha(.2);return{[`${t}-footer`]:{position:"fixed",bottom:o,left:{_skip_check_:!0,value:0},width:"100%",display:"flex",flexDirection:"column",alignItems:"center",color:e.previewOperationColor},[`${t}-progress`]:{marginBottom:i},[`${t}-close`]:{position:"fixed",top:o,right:{_skip_check_:!0,value:o},display:"flex",color:d,backgroundColor:f.toRgbString(),borderRadius:"50%",padding:r,outline:0,border:0,cursor:"pointer",transition:`all ${s}`,"&:hover":{backgroundColor:p.toRgbString()},[`& > ${u}`]:{fontSize:e.previewOperationSize}},[`${t}-operations`]:{display:"flex",alignItems:"center",padding:`0 ${(0,Ue.zA)(a)}`,backgroundColor:f.toRgbString(),borderRadius:100,"&-operation":{marginInlineStart:r,padding:r,cursor:"pointer",transition:`all ${s}`,userSelect:"none",[`&:not(${t}-operations-operation-disabled):hover > ${u}`]:{color:c},"&-disabled":{color:l,cursor:"not-allowed"},"&:first-of-type":{marginInlineStart:0},[`& > ${u}`]:{fontSize:e.previewOperationSize}}}}},yt=e=>{const{modalMaskBg:t,iconCls:n,previewOperationColorDisabled:r,previewCls:o,zIndexPopup:i,motionDurationSlow:a}=e,l=new Ve.q(t).setAlpha(.1),c=l.clone().setAlpha(.2);return{[`${o}-switch-left, ${o}-switch-right`]:{position:"fixed",insetBlockStart:"50%",zIndex:e.calc(i).add(1).equal({unit:!1}),display:"flex",alignItems:"center",justifyContent:"center",width:e.imagePreviewSwitchSize,height:e.imagePreviewSwitchSize,marginTop:e.calc(e.imagePreviewSwitchSize).mul(-1).div(2).equal(),color:e.previewOperationColor,background:l.toRgbString(),borderRadius:"50%",transform:"translateY(-50%)",cursor:"pointer",transition:`all ${a}`,userSelect:"none","&:hover":{background:c.toRgbString()},"&-disabled":{"&, &:hover":{color:r,background:"transparent",cursor:"not-allowed",[`> ${n}`]:{cursor:"not-allowed"}}},[`> ${n}`]:{fontSize:e.previewOperationSize}},[`${o}-switch-left`]:{insetInlineStart:e.marginSM},[`${o}-switch-right`]:{insetInlineEnd:e.marginSM}}},At=e=>{const{motionEaseOut:t,previewCls:n,motionDurationSlow:r,componentCls:o}=e;return[{[`${o}-preview-root`]:{[n]:{height:"100%",textAlign:"center",pointerEvents:"none"},[`${n}-body`]:Object.assign(Object.assign({},ht()),{overflow:"hidden"}),[`${n}-img`]:{maxWidth:"100%",maxHeight:"70%",verticalAlign:"middle",transform:"scale3d(1, 1, 1)",cursor:"grab",transition:`transform ${r} ${t} 0s`,userSelect:"none","&-wrapper":Object.assign(Object.assign({},ht()),{transition:`transform ${r} ${t} 0s`,display:"flex",justifyContent:"center",alignItems:"center","& > *":{pointerEvents:"auto"},"&::before":{display:"inline-block",width:1,height:"50%",marginInlineEnd:-1,content:'""'}})},[`${n}-moving`]:{[`${n}-preview-img`]:{cursor:"grabbing","&-wrapper":{transitionDuration:"0s"}}}}},{[`${o}-preview-root`]:{[`${n}-wrap`]:{zIndex:e.zIndexPopup}}},{[`${o}-preview-operations-wrapper`]:{position:"fixed",zIndex:e.calc(e.zIndexPopup).add(1).equal({unit:!1})},"&":[bt(e),yt(e)]}]},wt=e=>{const{componentCls:t}=e;return{[t]:{position:"relative",display:"inline-block",[`${t}-img`]:{width:"100%",height:"auto",verticalAlign:"middle"},[`${t}-img-placeholder`]:{backgroundColor:e.colorBgContainerDisabled,backgroundImage:"url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=')",backgroundRepeat:"no-repeat",backgroundPosition:"center center",backgroundSize:"30%"},[`${t}-mask`]:Object.assign({},gt(e)),[`${t}-mask:hover`]:{opacity:1},[`${t}-placeholder`]:Object.assign({},ht())}}},St=e=>{const{previewCls:t}=e;return{[`${t}-root`]:st(e,"zoom"),"&":tt(e,!0)}},xt=(0,dt.OF)("Image",(e=>{const t=`${e.componentCls}-preview`,n=(0,ut.h1)(e,{previewCls:t,modalMaskBg:new Ve.q("#000").setAlpha(.45).toRgbString(),imagePreviewSwitchSize:e.controlHeightLG});return[wt(n),At(n),pt((0,ut.h1)(n,{componentCls:t})),St(n)]}),(e=>({zIndexPopup:e.zIndexPopupBase+80,previewOperationColor:new Ve.q(e.colorTextLightSolid).setAlpha(.65).toRgbString(),previewOperationHoverColor:new Ve.q(e.colorTextLightSolid).setAlpha(.85).toRgbString(),previewOperationColorDisabled:new Ve.q(e.colorTextLightSolid).setAlpha(.25).toRgbString(),previewOperationSize:1.5*e.fontSizeIcon})));var Ct=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{var t;const{prefixCls:n,preview:o,className:i,rootClassName:a,style:l}=e,s=Et(e,["prefixCls","preview","className","rootClassName","style"]),{getPrefixCls:d,locale:f=Te,getPopupContainer:p,image:v}=r.useContext(xe.QO),m=d("image",n),h=d(),g=f.Image||Te.Image,b=(0,Ce.A)(m),[y,A,w]=xt(m,b),S=u()(a,A,w,b),x=u()(i,A,null==v?void 0:v.className),[C]=we("ImagePreview","object"==typeof o?o.zIndex:void 0),k=r.useMemo((()=>{var e;if(!1===o)return o;const t="object"==typeof o?o:{},{getContainer:n,closeIcon:i}=t,a=Et(t,["getContainer","closeIcon"]);return Object.assign(Object.assign({mask:r.createElement("div",{className:`${m}-mask-info`},r.createElement(c,null),null==g?void 0:g.preview),icons:kt},a),{getContainer:null!=n?n:p,transitionName:(0,Se.b)(h,"zoom",t.transitionName),maskTransitionName:(0,Se.b)(h,"fade",t.maskTransitionName),zIndex:C,closeIcon:null!=i?i:null===(e=null==v?void 0:v.preview)||void 0===e?void 0:e.closeIcon})}),[o,g,null===(t=null==v?void 0:v.preview)||void 0===t?void 0:t.closeIcon]),E=Object.assign(Object.assign({},null==v?void 0:v.style),l);return y(r.createElement(me,Object.assign({prefixCls:m,preview:k,rootClassName:S,className:x,style:E},s)))};Mt.PreviewGroup=e=>{var{previewPrefixCls:t,preview:n}=e,o=Ct(e,["previewPrefixCls","preview"]);const{getPrefixCls:i}=r.useContext(xe.QO),a=i("image",t),l=`${a}-preview`,c=i(),s=(0,Ce.A)(a),[d,f,p]=xt(a,s),[v]=we("ImagePreview","object"==typeof n?n.zIndex:void 0),m=r.useMemo((()=>{var e;if(!1===n)return n;const t="object"==typeof n?n:{},r=u()(f,p,s,null!==(e=t.rootClassName)&&void 0!==e?e:"");return Object.assign(Object.assign({},t),{transitionName:(0,Se.b)(c,"zoom",t.transitionName),maskTransitionName:(0,Se.b)(c,"fade",t.maskTransitionName),rootClassName:r,zIndex:v})}),[n]);return d(r.createElement(me.PreviewGroup,Object.assign({preview:m,previewPrefixCls:l,icons:kt},o)))};const $t=Mt},5905:(e,t,n)=>{"use strict";n.d(t,{K8:()=>d,L9:()=>o,Nk:()=>a,av:()=>c,dF:()=>i,t6:()=>l,vj:()=>s});var r=n(1466);const o={overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"},i=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{boxSizing:"border-box",margin:0,padding:0,color:e.colorText,fontSize:e.fontSize,lineHeight:e.lineHeight,listStyle:"none",fontFamily:t?"inherit":e.fontFamily}},a=()=>({display:"inline-flex",alignItems:"center",color:"inherit",fontStyle:"normal",lineHeight:0,textAlign:"center",textTransform:"none",verticalAlign:"-0.125em",textRendering:"optimizeLegibility","-webkit-font-smoothing":"antialiased","-moz-osx-font-smoothing":"grayscale","> *":{lineHeight:1},svg:{display:"inline-block"}}),l=()=>({"&::before":{display:"table",content:'""'},"&::after":{display:"table",clear:"both",content:'""'}}),c=e=>({a:{color:e.colorLink,textDecoration:e.linkDecoration,backgroundColor:"transparent",outline:"none",cursor:"pointer",transition:`color ${e.motionDurationSlow}`,"-webkit-text-decoration-skip":"objects","&:hover":{color:e.colorLinkHover},"&:active":{color:e.colorLinkActive},"&:active,\n &:hover":{textDecoration:e.linkHoverDecoration,outline:0},"&:focus":{textDecoration:e.linkFocusDecoration,outline:0},"&[disabled]":{color:e.colorTextDisabled,cursor:"not-allowed"}}}),s=(e,t,n,r)=>{const o=`[class^="${t}"], [class*=" ${t}"]`,i=n?`.${n}`:o,a={boxSizing:"border-box","&::before, &::after":{boxSizing:"border-box"}};let l={};return!1!==r&&(l={fontFamily:e.fontFamily,fontSize:e.fontSize}),{[i]:Object.assign(Object.assign(Object.assign({},l),a),{[o]:a})}},u=e=>({outline:`${(0,r.zA)(e.lineWidthFocus)} solid ${e.colorPrimaryBorder}`,outlineOffset:1,transition:"outline-offset 0s, outline 0s"}),d=e=>({"&:focus-visible":Object.assign({},u(e))})},4980:(e,t,n)=>{"use strict";n.d(t,{b:()=>i});const r=e=>({animationDuration:e,animationFillMode:"both"}),o=e=>({animationDuration:e,animationFillMode:"both"}),i=function(e,t,n,i){const a=arguments.length>4&&void 0!==arguments[4]&&arguments[4]?"&":"";return{[`\n ${a}${e}-enter,\n ${a}${e}-appear\n `]:Object.assign(Object.assign({},r(i)),{animationPlayState:"paused"}),[`${a}${e}-leave`]:Object.assign(Object.assign({},o(i)),{animationPlayState:"paused"}),[`\n ${a}${e}-enter${e}-enter-active,\n ${a}${e}-appear${e}-appear-active\n `]:{animationName:t,animationPlayState:"running"},[`${a}${e}-leave${e}-leave-active`]:{animationName:n,animationPlayState:"running",pointerEvents:"none"}}}},3511:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>O,Xe:()=>E,Is:()=>k});var r=n(6540),o=n(1466);const i="5.16.4";var a=n(2200);const l={blue:"#1677ff",purple:"#722ED1",cyan:"#13C2C2",green:"#52C41A",magenta:"#EB2F96",pink:"#eb2f96",red:"#F5222D",orange:"#FA8C16",yellow:"#FADB14",volcano:"#FA541C",geekblue:"#2F54EB",gold:"#FAAD14",lime:"#A0D911"},c=Object.assign(Object.assign({},l),{colorPrimary:"#1677ff",colorSuccess:"#52c41a",colorWarning:"#faad14",colorError:"#ff4d4f",colorInfo:"#1677ff",colorLink:"",colorTextBase:"",colorBgBase:"",fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n'Noto Color Emoji'",fontFamilyCode:"'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",fontSize:14,lineWidth:1,lineType:"solid",motionUnit:.1,motionBase:0,motionEaseOutCirc:"cubic-bezier(0.08, 0.82, 0.17, 1)",motionEaseInOutCirc:"cubic-bezier(0.78, 0.14, 0.15, 0.86)",motionEaseOut:"cubic-bezier(0.215, 0.61, 0.355, 1)",motionEaseInOut:"cubic-bezier(0.645, 0.045, 0.355, 1)",motionEaseOutBack:"cubic-bezier(0.12, 0.4, 0.29, 1.46)",motionEaseInBack:"cubic-bezier(0.71, -0.46, 0.88, 0.6)",motionEaseInQuint:"cubic-bezier(0.755, 0.05, 0.855, 0.06)",motionEaseOutQuint:"cubic-bezier(0.23, 1, 0.32, 1)",borderRadius:6,sizeUnit:4,sizeStep:4,sizePopupArrow:16,controlHeight:32,zIndexBase:0,zIndexPopupBase:1e3,opacityImage:1,wireframe:!1,motion:!0});var s=n(4978);const u=e=>{let t=e,n=e,r=e,o=e;return e<6&&e>=5?t=e+1:e<16&&e>=6?t=e+2:e>=16&&(t=16),e<7&&e>=5?n=4:e<8&&e>=7?n=5:e<14&&e>=8?n=6:e<16&&e>=14?n=7:e>=16&&(n=8),e<6&&e>=2?r=1:e>=6&&(r=2),e>4&&e<8?o=4:e>=8&&(o=6),{borderRadius:e,borderRadiusXS:r,borderRadiusSM:n,borderRadiusLG:t,borderRadiusOuter:o}};const d=e=>{const{controlHeight:t}=e;return{controlHeightSM:.75*t,controlHeightXS:.5*t,controlHeightLG:1.25*t}};const f=e=>{const t=function(e){const t=new Array(10).fill(null).map(((t,n)=>{const r=n-1,o=e*Math.pow(2.71828,r/5),i=n>1?Math.floor(o):Math.ceil(o);return 2*Math.floor(i/2)}));return t[1]=e,t.map((e=>{return{size:e,lineHeight:(t=e,(t+8)/t)};var t}))}(e),n=t.map((e=>e.size)),r=t.map((e=>e.lineHeight)),o=n[1],i=n[0],a=n[2],l=r[1],c=r[0],s=r[2];return{fontSizeSM:i,fontSize:o,fontSizeLG:a,fontSizeXL:n[3],fontSizeHeading1:n[6],fontSizeHeading2:n[5],fontSizeHeading3:n[4],fontSizeHeading4:n[3],fontSizeHeading5:n[2],lineHeight:l,lineHeightLG:s,lineHeightSM:c,fontHeight:Math.round(l*o),fontHeightLG:Math.round(s*a),fontHeightSM:Math.round(c*i),lineHeightHeading1:r[6],lineHeightHeading2:r[5],lineHeightHeading3:r[4],lineHeightHeading4:r[3],lineHeightHeading5:r[2]}};const p=(e,t)=>new s.q(e).setAlpha(t).toRgbString(),v=(e,t)=>new s.q(e).darken(t).toHexString(),m=e=>{const t=(0,a.cM)(e);return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[4],6:t[5],7:t[6],8:t[4],9:t[5],10:t[6]}},h=(e,t)=>{const n=e||"#fff",r=t||"#000";return{colorBgBase:n,colorTextBase:r,colorText:p(r,.88),colorTextSecondary:p(r,.65),colorTextTertiary:p(r,.45),colorTextQuaternary:p(r,.25),colorFill:p(r,.15),colorFillSecondary:p(r,.06),colorFillTertiary:p(r,.04),colorFillQuaternary:p(r,.02),colorBgLayout:v(n,4),colorBgContainer:v(n,0),colorBgElevated:v(n,0),colorBgSpotlight:p(r,.85),colorBgBlur:"transparent",colorBorder:v(n,15),colorBorderSecondary:v(n,6)}};const g=(0,o.an)((function(e){const t=Object.keys(l).map((t=>{const n=(0,a.cM)(e[t]);return new Array(10).fill(1).reduce(((e,r,o)=>(e[`${t}-${o+1}`]=n[o],e[`${t}${o+1}`]=n[o],e)),{})})).reduce(((e,t)=>e=Object.assign(Object.assign({},e),t)),{});return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},e),t),function(e,t){let{generateColorPalettes:n,generateNeutralColorPalettes:r}=t;const{colorSuccess:o,colorWarning:i,colorError:a,colorInfo:l,colorPrimary:c,colorBgBase:u,colorTextBase:d}=e,f=n(c),p=n(o),v=n(i),m=n(a),h=n(l),g=r(u,d),b=n(e.colorLink||e.colorInfo);return Object.assign(Object.assign({},g),{colorPrimaryBg:f[1],colorPrimaryBgHover:f[2],colorPrimaryBorder:f[3],colorPrimaryBorderHover:f[4],colorPrimaryHover:f[5],colorPrimary:f[6],colorPrimaryActive:f[7],colorPrimaryTextHover:f[8],colorPrimaryText:f[9],colorPrimaryTextActive:f[10],colorSuccessBg:p[1],colorSuccessBgHover:p[2],colorSuccessBorder:p[3],colorSuccessBorderHover:p[4],colorSuccessHover:p[4],colorSuccess:p[6],colorSuccessActive:p[7],colorSuccessTextHover:p[8],colorSuccessText:p[9],colorSuccessTextActive:p[10],colorErrorBg:m[1],colorErrorBgHover:m[2],colorErrorBorder:m[3],colorErrorBorderHover:m[4],colorErrorHover:m[5],colorError:m[6],colorErrorActive:m[7],colorErrorTextHover:m[8],colorErrorText:m[9],colorErrorTextActive:m[10],colorWarningBg:v[1],colorWarningBgHover:v[2],colorWarningBorder:v[3],colorWarningBorderHover:v[4],colorWarningHover:v[4],colorWarning:v[6],colorWarningActive:v[7],colorWarningTextHover:v[8],colorWarningText:v[9],colorWarningTextActive:v[10],colorInfoBg:h[1],colorInfoBgHover:h[2],colorInfoBorder:h[3],colorInfoBorderHover:h[4],colorInfoHover:h[4],colorInfo:h[6],colorInfoActive:h[7],colorInfoTextHover:h[8],colorInfoText:h[9],colorInfoTextActive:h[10],colorLinkHover:b[4],colorLink:b[6],colorLinkActive:b[7],colorBgMask:new s.q("#000").setAlpha(.45).toRgbString(),colorWhite:"#fff"})}(e,{generateColorPalettes:m,generateNeutralColorPalettes:h})),f(e.fontSize)),function(e){const{sizeUnit:t,sizeStep:n}=e;return{sizeXXL:t*(n+8),sizeXL:t*(n+4),sizeLG:t*(n+2),sizeMD:t*(n+1),sizeMS:t*n,size:t*n,sizeSM:t*(n-1),sizeXS:t*(n-2),sizeXXS:t*(n-3)}}(e)),d(e)),function(e){const{motionUnit:t,motionBase:n,borderRadius:r,lineWidth:o}=e;return Object.assign({motionDurationFast:`${(n+t).toFixed(1)}s`,motionDurationMid:`${(n+2*t).toFixed(1)}s`,motionDurationSlow:`${(n+3*t).toFixed(1)}s`,lineWidthBold:o+1},u(r))}(e))})),b={token:c,override:{override:c},hashed:!0},y=r.createContext(b);function A(e){return e>=0&&e<=255}const w=function(e,t){const{r:n,g:r,b:o,a:i}=new s.q(e).toRgb();if(i<1)return e;const{r:a,g:l,b:c}=new s.q(t).toRgb();for(let u=.01;u<=1;u+=.01){const e=Math.round((n-a*(1-u))/u),t=Math.round((r-l*(1-u))/u),i=Math.round((o-c*(1-u))/u);if(A(e)&&A(t)&&A(i))return new s.q({r:e,g:t,b:i,a:Math.round(100*u)/100}).toRgbString()}return new s.q({r:n,g:r,b:o,a:1}).toRgbString()};var S=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{delete r[e]}));const o=Object.assign(Object.assign({},n),r),i=1200,a=1600;if(!1===o.motion){const e="0s";o.motionDurationFast=e,o.motionDurationMid=e,o.motionDurationSlow=e}return Object.assign(Object.assign(Object.assign({},o),{colorFillContent:o.colorFillSecondary,colorFillContentHover:o.colorFill,colorFillAlter:o.colorFillQuaternary,colorBgContainerDisabled:o.colorFillTertiary,colorBorderBg:o.colorBgContainer,colorSplit:w(o.colorBorderSecondary,o.colorBgContainer),colorTextPlaceholder:o.colorTextQuaternary,colorTextDisabled:o.colorTextQuaternary,colorTextHeading:o.colorText,colorTextLabel:o.colorTextSecondary,colorTextDescription:o.colorTextTertiary,colorTextLightSolid:o.colorWhite,colorHighlight:o.colorError,colorBgTextHover:o.colorFillSecondary,colorBgTextActive:o.colorFill,colorIcon:o.colorTextTertiary,colorIconHover:o.colorText,colorErrorOutline:w(o.colorErrorBg,o.colorBgContainer),colorWarningOutline:w(o.colorWarningBg,o.colorBgContainer),fontSizeIcon:o.fontSizeSM,lineWidthFocus:4*o.lineWidth,lineWidth:o.lineWidth,controlOutlineWidth:2*o.lineWidth,controlInteractiveSize:o.controlHeight/2,controlItemBgHover:o.colorFillTertiary,controlItemBgActive:o.colorPrimaryBg,controlItemBgActiveHover:o.colorPrimaryBgHover,controlItemBgActiveDisabled:o.colorFill,controlTmpOutline:o.colorFillQuaternary,controlOutline:w(o.colorPrimaryBg,o.colorBgContainer),lineType:o.lineType,borderRadius:o.borderRadius,borderRadiusXS:o.borderRadiusXS,borderRadiusSM:o.borderRadiusSM,borderRadiusLG:o.borderRadiusLG,fontWeightStrong:600,opacityLoading:.65,linkDecoration:"none",linkHoverDecoration:"none",linkFocusDecoration:"none",controlPaddingHorizontal:12,controlPaddingHorizontalSM:8,paddingXXS:o.sizeXXS,paddingXS:o.sizeXS,paddingSM:o.sizeSM,padding:o.size,paddingMD:o.sizeMD,paddingLG:o.sizeLG,paddingXL:o.sizeXL,paddingContentHorizontalLG:o.sizeLG,paddingContentVerticalLG:o.sizeMS,paddingContentHorizontal:o.sizeMS,paddingContentVertical:o.sizeSM,paddingContentHorizontalSM:o.size,paddingContentVerticalSM:o.sizeXS,marginXXS:o.sizeXXS,marginXS:o.sizeXS,marginSM:o.sizeSM,margin:o.size,marginMD:o.sizeMD,marginLG:o.sizeLG,marginXL:o.sizeXL,marginXXL:o.sizeXXL,boxShadow:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowSecondary:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTertiary:"\n 0 1px 2px 0 rgba(0, 0, 0, 0.03),\n 0 1px 6px -1px rgba(0, 0, 0, 0.02),\n 0 2px 4px 0 rgba(0, 0, 0, 0.02)\n ",screenXS:480,screenXSMin:480,screenXSMax:575,screenSM:576,screenSMMin:576,screenSMMax:767,screenMD:768,screenMDMin:768,screenMDMax:991,screenLG:992,screenLGMin:992,screenLGMax:1199,screenXL:i,screenXLMin:i,screenXLMax:1599,screenXXL:a,screenXXLMin:a,boxShadowPopoverArrow:"2px 2px 5px rgba(0, 0, 0, 0.05)",boxShadowCard:`\n 0 1px 2px -2px ${new s.q("rgba(0, 0, 0, 0.16)").toRgbString()},\n 0 3px 6px 0 ${new s.q("rgba(0, 0, 0, 0.12)").toRgbString()},\n 0 5px 12px 4px ${new s.q("rgba(0, 0, 0, 0.09)").toRgbString()}\n `,boxShadowDrawerRight:"\n -6px 0 16px 0 rgba(0, 0, 0, 0.08),\n -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n -9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerLeft:"\n 6px 0 16px 0 rgba(0, 0, 0, 0.08),\n 3px 0 6px -4px rgba(0, 0, 0, 0.12),\n 9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerUp:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerDown:"\n 0 -6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 -3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 -9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTabsOverflowLeft:"inset 10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowRight:"inset -10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowTop:"inset 0 10px 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowBottom:"inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08)"}),r)}var C=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const r=n.getDerivativeToken(e),{override:o}=t,i=C(t,["override"]);let a=Object.assign(Object.assign({},r),{override:o});return a=x(a),i&&Object.entries(i).forEach((e=>{let[t,n]=e;const{theme:r}=n,o=C(n,["theme"]);let i=o;r&&(i=$(Object.assign(Object.assign({},a),o),{override:o},r)),a[t]=i})),a};function O(){const{token:e,hashed:t,theme:n,override:a,cssVar:l}=r.useContext(y),s=`${i}-${t||""}`,u=n||g,[d,f,p]=(0,o.hV)(u,[c,e],{salt:s,override:a,getComputedToken:$,formatToken:x,cssVar:l&&{prefix:l.prefix,key:l.key,unitless:k,ignore:E,preserve:M}});return[u,p,t?f:"",d,l]}},665:(e,t,n)=>{"use strict";n.d(t,{OF:()=>M});var r=n(6540),o=n(1466);n(6956),n(2533),n(8719);"undefined"==typeof Reflect?Object.keys:Reflect.ownKeys;n(8210);var i=n(2279),a=n(5905),l=n(3511),c=n(3029),s=n(2901),u=n(3954),d=n(2176),f=n(6822);function p(e,t,n){return t=(0,u.A)(t),(0,f.A)(e,(0,d.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var v=n(5501);const m=(0,s.A)((function e(){(0,c.A)(this,e)})),h="CALC_UNIT",g=new RegExp(h,"g");function b(e){return"number"==typeof e?`${e}${h}`:e}let y=function(e){function t(e){var n;return(0,c.A)(this,t),(n=p(this,t)).result="",e instanceof t?n.result=`(${e.result})`:"number"==typeof e?n.result=b(e):"string"==typeof e&&(n.result=e),n}return(0,v.A)(t,e),(0,s.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result=`${this.result} + ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} + ${b(e)}`),this.lowPriority=!0,this}},{key:"sub",value:function(e){return e instanceof t?this.result=`${this.result} - ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} - ${b(e)}`),this.lowPriority=!0,this}},{key:"mul",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} * ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} * ${e}`),this.lowPriority=!1,this}},{key:"div",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} / ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} / ${e}`),this.lowPriority=!1,this}},{key:"getResult",value:function(e){return this.lowPriority||e?`(${this.result})`:this.result}},{key:"equal",value:function(e){const{unit:t=!0}=e||{};return this.result=this.result.replace(g,t?"px":""),void 0!==this.lowPriority?`calc(${this.result})`:this.result}}])}(m),A=function(e){function t(e){var n;return(0,c.A)(this,t),(n=p(this,t)).result=0,e instanceof t?n.result=e.result:"number"==typeof e&&(n.result=e),n}return(0,v.A)(t,e),(0,s.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result+=e.result:"number"==typeof e&&(this.result+=e),this}},{key:"sub",value:function(e){return e instanceof t?this.result-=e.result:"number"==typeof e&&(this.result-=e),this}},{key:"mul",value:function(e){return e instanceof t?this.result*=e.result:"number"==typeof e&&(this.result*=e),this}},{key:"div",value:function(e){return e instanceof t?this.result/=e.result:"number"==typeof e&&(this.result/=e),this}},{key:"equal",value:function(){return this.result}}])}(m);const w=e=>{const t="css"===e?y:A;return e=>new t(e)};var S=n(336);const x=(e,t)=>{const[n,r]=(0,l.Ay)();return(0,o.IV)({theme:n,token:r,hashId:"",path:["ant-design-icons",e],nonce:()=>null==t?void 0:t.nonce},(()=>[{[`.${e}`]:Object.assign(Object.assign({},(0,a.Nk)()),{[`.${e} .${e}-icon`]:{display:"block"}})}]))},C=(e,t,n)=>{var r;return"function"==typeof n?n((0,S.h1)(t,null!==(r=t[e])&&void 0!==r?r:{})):null!=n?n:{}},k=(e,t,n,r)=>{const o=Object.assign({},t[e]);if(null==r?void 0:r.deprecatedTokens){const{deprecatedTokens:e}=r;e.forEach((e=>{let[t,n]=e;var r;((null==o?void 0:o[t])||(null==o?void 0:o[n]))&&(null!==(r=o[n])&&void 0!==r||(o[n]=null==o?void 0:o[t]))}))}const i=Object.assign(Object.assign({},n),o);return Object.keys(i).forEach((e=>{i[e]===t[e]&&delete i[e]})),i};function E(e,t,n){let c=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};const s=Array.isArray(e)?e:[e,e],[u]=s,d=s.join("-");return function(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[f,p,v,m,h]=(0,l.Ay)(),{getPrefixCls:g,iconPrefixCls:b,csp:y}=(0,r.useContext)(i.QO),A=g(),E=h?"css":"js",M=w(E),{max:$,min:O}=function(e){return"js"===e?{max:Math.max,min:Math.min}:{max:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`},min:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`}}}(E),T={theme:f,token:m,hashId:v,nonce:()=>null==y?void 0:y.nonce,clientOnly:c.clientOnly,order:c.order||-999};(0,o.IV)(Object.assign(Object.assign({},T),{clientOnly:!1,path:["Shared",A]}),(()=>[{"&":(0,a.av)(m)}])),x(b,y);const R=(0,o.IV)(Object.assign(Object.assign({},T),{path:[d,e,b]}),(()=>{if(!1===c.injectStyle)return[];const{token:r,flush:i}=(0,S.Ay)(m),l=C(u,p,n),d=`.${e}`,f=k(u,p,l,{deprecatedTokens:c.deprecatedTokens});h&&Object.keys(l).forEach((e=>{l[e]=`var(${(0,o.Ki)(e,((e,t)=>`${[t,e.replace(/([A-Z]+)([A-Z][a-z]+)/g,"$1-$2").replace(/([a-z])([A-Z])/g,"$1-$2")].filter(Boolean).join("-")}`)(u,h.prefix))})`}));const g=(0,S.h1)(r,{componentCls:d,prefixCls:e,iconCls:`.${b}`,antCls:`.${A}`,calc:M,max:$,min:O},h?l:f),y=t(g,{hashId:v,prefixCls:e,rootPrefixCls:A,iconPrefixCls:b});return i(u,f),[!1===c.resetStyle?null:(0,a.vj)(g,e,s,c.resetFont),y]}));return[R,v]}}const M=(e,t,n,i)=>{const a=E(e,t,n,i),c=((e,t,n)=>{function i(t){return`${e}${t.slice(0,1).toUpperCase()}${t.slice(1)}`}const{unitless:a={},injectStyle:c=!0}=null!=n?n:{},s={[i("zIndexPopup")]:!0};Object.keys(a).forEach((e=>{s[i(e)]=a[e]}));const u=r=>{let{rootCls:a,cssVar:c}=r;const[,u]=(0,l.Ay)();return(0,o.RC)({path:[e],prefix:c.prefix,key:null==c?void 0:c.key,unitless:Object.assign(Object.assign({},l.Is),s),ignore:l.Xe,token:u,scope:a},(()=>{const r=C(e,u,t),o=k(e,u,r,{deprecatedTokens:null==n?void 0:n.deprecatedTokens});return Object.keys(r).forEach((e=>{o[i(e)]=o[e],delete o[e]})),o})),null};return t=>{const[,,,,n]=(0,l.Ay)();return[o=>c&&n?r.createElement(r.Fragment,null,r.createElement(u,{rootCls:t,cssVar:n,component:e}),o):o,null==n?void 0:n.key]}})(Array.isArray(e)?e[0]:e,n,i);return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[,n]=a(e,t),[r,o]=c(t);return[r,n,o]}}},336:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>c,h1:()=>i});const r="undefined"!=typeof CSSINJS_STATISTIC;let o=!0;function i(){for(var e=arguments.length,t=new Array(e),n=0;n{Object.keys(e).forEach((t=>{Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:()=>e[t]})}))})),o=!0,i}const a={};function l(){}const c=e=>{let t,n=e,i=l;return r&&"undefined"!=typeof Proxy&&(t=new Set,n=new Proxy(e,{get:(e,n)=>(o&&t.add(n),e[n])}),i=(e,n)=>{var r;a[e]={global:Array.from(t),component:Object.assign(Object.assign({},null===(r=a[e])||void 0===r?void 0:r.component),n)}}),{token:n,keys:t,flush:i}}},1441:(e,t,n)=>{var r=n(8028),o=function(e){var t="",n=Object.keys(e);return n.forEach((function(o,i){var a=e[o];(function(e){return/[height|width]$/.test(e)})(o=r(o))&&"number"==typeof a&&(a+="px"),t+=!0===a?o:!1===a?"not "+o:"("+o+": "+a+")",i{"use strict";n.d(t,{Ay:()=>pe});var r=n(4467),o=n(9379),i=n(6636),a=n(2284),l=n(6942),c=n.n(l),s=n(4207),u=n(8719),d=n(6540),f=d.createContext({});var p=n(3029),v=n(2901),m=n(5501),h=n(9426);const g=function(e){(0,m.A)(n,e);var t=(0,h.A)(n);function n(){return(0,p.A)(this,n),t.apply(this,arguments)}return(0,v.A)(n,[{key:"render",value:function(){return this.props.children}}]),n}(d.Component);var b=n(1233),y="none",A="appear",w="enter",S="leave",x="none",C="prepare",k="start",E="active",M="end",$="prepared",O=n(998);function T(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit".concat(e)]="webkit".concat(t),n["Moz".concat(e)]="moz".concat(t),n["ms".concat(e)]="MS".concat(t),n["O".concat(e)]="o".concat(t.toLowerCase()),n}var R,z,P,N=(R=(0,O.A)(),z="undefined"!=typeof window?window:{},P={animationend:T("Animation","AnimationEnd"),transitionend:T("Transition","TransitionEnd")},R&&("AnimationEvent"in z||delete P.animationend.animation,"TransitionEvent"in z||delete P.transitionend.transition),P),I={};if((0,O.A)()){var L=document.createElement("div");I=L.style}var j={};function _(e){if(j[e])return j[e];var t=N[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o1&&void 0!==arguments[1]?arguments[1]:2;t();var i=(0,q.A)((function(){o<=1?r({isCanceled:function(){return i!==e.current}}):n(r,o-1)}));e.current=i},t]}(),s=(0,i.A)(c,2),u=s[0],f=s[1];var p=t?U:Y;return G((function(){if(a!==x&&a!==M){var e=p.indexOf(a),t=p[e+1],r=n(a);r===V?l(t,!0):t&&u((function(e){function n(){e.isCanceled()||l(t,!0)}!0===r?n():Promise.resolve(r).then(n)}))}}),[e,a]),d.useEffect((function(){return function(){f()}}),[]),[function(){l(C,!0)},a]};const ee=function(e){var t=e;"object"===(0,a.A)(e)&&(t=e.transitionSupport);var n=d.forwardRef((function(e,n){var a=e.visible,l=void 0===a||a,p=e.removeOnLeave,v=void 0===p||p,m=e.forceRender,h=e.children,x=e.motionName,M=e.leavedClassName,O=e.eventProps,T=function(e,n){return!(!e.motionName||!t||!1===n)}(e,d.useContext(f).motion),R=(0,d.useRef)(),z=(0,d.useRef)();var P=function(e,t,n,a){var l=a.motionEnter,c=void 0===l||l,s=a.motionAppear,u=void 0===s||s,f=a.motionLeave,p=void 0===f||f,v=a.motionDeadline,m=a.motionLeaveImmediately,h=a.onAppearPrepare,g=a.onEnterPrepare,x=a.onLeavePrepare,M=a.onAppearStart,O=a.onEnterStart,T=a.onLeaveStart,R=a.onAppearActive,z=a.onEnterActive,P=a.onLeaveActive,N=a.onAppearEnd,I=a.onEnterEnd,L=a.onLeaveEnd,j=a.onVisibleChanged,_=(0,b.A)(),H=(0,i.A)(_,2),D=H[0],B=H[1],W=(0,b.A)(y),F=(0,i.A)(W,2),X=F[0],q=F[1],Y=(0,b.A)(null),U=(0,i.A)(Y,2),ee=U[0],te=U[1],ne=(0,d.useRef)(!1),re=(0,d.useRef)(null);function oe(){return n()}var ie=(0,d.useRef)(!1);function ae(){q(y,!0),te(null,!0)}function le(e){var t=oe();if(!e||e.deadline||e.target===t){var n,r=ie.current;X===A&&r?n=null==N?void 0:N(t,e):X===w&&r?n=null==I?void 0:I(t,e):X===S&&r&&(n=null==L?void 0:L(t,e)),X!==y&&r&&!1!==n&&ae()}}var ce=K(le),se=(0,i.A)(ce,1)[0],ue=function(e){var t,n,o;switch(e){case A:return t={},(0,r.A)(t,C,h),(0,r.A)(t,k,M),(0,r.A)(t,E,R),t;case w:return n={},(0,r.A)(n,C,g),(0,r.A)(n,k,O),(0,r.A)(n,E,z),n;case S:return o={},(0,r.A)(o,C,x),(0,r.A)(o,k,T),(0,r.A)(o,E,P),o;default:return{}}},de=d.useMemo((function(){return ue(X)}),[X]),fe=J(X,!e,(function(e){if(e===C){var t=de[C];return t?t(oe()):V}var n;return me in de&&te((null===(n=de[me])||void 0===n?void 0:n.call(de,oe(),null))||null),me===E&&(se(oe()),v>0&&(clearTimeout(re.current),re.current=setTimeout((function(){le({deadline:!0})}),v))),me===$&&ae(),Q})),pe=(0,i.A)(fe,2),ve=pe[0],me=pe[1],he=Z(me);ie.current=he,G((function(){B(t);var n,r=ne.current;ne.current=!0,!r&&t&&u&&(n=A),r&&t&&c&&(n=w),(r&&!t&&p||!r&&m&&!t&&p)&&(n=S);var o=ue(n);n&&(e||o[C])?(q(n),ve()):q(y)}),[t]),(0,d.useEffect)((function(){(X===A&&!u||X===w&&!c||X===S&&!p)&&q(y)}),[u,c,p]),(0,d.useEffect)((function(){return function(){ne.current=!1,clearTimeout(re.current)}}),[]);var ge=d.useRef(!1);(0,d.useEffect)((function(){D&&(ge.current=!0),void 0!==D&&X===y&&((ge.current||D)&&(null==j||j(D)),ge.current=!0)}),[D,X]);var be=ee;return de[C]&&me===k&&(be=(0,o.A)({transition:"none"},be)),[X,me,be,null!=D?D:t]}(T,l,(function(){try{return R.current instanceof HTMLElement?R.current:(0,s.A)(z.current)}catch(e){return null}}),e),N=(0,i.A)(P,4),I=N[0],L=N[1],j=N[2],_=N[3],H=d.useRef(_);_&&(H.current=!0);var D,B=d.useCallback((function(e){R.current=e,(0,u.Xf)(n,e)}),[n]),W=(0,o.A)((0,o.A)({},O),{},{visible:l});if(h)if(I===y)D=_?h((0,o.A)({},W),B):!v&&H.current&&M?h((0,o.A)((0,o.A)({},W),{},{className:M}),B):m||!v&&!M?h((0,o.A)((0,o.A)({},W),{},{style:{display:"none"}}),B):null;else{var F,q;L===C?q="prepare":Z(L)?q="active":L===k&&(q="start");var Y=X(x,"".concat(I,"-").concat(q));D=h((0,o.A)((0,o.A)({},W),{},{className:c()(X(x,I),(F={},(0,r.A)(F,Y,Y&&q),(0,r.A)(F,x,"string"==typeof x),F)),style:j}),B)}else D=null;d.isValidElement(D)&&(0,u.f3)(D)&&(D.ref||(D=d.cloneElement(D,{ref:B})));return d.createElement(g,{ref:z},D)}));return n.displayName="CSSMotion",n}(B);var te=n(8168),ne=n(45),re=n(9417),oe="add",ie="keep",ae="remove",le="removed";function ce(e){var t;return t=e&&"object"===(0,a.A)(e)&&"key"in e?e:{key:e},(0,o.A)((0,o.A)({},t),{},{key:String(t.key)})}function se(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).map(ce)}var ue=["component","children","onVisibleChanged","onAllRemoved"],de=["status"],fe=["eventProps","visible","children","motionName","motionAppear","motionEnter","motionLeave","motionLeaveImmediately","motionDeadline","removeOnLeave","leavedClassName","onAppearPrepare","onAppearStart","onAppearActive","onAppearEnd","onEnterStart","onEnterActive","onEnterEnd","onLeaveStart","onLeaveActive","onLeaveEnd"];!function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ee,n=function(e){(0,m.A)(i,e);var n=(0,h.A)(i);function i(){var e;(0,p.A)(this,i);for(var t=arguments.length,a=new Array(t),l=0;l0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[],r=0,i=t.length,a=se(e),l=se(t);a.forEach((function(e){for(var t=!1,a=r;a1})).forEach((function(e){(n=n.filter((function(t){var n=t.key,r=t.status;return n!==e||r!==ae}))).forEach((function(t){t.key===e&&(t.status=ie)}))})),n}(r,i);return{keyEntities:a.filter((function(e){var t=r.find((function(t){var n=t.key;return e.key===n}));return!t||t.status!==le||e.status!==ae}))}}}]),i}(d.Component);(0,r.A)(n,"defaultProps",{component:"div"})}(B);const pe=ee},998:(e,t,n)=>{"use strict";function r(){return!("undefined"==typeof window||!window.document||!window.document.createElement)}n.d(t,{A:()=>r})},4808:(e,t,n)=>{"use strict";function r(e,t){if(!e)return!1;if(e.contains)return e.contains(t);for(var n=t;n;){if(n===e)return!0;n=n.parentNode}return!1}n.d(t,{A:()=>r})},5089:(e,t,n)=>{"use strict";n.d(t,{BD:()=>h,m6:()=>m});var r=n(9379),o=n(998),i=n(4808),a="data-rc-order",l="data-rc-priority",c="rc-util-key",s=new Map;function u(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).mark;return e?e.startsWith("data-")?e:"data-".concat(e):c}function d(e){return e.attachTo?e.attachTo:document.querySelector("head")||document.body}function f(e){return Array.from((s.get(e)||e).children).filter((function(e){return"STYLE"===e.tagName}))}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,o.A)())return null;var n=t.csp,r=t.prepend,i=t.priority,c=void 0===i?0:i,s=function(e){return"queue"===e?"prependQueue":e?"prepend":"append"}(r),u="prependQueue"===s,p=document.createElement("style");p.setAttribute(a,s),u&&c&&p.setAttribute(l,"".concat(c)),null!=n&&n.nonce&&(p.nonce=null==n?void 0:n.nonce),p.innerHTML=e;var v=d(t),m=v.firstChild;if(r){if(u){var h=(t.styles||f(v)).filter((function(e){if(!["prepend","prependQueue"].includes(e.getAttribute(a)))return!1;var t=Number(e.getAttribute(l)||0);return c>=t}));if(h.length)return v.insertBefore(p,h[h.length-1].nextSibling),p}v.insertBefore(p,m)}else v.appendChild(p);return p}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=d(t);return(t.styles||f(n)).find((function(n){return n.getAttribute(u(t))===e}))}function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=v(e,t);n&&d(t).removeChild(n)}function h(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=d(n),a=f(o),l=(0,r.A)((0,r.A)({},n),{},{styles:a});!function(e,t){var n=s.get(e);if(!n||!(0,i.A)(document,n)){var r=p("",t),o=r.parentNode;s.set(e,o),e.removeChild(r)}}(o,l);var c=v(t,l);if(c){var m,h,g;if(null!==(m=l.csp)&&void 0!==m&&m.nonce&&c.nonce!==(null===(h=l.csp)||void 0===h?void 0:h.nonce))c.nonce=null===(g=l.csp)||void 0===g?void 0:g.nonce;return c.innerHTML!==e&&(c.innerHTML=e),c}var b=p(e,l);return b.setAttribute(u(l),t),b}},4207:(e,t,n)=>{"use strict";n.d(t,{A:()=>a,f:()=>i});var r=n(6540),o=n(961);function i(e){return e instanceof HTMLElement||e instanceof SVGElement}function a(e){return i(e)?e:e instanceof r.Component?o.findDOMNode(e):null}},2633:(e,t,n)=>{"use strict";function r(e){var t;return null==e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}function o(e){return function(e){return r(e)instanceof ShadowRoot}(e)?r(e):null}n.d(t,{j:()=>o})},6928:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r={MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,WIN_IME:229,isTextModifyingKeyEvent:function(e){var t=e.keyCode;if(e.altKey&&!e.ctrlKey||e.metaKey||t>=r.F1&&t<=r.F12)return!1;switch(t){case r.ALT:case r.CAPS_LOCK:case r.CONTEXT_MENU:case r.CTRL:case r.DOWN:case r.END:case r.ESC:case r.HOME:case r.INSERT:case r.LEFT:case r.MAC_FF_META:case r.META:case r.NUMLOCK:case r.NUM_CENTER:case r.PAGE_DOWN:case r.PAGE_UP:case r.PAUSE:case r.PRINT_SCREEN:case r.RIGHT:case r.SHIFT:case r.UP:case r.WIN_KEY:case r.WIN_KEY_RIGHT:return!1;default:return!0}},isCharacterKey:function(e){if(e>=r.ZERO&&e<=r.NINE)return!0;if(e>=r.NUM_ZERO&&e<=r.NUM_MULTIPLY)return!0;if(e>=r.A&&e<=r.Z)return!0;if(-1!==window.navigator.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case r.SPACE:case r.QUESTION_MARK:case r.NUM_PLUS:case r.NUM_MINUS:case r.NUM_PERIOD:case r.NUM_DIVISION:case r.SEMICOLON:case r.DASH:case r.EQUALS:case r.COMMA:case r.PERIOD:case r.SLASH:case r.APOSTROPHE:case r.SINGLE_QUOTE:case r.OPEN_SQUARE_BRACKET:case r.BACKSLASH:case r.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}};const o=r},6956:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e){var t=r.useRef();t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o{"use strict";var r;n.d(t,{A:()=>s});var o=n(6636),i=n(9379),a=n(6540);var l=0;var c=(0,i.A)({},r||(r=n.t(a,2))).useId;const s=c?function(e){var t=c();return e||t}:function(e){var t=a.useState("ssr-id"),n=(0,o.A)(t,2),r=n[0],i=n[1];return a.useEffect((function(){var e=l;l+=1,i("rc_unique_".concat(e))}),[]),e||r}},981:(e,t,n)=>{"use strict";n.d(t,{A:()=>l,o:()=>a});var r=n(6540),o=(0,n(998).A)()?r.useLayoutEffect:r.useEffect,i=function(e,t){var n=r.useRef(!0);o((function(){return e(n.current)}),t),o((function(){return n.current=!1,function(){n.current=!0}}),[])},a=function(e,t){i((function(t){if(!t)return e()}),t)};const l=i},8104:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e,t,n){var o=r.useRef({});return"value"in o.current&&!n(o.current.condition,t)||(o.current.value=e(),o.current.condition=t),o.current.value}},2533:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(6636),o=n(6956),i=n(981),a=n(1233);function l(e){return void 0!==e}function c(e,t){var n=t||{},c=n.defaultValue,s=n.value,u=n.onChange,d=n.postState,f=(0,a.A)((function(){return l(s)?s:l(c)?"function"==typeof c?c():c:"function"==typeof e?e():e})),p=(0,r.A)(f,2),v=p[0],m=p[1],h=void 0!==s?s:v,g=d?d(h):h,b=(0,o.A)(u),y=(0,a.A)([h]),A=(0,r.A)(y,2),w=A[0],S=A[1];return(0,i.o)((function(){var e=w[0];v!==e&&b(v,e)}),[w]),(0,i.o)((function(){l(s)||m(s)}),[s]),[g,(0,o.A)((function(e,t){m(e,t),S([h],t)}))]}},1233:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6636),o=n(6540);function i(e){var t=o.useRef(!1),n=o.useState(e),i=(0,r.A)(n,2),a=i[0],l=i[1];return o.useEffect((function(){return t.current=!1,function(){t.current=!0}}),[]),[a,function(e,n){n&&t.current||l(e)}]}},3210:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(8210);const i=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=new Set;return function e(t,a){var l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,c=i.has(t);if((0,o.Ay)(!c,"Warning: There may be circular references"),c)return!1;if(t===a)return!0;if(n&&l>1)return!1;i.add(t);var s=l+1;if(Array.isArray(t)){if(!Array.isArray(a)||t.length!==a.length)return!1;for(var u=0;u{"use strict";n.d(t,{A:()=>o});var r=n(9379);function o(e,t){var n=(0,r.A)({},e);return Array.isArray(t)&&t.forEach((function(e){delete n[e]})),n}},5371:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=function(e){return+setTimeout(e,16)},o=function(e){return clearTimeout(e)};"undefined"!=typeof window&&"requestAnimationFrame"in window&&(r=function(e){return window.requestAnimationFrame(e)},o=function(e){return window.cancelAnimationFrame(e)});var i=0,a=new Map;function l(e){a.delete(e)}var c=function(e){var t=i+=1;return function n(o){if(0===o)l(t),e();else{var i=r((function(){n(o-1)}));a.set(t,i)}}(arguments.length>1&&void 0!==arguments[1]?arguments[1]:1),t};c.cancel=function(e){var t=a.get(e);return l(e),o(t)};const s=c},8719:(e,t,n)=>{"use strict";n.d(t,{K4:()=>l,Xf:()=>a,f3:()=>s,xK:()=>c});var r=n(2284),o=(n(6540),n(6351)),i=n(8104);function a(e,t){"function"==typeof e?e(t):"object"===(0,r.A)(e)&&e&&"current"in e&&(e.current=t)}function l(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{$e:()=>i,Ay:()=>s});var r={},o=[];function i(e,t){}function a(e,t){}function l(e,t,n){t||r[n]||(e(!1,n),r[n]=!0)}function c(e,t){l(i,e,t)}c.preMessage=function(e){o.push(e)},c.resetWarned=function(){r={}},c.noteOnce=function(e,t){l(a,e,t)};const s=c},7787:(e,t)=>{"use strict";var n,r=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),s=Symbol.for("react.context"),u=Symbol.for("react.server_context"),d=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),v=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),h=Symbol.for("react.offscreen");function g(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case i:case l:case a:case f:case p:return e;default:switch(e=e&&e.$$typeof){case u:case s:case d:case m:case v:case c:return e;default:return t}}case o:return t}}}n=Symbol.for("react.module.reference"),t.ForwardRef=d,t.isFragment=function(e){return g(e)===i},t.isMemo=function(e){return g(e)===v}},6351:(e,t,n)=>{"use strict";e.exports=n(7787)},3591:(e,t,n)=>{"use strict";n.d(t,{A:()=>C});var r=function(){if("undefined"!=typeof Map)return Map;function e(e,t){var n=-1;return e.some((function(e,r){return e[0]===t&&(n=r,!0)})),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){void 0===t&&(t=null);for(var n=0,r=this.__entries__;n0},e.prototype.connect_=function(){o&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),c?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){o&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t;l.some((function(e){return!!~n.indexOf(e)}))&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),u=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),S="undefined"!=typeof WeakMap?new WeakMap:new r,x=function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=s.getInstance(),r=new w(t,n,this);S.set(this,r)};["observe","unobserve","disconnect"].forEach((function(e){x.prototype[e]=function(){var t;return(t=S.get(this))[e].apply(t,arguments)}}));const C=void 0!==i.ResizeObserver?i.ResizeObserver:x},8028:e=>{e.exports=function(e){return e.replace(/[A-Z]/g,(function(e){return"-"+e.toLowerCase()})).toLowerCase()}},6942:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e="",t=0;t{"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nr})},9417:(e,t,n)=>{"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,{A:()=>r})},3029:(e,t,n)=>{"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,{A:()=>r})},2901:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(8406);function o(e,t){for(var n=0;n{"use strict";n.d(t,{A:()=>a});var r=n(3954),o=n(2176),i=n(6822);function a(e){var t=(0,o.A)();return function(){var n,o=(0,r.A)(e);if(t){var a=(0,r.A)(this).constructor;n=Reflect.construct(o,arguments,a)}else n=o.apply(this,arguments);return(0,i.A)(this,n)}}},4467:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(8406);function o(e,t,n){return(t=(0,r.A)(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},3954:(e,t,n)=>{"use strict";function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}n.d(t,{A:()=>r})},5501:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3662);function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&(0,r.A)(e,t)}},2176:(e,t,n)=>{"use strict";function r(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(r=function(){return!!e})()}n.d(t,{A:()=>r})},9379:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(4467);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t{"use strict";n.d(t,{A:()=>o});var r=n(8587);function o(e,t){if(null==e)return{};var n,o,i=(0,r.A)(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},6822:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(9417);function i(e,t){if(t&&("object"===(0,r.A)(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return(0,o.A)(e)}},6636:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(7800);function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,l=[],c=!0,s=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){s=!0,o=e}finally{try{if(!c&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(s)throw o}}return l}}(e,t)||(0,r.A)(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},4241:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(3145);var o=n(7800);function i(e){return function(e){if(Array.isArray(e))return(0,r.A)(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||(0,o.A)(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},8406:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(2284);function o(e){var t=function(e,t){if("object"!=(0,r.A)(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=(0,r.A)(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==(0,r.A)(t)?t:t+""}},2284:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}n.d(t,{A:()=>r})},7800:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3145);function o(e,t){if(e){if("string"==typeof e)return(0,r.A)(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?(0,r.A)(e,t):void 0}}},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>a,x:()=>l});var r=n(6540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +/*! For license information please see 6256.73278753.js.LICENSE.txt */ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6256],{2200:(e,t,n)=>{"use strict";n.d(t,{z1:()=>S,cM:()=>b});var r=n(2456),o=n(6250),i=2,a=.16,l=.05,c=.05,s=.15,u=5,d=4,f=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function p(e){var t=e.r,n=e.g,o=e.b,i=(0,r.wE)(t,n,o);return{h:360*i.h,s:i.s,v:i.v}}function v(e){var t=e.r,n=e.g,o=e.b;return"#".concat((0,r.Ob)(t,n,o,!1))}function m(e,t,n){var r;return(r=Math.round(e.h)>=60&&Math.round(e.h)<=240?n?Math.round(e.h)-i*t:Math.round(e.h)+i*t:n?Math.round(e.h)+i*t:Math.round(e.h)-i*t)<0?r+=360:r>=360&&(r-=360),r}function h(e,t,n){return 0===e.h&&0===e.s?e.s:((r=n?e.s-a*t:t===d?e.s+a:e.s+l*t)>1&&(r=1),n&&t===u&&r>.1&&(r=.1),r<.06&&(r=.06),Number(r.toFixed(2)));var r}function g(e,t,n){var r;return(r=n?e.v+c*t:e.v-s*t)>1&&(r=1),Number(r.toFixed(2))}function b(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=(0,o.RO)(e),i=u;i>0;i-=1){var a=p(r),l=v((0,o.RO)({h:m(a,i,!0),s:h(a,i,!0),v:g(a,i,!0)}));n.push(l)}n.push(v(r));for(var c=1;c<=d;c+=1){var s=p(r),b=v((0,o.RO)({h:m(s,c),s:h(s,c),v:g(s,c)}));n.push(b)}return"dark"===t.theme?f.map((function(e){var r,i,a,l=e.index,c=e.opacity;return v((r=(0,o.RO)(t.backgroundColor||"#141414"),i=(0,o.RO)(n[l]),a=100*c/100,{r:(i.r-r.r)*a+r.r,g:(i.g-r.g)*a+r.g,b:(i.b-r.b)*a+r.b}))})):n}var y={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1677FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},A={},w={};Object.keys(y).forEach((function(e){A[e]=b(y[e]),A[e].primary=A[e][5],w[e]=b(y[e],{theme:"dark",backgroundColor:"#141414"}),w[e].primary=w[e][5]}));A.red,A.volcano,A.gold,A.orange,A.yellow,A.lime,A.green,A.cyan;var S=A.blue;A.geekblue,A.purple,A.magenta,A.grey,A.grey},1466:(e,t,n)=>{"use strict";n.d(t,{Mo:()=>lt,an:()=>O,Ki:()=>_,zA:()=>L,RC:()=>it,hV:()=>ee,IV:()=>rt});var r=n(4467),o=n(6636),i=n(4241),a=n(9379);const l=function(e){for(var t,n=0,r=0,o=e.length;o>=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)};var c=n(5089),s=n(6540),u=n.t(s,2),d=(n(8104),n(3210),n(3029)),f=n(2901),p="%";function v(e){return e.join(p)}const m=function(){function e(t){(0,d.A)(this,e),(0,r.A)(this,"instanceId",void 0),(0,r.A)(this,"cache",new Map),this.instanceId=t}return(0,f.A)(e,[{key:"get",value:function(e){return this.opGet(v(e))}},{key:"opGet",value:function(e){return this.cache.get(e)||null}},{key:"update",value:function(e,t){return this.opUpdate(v(e),t)}},{key:"opUpdate",value:function(e,t){var n=t(this.cache.get(e));null===n?this.cache.delete(e):this.cache.set(e,n)}}]),e}();var h="data-token-hash",g="data-css-hash",b="__cssinjs_instance__";function y(){var e=Math.random().toString(12).slice(2);if("undefined"!=typeof document&&document.head&&document.body){var t=document.body.querySelectorAll("style[".concat(g,"]"))||[],n=document.head.firstChild;Array.from(t).forEach((function(t){t[b]=t[b]||e,t[b]===e&&document.head.insertBefore(t,n)}));var r={};Array.from(document.querySelectorAll("style[".concat(g,"]"))).forEach((function(t){var n,o=t.getAttribute(g);r[o]?t[b]===e&&(null===(n=t.parentNode)||void 0===n||n.removeChild(t)):r[o]=!0}))}return new m(e)}var A=s.createContext({hashPriority:"low",cache:y(),defaultCache:!0});const w=A;var S=n(2284),x=n(998);var C=function(){function e(){(0,d.A)(this,e),(0,r.A)(this,"cache",void 0),(0,r.A)(this,"keys",void 0),(0,r.A)(this,"cacheCallTimes",void 0),this.cache=new Map,this.keys=[],this.cacheCallTimes=0}return(0,f.A)(e,[{key:"size",value:function(){return this.keys.length}},{key:"internalGet",value:function(e){var t,n,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o={map:this.cache};return e.forEach((function(e){var t;o?o=null===(t=o)||void 0===t||null===(t=t.map)||void 0===t?void 0:t.get(e):o=void 0})),null!==(t=o)&&void 0!==t&&t.value&&r&&(o.value[1]=this.cacheCallTimes++),null===(n=o)||void 0===n?void 0:n.value}},{key:"get",value:function(e){var t;return null===(t=this.internalGet(e,!0))||void 0===t?void 0:t[0]}},{key:"has",value:function(e){return!!this.internalGet(e)}},{key:"set",value:function(t,n){var r=this;if(!this.has(t)){if(this.size()+1>e.MAX_CACHE_SIZE+e.MAX_CACHE_OFFSET){var i=this.keys.reduce((function(e,t){var n=(0,o.A)(e,2)[1];return r.internalGet(t)[1]0,"[Ant Design CSS-in-JS] Theme should have at least one derivative function."),E+=1}return(0,f.A)(e,[{key:"getDerivativeToken",value:function(e){return this.derivatives.reduce((function(t,n){return n(e,t)}),void 0)}}]),e}(),$=new C;function O(e){var t=Array.isArray(e)?e:[e];return $.has(t)||$.set(t,new M(t)),$.get(t)}var T=new WeakMap,R={};var z=new WeakMap;function P(e){var t=z.get(e)||"";return t||(Object.keys(e).forEach((function(n){var r=e[n];t+=n,r instanceof M?t+=r.id:r&&"object"===(0,S.A)(r)?t+=P(r):t+=r})),z.set(e,t)),t}function N(e,t){return l("".concat(t,"_").concat(P(e)))}"random-".concat(Date.now(),"-").concat(Math.random()).replace(/\./g,"");var I=(0,x.A)();function L(e){return"number"==typeof e?"".concat(e,"px"):e}function j(e,t,n){var o,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(arguments.length>4&&void 0!==arguments[4]&&arguments[4])return e;var l=(0,a.A)((0,a.A)({},i),{},(o={},(0,r.A)(o,h,t),(0,r.A)(o,g,n),o)),c=Object.keys(l).map((function(e){var t=l[e];return t?"".concat(e,'="').concat(t,'"'):null})).filter((function(e){return e})).join(" ");return"")}var _=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"--".concat(t?"".concat(t,"-"):"").concat(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z]+)([A-Z][a-z0-9]+)/g,"$1-$2").replace(/([a-z])([A-Z0-9])/g,"$1-$2").toLowerCase()},H=function(e,t,n){return Object.keys(e).length?".".concat(t).concat(null!=n&&n.scope?".".concat(n.scope):"","{").concat(Object.entries(e).map((function(e){var t=(0,o.A)(e,2),n=t[0],r=t[1];return"".concat(n,":").concat(r,";")})).join(""),"}"):""},D=function(e,t,n){var r={},i={};return Object.entries(e).forEach((function(e){var t,a,l=(0,o.A)(e,2),c=l[0],s=l[1];if(null!=n&&null!==(t=n.preserve)&&void 0!==t&&t[c])i[c]=s;else if(!("string"!=typeof s&&"number"!=typeof s||null!=n&&null!==(a=n.ignore)&&void 0!==a&&a[c])){var u,d=_(c,null==n?void 0:n.prefix);r[d]="number"!=typeof s||null!=n&&null!==(u=n.unitless)&&void 0!==u&&u[c]?String(s):"".concat(s,"px"),i[c]="var(".concat(d,")")}})),[i,H(r,t,{scope:null==n?void 0:n.scope})]},B=n(981),W=(0,a.A)({},u).useInsertionEffect;const F=W?function(e,t,n){return W((function(){return e(),t()}),n)}:function(e,t,n){s.useMemo(e,n),(0,B.A)((function(){return t(!0)}),n)};const X=void 0!==(0,a.A)({},u).useInsertionEffect?function(e){var t=[],n=!1;return s.useEffect((function(){return n=!1,function(){n=!0,t.length&&t.forEach((function(e){return e()}))}}),e),function(e){n||t.push(e)}}:function(){return function(e){e()}};const K=function(){return!1};function G(e,t,n,r,a){var l=s.useContext(w).cache,c=v([e].concat((0,i.A)(t))),u=X([c]),d=(K(),function(e){l.opUpdate(c,(function(t){var r=t||[void 0,void 0],i=(0,o.A)(r,2),a=i[0];var l=[void 0===a?0:a,i[1]||n()];return e?e(l):l}))});s.useMemo((function(){d()}),[c]);var f=l.opGet(c)[1];return F((function(){null==a||a(f)}),(function(e){return d((function(t){var n=(0,o.A)(t,2),r=n[0],i=n[1];return e&&0===r&&(null==a||a(f)),[r+1,i]})),function(){l.opUpdate(c,(function(t){var n=t||[],i=(0,o.A)(n,2),a=i[0],s=void 0===a?0:a,d=i[1];return 0===s-1?(u((function(){!e&&l.opGet(c)||null==r||r(d,!1)})),null):[s-1,d]}))}}),[c]),f}var q={},Y="css",U=new Map;var V=0;function Q(e,t){U.set(e,(U.get(e)||0)-1);var n=Array.from(U.keys()),r=n.filter((function(e){return(U.get(e)||0)<=0}));n.length-r.length>V&&r.forEach((function(e){!function(e,t){"undefined"!=typeof document&&document.querySelectorAll("style[".concat(h,'="').concat(e,'"]')).forEach((function(e){var n;e[b]===t&&(null===(n=e.parentNode)||void 0===n||n.removeChild(e))}))}(e,t),U.delete(e)}))}var Z=function(e,t,n,r){var o=n.getDerivativeToken(e),i=(0,a.A)((0,a.A)({},o),t);return r&&(i=r(i)),i},J="token";function ee(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(0,s.useContext)(w),u=r.cache.instanceId,d=r.container,f=n.salt,p=void 0===f?"":f,v=n.override,m=void 0===v?q:v,y=n.formatToken,A=n.getComputedToken,S=n.cssVar,x=function(e,t){for(var n=T,r=0;r0?ve(ke,--xe):0,we--,10===Ce&&(we=1,Ae--),Ce}function $e(){return Ce=xe2||ze(Ce)>3?"":" "}function je(e,t){for(;--t&&$e()&&!(Ce<48||Ce>102||Ce>57&&Ce<65||Ce>70&&Ce<97););return Re(e,Te()+(t<6&&32==Oe()&&32==$e()))}function _e(e){for(;$e();)switch(Ce){case e:return xe;case 34:case 39:34!==e&&39!==e&&_e(Ce);break;case 40:41===e&&_e(e);break;case 92:$e()}return xe}function He(e,t){for(;$e()&&e+Ce!==57&&(e+Ce!==84||47!==Oe()););return"/*"+Re(t,xe-1)+"*"+ue(47===e?e:$e())}function De(e){for(;!ze(Oe());)$e();return Re(e,xe)}function Be(e){return Ne(We("",null,null,null,[""],e=Pe(e),0,[0],e))}function We(e,t,n,r,o,i,a,l,c){for(var s=0,u=0,d=a,f=0,p=0,v=0,m=1,h=1,g=1,b=0,y="",A=o,w=i,S=r,x=y;h;)switch(v=b,b=$e()){case 40:if(108!=v&&58==ve(x,d-1)){-1!=pe(x+=fe(Ie(b),"&","&\f"),"&\f",se(s?l[s-1]:0))&&(g=-1);break}case 34:case 39:case 91:x+=Ie(b);break;case 9:case 10:case 13:case 32:x+=Le(v);break;case 92:x+=je(Te()-1,7);continue;case 47:switch(Oe()){case 42:case 47:ge(Xe(He($e(),Te()),t,n,c),c);break;default:x+="/"}break;case 123*m:l[s++]=he(x)*g;case 125*m:case 59:case 0:switch(b){case 0:case 125:h=0;case 59+u:-1==g&&(x=fe(x,/\f/g,"")),p>0&&he(x)-d&&ge(p>32?Ke(x+";",r,n,d-1,c):Ke(fe(x," ","")+";",r,n,d-2,c),c);break;case 59:x+=";";default:if(ge(S=Fe(x,t,n,s,u,o,l,y,A=[],w=[],d,i),i),123===b)if(0===u)We(x,t,S,S,A,i,d,l,w);else switch(99===f&&110===ve(x,3)?100:f){case 100:case 108:case 109:case 115:We(e,S,S,r&&ge(Fe(e,S,S,0,0,o,l,y,o,A=[],d,w),w),o,w,d,l,r?A:w);break;default:We(x,S,S,S,[""],w,0,l,w)}}s=u=p=0,m=g=1,y=x="",d=a;break;case 58:d=1+he(x),p=v;default:if(m<1)if(123==b)--m;else if(125==b&&0==m++&&125==Me())continue;switch(x+=ue(b),b*m){case 38:g=u>0?1:(x+="\f",-1);break;case 44:l[s++]=(he(x)-1)*g,g=1;break;case 64:45===Oe()&&(x+=Ie($e())),f=Oe(),u=d=he(y=x+=De(Te())),b++;break;case 45:45===v&&2==he(x)&&(m=0)}}return i}function Fe(e,t,n,r,o,i,a,l,c,s,u,d){for(var f=o-1,p=0===o?i:[""],v=function(e){return e.length}(p),m=0,h=0,g=0;m0?p[b]+" "+y:fe(y,/&\f/g,p[b])))&&(c[g++]=A);return Ee(e,t,n,0===o?oe:l,c,s,u,d)}function Xe(e,t,n,r){return Ee(e,t,n,re,ue(Ce),me(e,2,-2),0,r)}function Ke(e,t,n,r,o){return Ee(e,t,n,ie,me(e,0,r),me(e,r+1,-1),r,o)}var Ge,qe="data-ant-cssinjs-cache-path",Ye="_FILE_STYLE__";var Ue=!0;function Ve(e){return function(){if(!Ge&&(Ge={},(0,x.A)())){var e=document.createElement("div");e.className=qe,e.style.position="fixed",e.style.visibility="hidden",e.style.top="-9999px",document.body.appendChild(e);var t=getComputedStyle(e).content||"";(t=t.replace(/^"/,"").replace(/"$/,"")).split(";").forEach((function(e){var t=e.split(":"),n=(0,o.A)(t,2),r=n[0],i=n[1];Ge[r]=i}));var n,r=document.querySelector("style[".concat(qe,"]"));r&&(Ue=!1,null===(n=r.parentNode)||void 0===n||n.removeChild(r)),document.body.removeChild(e)}}(),!!Ge[e]}var Qe="_multi_value_";function Ze(e){return be(Be(e),ye).replace(/\{%%%\:[^;];}/g,";")}var Je=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{root:!0,parentSelectors:[]},l=r.root,c=r.injectHash,s=r.parentSelectors,u=n.hashId,d=n.layer,f=(n.path,n.hashPriority),p=n.transformers,v=void 0===p?[]:p,m=(n.linters,""),h={};function g(t){var r=t.getName(u);if(!h[r]){var i=e(t.style,n,{root:!1,parentSelectors:s}),a=(0,o.A)(i,1)[0];h[r]="@keyframes ".concat(t.getName(u)).concat(a)}}var b=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return t.forEach((function(t){Array.isArray(t)?e(t,n):t&&n.push(t)})),n}(Array.isArray(t)?t:[t]);return b.forEach((function(t){var r="string"!=typeof t||l?t:{};if("string"==typeof r)m+="".concat(r,"\n");else if(r._keyframe)g(r);else{var d=v.reduce((function(e,t){var n;return(null==t||null===(n=t.visit)||void 0===n?void 0:n.call(t,e))||e}),r);Object.keys(d).forEach((function(t){var r=d[t];if("object"!==(0,S.A)(r)||!r||"animationName"===t&&r._keyframe||function(e){return"object"===(0,S.A)(e)&&e&&("_skip_check_"in e||Qe in e)}(r)){var p;function E(e,t){var n=e.replace(/[A-Z]/g,(function(e){return"-".concat(e.toLowerCase())})),r=t;ne[e]||"number"!=typeof r||0===r||(r="".concat(r,"px")),"animationName"===e&&null!=t&&t._keyframe&&(g(t),r=t.getName(u)),m+="".concat(n,":").concat(r,";")}var v=null!==(p=null==r?void 0:r.value)&&void 0!==p?p:r;"object"===(0,S.A)(r)&&null!=r&&r[Qe]&&Array.isArray(v)?v.forEach((function(e){E(t,e)})):E(t,v)}else{var b=!1,y=t.trim(),A=!1;(l||c)&&u?y.startsWith("@")?b=!0:y=function(e,t,n){if(!t)return e;var r=".".concat(t),o="low"===n?":where(".concat(r,")"):r;return e.split(",").map((function(e){var t,n=e.trim().split(/\s+/),r=n[0]||"",a=(null===(t=r.match(/^\w+/))||void 0===t?void 0:t[0])||"";return[r="".concat(a).concat(o).concat(r.slice(a.length))].concat((0,i.A)(n.slice(1))).join(" ")})).join(",")}(t,u,f):!l||u||"&"!==y&&""!==y||(y="",A=!0);var w=e(r,n,{root:A,injectHash:b,parentSelectors:[].concat((0,i.A)(s),[y])}),x=(0,o.A)(w,2),C=x[0],k=x[1];h=(0,a.A)((0,a.A)({},h),k),m+="".concat(y).concat(C)}}))}})),l?d&&(m="@layer ".concat(d.name," {").concat(m,"}"),d.dependencies&&(h["@layer ".concat(d.name)]=d.dependencies.map((function(e){return"@layer ".concat(e,", ").concat(d.name,";")})).join("\n"))):m="{".concat(m,"}"),[m,h]};function et(e,t){return l("".concat(e.join("%")).concat(t))}function tt(){return null}var nt="style";function rt(e,t){var n=e.token,l=e.path,u=e.hashId,d=e.layer,f=e.nonce,p=e.clientOnly,v=e.order,m=void 0===v?0:v,y=s.useContext(w),A=y.autoClear,S=(y.mock,y.defaultCache),C=y.hashPriority,k=y.container,E=y.ssrInline,M=y.transformers,$=y.linters,O=y.cache,T=y.layer,R=n._tokenKey,z=[R];T&&z.push("layer"),z.push.apply(z,(0,i.A)(l));var P=I;var N=G(nt,z,(function(){var e=z.join("|");if(Ve(e)){var n=function(e){var t=Ge[e],n=null;if(t&&(0,x.A)())if(Ue)n=Ye;else{var r=document.querySelector("style[".concat(g,'="').concat(Ge[e],'"]'));r?n=r.innerHTML:delete Ge[e]}return[n,t]}(e),r=(0,o.A)(n,2),i=r[0],a=r[1];if(i)return[i,R,a,{},p,m]}var c=t(),s=Je(c,{hashId:u,hashPriority:C,layer:T?d:void 0,path:l.join("-"),transformers:M,linters:$}),f=(0,o.A)(s,2),v=f[0],h=f[1],b=Ze(v),y=et(z,b);return[b,R,y,h,p,m]}),(function(e,t){var n=(0,o.A)(e,3)[2];(t||A)&&I&&(0,c.m6)(n,{mark:g})}),(function(e){var t=(0,o.A)(e,4),n=t[0],r=(t[1],t[2]),i=t[3];if(P&&n!==Ye){var l={mark:g,prepend:!T&&"queue",attachTo:k,priority:m},s="function"==typeof f?f():f;s&&(l.csp={nonce:s});var u=[],d=[];Object.keys(i).forEach((function(e){e.startsWith("@layer")?u.push(e):d.push(e)})),u.forEach((function(e){(0,c.BD)(Ze(i[e]),"_layer-".concat(e),(0,a.A)((0,a.A)({},l),{},{prepend:!0}))}));var p=(0,c.BD)(n,r,l);p[b]=O.instanceId,p.setAttribute(h,R),d.forEach((function(e){(0,c.BD)(Ze(i[e]),"_effect-".concat(e),l)}))}})),L=(0,o.A)(N,3),j=L[0],_=L[1],H=L[2];return function(e){var t,n;E&&!P&&S?t=s.createElement("style",(0,te.A)({},(n={},(0,r.A)(n,h,_),(0,r.A)(n,g,H),n),{dangerouslySetInnerHTML:{__html:j}})):t=s.createElement(tt,null);return s.createElement(s.Fragment,null,t,e)}}var ot="cssVar";const it=function(e,t){var n=e.key,r=e.prefix,a=e.unitless,l=e.ignore,u=e.token,d=e.scope,f=void 0===d?"":d,p=(0,s.useContext)(w),v=p.cache.instanceId,m=p.container,y=u._tokenKey,A=[].concat((0,i.A)(e.path),[n,f,y]);return G(ot,A,(function(){var e=t(),i=D(e,n,{prefix:r,unitless:a,ignore:l,scope:f}),c=(0,o.A)(i,2),s=c[0],u=c[1];return[s,u,et(A,u),n]}),(function(e){var t=(0,o.A)(e,3)[2];I&&(0,c.m6)(t,{mark:g})}),(function(e){var t=(0,o.A)(e,3),r=t[1],i=t[2];if(r){var a=(0,c.BD)(r,i,{mark:g,prepend:"queue",attachTo:m,priority:-999});a[b]=v,a.setAttribute(h,n)}}))};var at;at={},(0,r.A)(at,nt,(function(e,t,n){var r=(0,o.A)(e,6),i=r[0],a=r[1],l=r[2],c=r[3],s=r[4],u=r[5],d=(n||{}).plain;if(s)return null;var f=i,p={"data-rc-order":"prependQueue","data-rc-priority":"".concat(u)};return f=j(i,a,l,p,d),c&&Object.keys(c).forEach((function(e){if(!t[e]){t[e]=!0;var n=j(Ze(c[e]),a,"_effect-".concat(e),p,d);e.startsWith("@layer")?f=n+f:f+=n}})),[u,l,f]})),(0,r.A)(at,J,(function(e,t,n){var r=(0,o.A)(e,5),i=r[2],a=r[3],l=r[4],c=(n||{}).plain;if(!a)return null;var s=i._tokenKey;return[-999,s,j(a,l,s,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},c)]})),(0,r.A)(at,ot,(function(e,t,n){var r=(0,o.A)(e,4),i=r[1],a=r[2],l=r[3],c=(n||{}).plain;if(!i)return null;return[-999,a,j(i,l,a,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},c)]}));const lt=function(){function e(t,n){(0,d.A)(this,e),(0,r.A)(this,"name",void 0),(0,r.A)(this,"style",void 0),(0,r.A)(this,"_keyframe",!0),this.name=t,this.style=n}return(0,f.A)(e,[{key:"getName",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?"".concat(e,"-").concat(this.name):this.name}}]),e}();function ct(e){return e.notSplit=!0,e}ct(["borderTop","borderBottom"]),ct(["borderTop"]),ct(["borderBottom"]),ct(["borderLeft","borderRight"]),ct(["borderLeft"]),ct(["borderRight"])},8046:(e,t,n)=>{"use strict";n.d(t,{A:()=>O});var r=n(8168),o=n(6636),i=n(4467),a=n(45),l=n(6540),c=n(6942),s=n.n(c),u=n(2200);const d=(0,l.createContext)({});var f=n(9379),p=n(2284),v=n(5089),m=n(2633),h=n(8210);function g(e){return"object"===(0,p.A)(e)&&"string"==typeof e.name&&"string"==typeof e.theme&&("object"===(0,p.A)(e.icon)||"function"==typeof e.icon)}function b(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce((function(t,n){var r,o=e[n];if("class"===n)t.className=o,delete t.class;else delete t[n],t[(r=n,r.replace(/-(.)/g,(function(e,t){return t.toUpperCase()})))]=o;return t}),{})}function y(e,t,n){return n?l.createElement(e.tag,(0,f.A)((0,f.A)({key:t},b(e.attrs)),n),(e.children||[]).map((function(n,r){return y(n,"".concat(t,"-").concat(e.tag,"-").concat(r))}))):l.createElement(e.tag,(0,f.A)({key:t},b(e.attrs)),(e.children||[]).map((function(n,r){return y(n,"".concat(t,"-").concat(e.tag,"-").concat(r))})))}function A(e){return(0,u.cM)(e)[0]}function w(e){return e?Array.isArray(e)?e:[e]:[]}var S=["icon","className","onClick","style","primaryColor","secondaryColor"],x={primaryColor:"#333",secondaryColor:"#E6E6E6",calculated:!1};var C=function(e){var t,n,r,o,i,c,s,u=e.icon,p=e.className,b=e.onClick,w=e.style,C=e.primaryColor,k=e.secondaryColor,E=(0,a.A)(e,S),M=l.useRef(),$=x;if(C&&($={primaryColor:C,secondaryColor:k||A(C)}),t=M,n=(0,l.useContext)(d),r=n.csp,o=n.prefixCls,i="\n.anticon {\n display: inline-flex;\n alignItems: center;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n",o&&(i=i.replace(/anticon/g,o)),(0,l.useEffect)((function(){var e=t.current,n=(0,m.j)(e);(0,v.BD)(i,"@ant-design-icons",{prepend:!0,csp:r,attachTo:n})}),[]),c=g(u),s="icon should be icon definiton, but got ".concat(u),(0,h.Ay)(c,"[@ant-design/icons] ".concat(s)),!g(u))return null;var O=u;return O&&"function"==typeof O.icon&&(O=(0,f.A)((0,f.A)({},O),{},{icon:O.icon($.primaryColor,$.secondaryColor)})),y(O.icon,"svg-".concat(O.name),(0,f.A)((0,f.A)({className:p,onClick:b,style:w,"data-icon":O.name,width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true"},E),{},{ref:M}))};C.displayName="IconReact",C.getTwoToneColors=function(){return(0,f.A)({},x)},C.setTwoToneColors=function(e){var t=e.primaryColor,n=e.secondaryColor;x.primaryColor=t,x.secondaryColor=n||A(t),x.calculated=!!n};const k=C;function E(e){var t=w(e),n=(0,o.A)(t,2),r=n[0],i=n[1];return k.setTwoToneColors({primaryColor:r,secondaryColor:i})}var M=["className","icon","spin","rotate","tabIndex","onClick","twoToneColor"];E(u.z1.primary);var $=l.forwardRef((function(e,t){var n=e.className,c=e.icon,u=e.spin,f=e.rotate,p=e.tabIndex,v=e.onClick,m=e.twoToneColor,h=(0,a.A)(e,M),g=l.useContext(d),b=g.prefixCls,y=void 0===b?"anticon":b,A=g.rootClassName,S=s()(A,y,(0,i.A)((0,i.A)({},"".concat(y,"-").concat(c.name),!!c.name),"".concat(y,"-spin"),!!u||"loading"===c.name),n),x=p;void 0===x&&v&&(x=-1);var C=f?{msTransform:"rotate(".concat(f,"deg)"),transform:"rotate(".concat(f,"deg)")}:void 0,E=w(m),$=(0,o.A)(E,2),O=$[0],T=$[1];return l.createElement("span",(0,r.A)({role:"img","aria-label":c.name},h,{ref:t,tabIndex:x,onClick:v,className:S}),l.createElement(k,{icon:c,primaryColor:O,secondaryColor:T,style:C}))}));$.displayName="AntdIcon",$.getTwoToneColor=function(){var e=k.getTwoToneColors();return e.calculated?[e.primaryColor,e.secondaryColor]:e.primaryColor},$.setTwoToneColor=E;const O=$},6467:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z"}}]},name:"close",theme:"outlined"};var a=n(8046),l=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const c=o.forwardRef(l)},8633:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"}}]},name:"left",theme:"outlined"};var a=n(8046),l=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const c=o.forwardRef(l)},363:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"}}]},name:"right",theme:"outlined"};var a=n(8046),l=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const c=o.forwardRef(l)},2456:(e,t,n)=>{"use strict";n.d(t,{H:()=>d,K6:()=>i,Me:()=>s,Ob:()=>u,YL:()=>l,_:()=>o,g8:()=>v,n6:()=>p,oS:()=>m,wE:()=>c});var r=n(9244);function o(e,t,n){return{r:255*(0,r.Cg)(e,255),g:255*(0,r.Cg)(t,255),b:255*(0,r.Cg)(n,255)}}function i(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,l=0,c=(o+i)/2;if(o===i)l=0,a=0;else{var s=o-i;switch(l=c>.5?s/(2-o-i):s/(o+i),o){case e:a=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*n*(t-e):n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function l(e,t,n){var o,i,l;if(e=(0,r.Cg)(e,360),t=(0,r.Cg)(t,100),n=(0,r.Cg)(n,100),0===t)i=n,l=n,o=n;else{var c=n<.5?n*(1+t):n+t-n*t,s=2*n-c;o=a(s,c,e+1/3),i=a(s,c,e),l=a(s,c,e-1/3)}return{r:255*o,g:255*i,b:255*l}}function c(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,l=o,c=o-i,s=0===o?0:c/o;if(o===i)a=0;else{switch(o){case e:a=(t-n)/c+(t>16,g:(65280&e)>>8,b:255&e}}},2434:(e,t,n)=>{"use strict";n.d(t,{D:()=>r});var r={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}},6250:(e,t,n)=>{"use strict";n.d(t,{RO:()=>a});var r=n(2456),o=n(2434),i=n(9244);function a(e){var t={r:0,g:0,b:0},n=1,a=null,l=null,c=null,s=!1,f=!1;return"string"==typeof e&&(e=function(e){if(e=e.trim().toLowerCase(),0===e.length)return!1;var t=!1;if(o.D[e])e=o.D[e],t=!0;else if("transparent"===e)return{r:0,g:0,b:0,a:0,format:"name"};var n=u.rgb.exec(e);if(n)return{r:n[1],g:n[2],b:n[3]};if(n=u.rgba.exec(e),n)return{r:n[1],g:n[2],b:n[3],a:n[4]};if(n=u.hsl.exec(e),n)return{h:n[1],s:n[2],l:n[3]};if(n=u.hsla.exec(e),n)return{h:n[1],s:n[2],l:n[3],a:n[4]};if(n=u.hsv.exec(e),n)return{h:n[1],s:n[2],v:n[3]};if(n=u.hsva.exec(e),n)return{h:n[1],s:n[2],v:n[3],a:n[4]};if(n=u.hex8.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),a:(0,r.n6)(n[4]),format:t?"name":"hex8"};if(n=u.hex6.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),format:t?"name":"hex"};if(n=u.hex4.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),a:(0,r.n6)(n[4]+n[4]),format:t?"name":"hex8"};if(n=u.hex3.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),format:t?"name":"hex"};return!1}(e)),"object"==typeof e&&(d(e.r)&&d(e.g)&&d(e.b)?(t=(0,r._)(e.r,e.g,e.b),s=!0,f="%"===String(e.r).substr(-1)?"prgb":"rgb"):d(e.h)&&d(e.s)&&d(e.v)?(a=(0,i.Px)(e.s),l=(0,i.Px)(e.v),t=(0,r.Me)(e.h,a,l),s=!0,f="hsv"):d(e.h)&&d(e.s)&&d(e.l)&&(a=(0,i.Px)(e.s),c=(0,i.Px)(e.l),t=(0,r.YL)(e.h,a,c),s=!0,f="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=(0,i.TV)(n),{ok:s,format:e.format||f,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var l="(?:".concat("[-\\+]?\\d*\\.\\d+%?",")|(?:").concat("[-\\+]?\\d+%?",")"),c="[\\s|\\(]+(".concat(l,")[,|\\s]+(").concat(l,")[,|\\s]+(").concat(l,")\\s*\\)?"),s="[\\s|\\(]+(".concat(l,")[,|\\s]+(").concat(l,")[,|\\s]+(").concat(l,")[,|\\s]+(").concat(l,")\\s*\\)?"),u={CSS_UNIT:new RegExp(l),rgb:new RegExp("rgb"+c),rgba:new RegExp("rgba"+s),hsl:new RegExp("hsl"+c),hsla:new RegExp("hsla"+s),hsv:new RegExp("hsv"+c),hsva:new RegExp("hsva"+s),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function d(e){return Boolean(u.CSS_UNIT.exec(String(e)))}},4978:(e,t,n)=>{"use strict";n.d(t,{q:()=>l});var r=n(2456),o=n(2434),i=n(6250),a=n(9244),l=function(){function e(t,n){var o;if(void 0===t&&(t=""),void 0===n&&(n={}),t instanceof e)return t;"number"==typeof t&&(t=(0,r.oS)(t)),this.originalInput=t;var a=(0,i.RO)(t);this.originalInput=t,this.r=a.r,this.g=a.g,this.b=a.b,this.a=a.a,this.roundA=Math.round(100*this.a)/100,this.format=null!==(o=n.format)&&void 0!==o?o:a.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=a.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},e.prototype.getLuminance=function(){var e=this.toRgb(),t=e.r/255,n=e.g/255,r=e.b/255;return.2126*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(e){return this.a=(0,a.TV)(e),this.roundA=Math.round(100*this.a)/100,this},e.prototype.isMonochrome=function(){return 0===this.toHsl().s},e.prototype.toHsv=function(){var e=(0,r.wE)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,v:e.v,a:this.a}},e.prototype.toHsvString=function(){var e=(0,r.wE)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.v);return 1===this.a?"hsv(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsva(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHsl=function(){var e=(0,r.K6)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,l:e.l,a:this.a}},e.prototype.toHslString=function(){var e=(0,r.K6)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.l);return 1===this.a?"hsl(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsla(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHex=function(e){return void 0===e&&(e=!1),(0,r.Ob)(this.r,this.g,this.b,e)},e.prototype.toHexString=function(e){return void 0===e&&(e=!1),"#"+this.toHex(e)},e.prototype.toHex8=function(e){return void 0===e&&(e=!1),(0,r.H)(this.r,this.g,this.b,this.a,e)},e.prototype.toHex8String=function(e){return void 0===e&&(e=!1),"#"+this.toHex8(e)},e.prototype.toHexShortString=function(e){return void 0===e&&(e=!1),1===this.a?this.toHexString(e):this.toHex8String(e)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var e=Math.round(this.r),t=Math.round(this.g),n=Math.round(this.b);return 1===this.a?"rgb(".concat(e,", ").concat(t,", ").concat(n,")"):"rgba(".concat(e,", ").concat(t,", ").concat(n,", ").concat(this.roundA,")")},e.prototype.toPercentageRgb=function(){var e=function(e){return"".concat(Math.round(100*(0,a.Cg)(e,255)),"%")};return{r:e(this.r),g:e(this.g),b:e(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var e=function(e){return Math.round(100*(0,a.Cg)(e,255))};return 1===this.a?"rgb(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%)"):"rgba(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%, ").concat(this.roundA,")")},e.prototype.toName=function(){if(0===this.a)return"transparent";if(this.a<1)return!1;for(var e="#"+(0,r.Ob)(this.r,this.g,this.b,!1),t=0,n=Object.entries(o.D);t=0;return t||!r||!e.startsWith("hex")&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this.a?this.toName():this.toRgbString()},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l+=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.brighten=function(t){void 0===t&&(t=10);var n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(-t/100*255))),n.g=Math.max(0,Math.min(255,n.g-Math.round(-t/100*255))),n.b=Math.max(0,Math.min(255,n.b-Math.round(-t/100*255))),new e(n)},e.prototype.darken=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l-=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.tint=function(e){return void 0===e&&(e=10),this.mix("white",e)},e.prototype.shade=function(e){return void 0===e&&(e=10),this.mix("black",e)},e.prototype.desaturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s-=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.saturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s+=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)},e.prototype.mix=function(t,n){void 0===n&&(n=50);var r=this.toRgb(),o=new e(t).toRgb(),i=n/100;return new e({r:(o.r-r.r)*i+r.r,g:(o.g-r.g)*i+r.g,b:(o.b-r.b)*i+r.b,a:(o.a-r.a)*i+r.a})},e.prototype.analogous=function(t,n){void 0===t&&(t=6),void 0===n&&(n=30);var r=this.toHsl(),o=360/n,i=[this];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,i.push(new e(r));return i},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){void 0===t&&(t=6);for(var n=this.toHsv(),r=n.h,o=n.s,i=n.v,a=[],l=1/t;t--;)a.push(new e({h:r,s:o,v:i})),i=(i+l)%1;return a},e.prototype.splitcomplement=function(){var t=this.toHsl(),n=t.h;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var n=this.toRgb(),r=new e(t).toRgb(),o=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/o,g:(n.g*n.a+r.g*r.a*(1-n.a))/o,b:(n.b*n.a+r.b*r.a*(1-n.a))/o,a:o})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var n=this.toHsl(),r=n.h,o=[this],i=360/t,a=1;a{"use strict";function r(e,t){(function(e){return"string"==typeof e&&-1!==e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!==e.indexOf("%")}(e);return e=360===t?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:e=360===t?(e<0?e%t+t:e%t)/parseFloat(String(t)):e%t/parseFloat(String(t))}function o(e){return Math.min(1,Math.max(0,e))}function i(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function a(e){return e<=1?"".concat(100*Number(e),"%"):e}function l(e){return 1===e.length?"0"+e:String(e)}n.d(t,{Cg:()=>r,J$:()=>o,Px:()=>a,TV:()=>i,wl:()=>l})},5470:(e,t,n)=>{"use strict";n.d(t,{A:()=>y});var r=n(6636),o=n(6540),i=n(961),a=n(998),l=(n(8210),n(8719));const c=o.createContext(null);var s=n(4241),u=n(981),d=[];var f=n(5089);function p(e){var t="rc-scrollbar-measure-".concat(Math.random().toString(36).substring(7)),n=document.createElement("div");n.id=t;var r,o,i=n.style;if(i.position="absolute",i.left="0",i.top="0",i.width="100px",i.height="100px",i.overflow="scroll",e){var a=getComputedStyle(e);i.scrollbarColor=a.scrollbarColor,i.scrollbarWidth=a.scrollbarWidth;var l=getComputedStyle(e,"::-webkit-scrollbar"),c=parseInt(l.width,10),s=parseInt(l.height,10);try{var u=c?"width: ".concat(l.width,";"):"",d=s?"height: ".concat(l.height,";"):"";(0,f.BD)("\n#".concat(t,"::-webkit-scrollbar {\n").concat(u,"\n").concat(d,"\n}"),t)}catch(m){console.error(m),r=c,o=s}}document.body.appendChild(n);var p=e&&r&&!isNaN(r)?r:n.offsetWidth-n.clientWidth,v=e&&o&&!isNaN(o)?o:n.offsetHeight-n.clientHeight;return document.body.removeChild(n),(0,f.m6)(t),{width:p,height:v}}var v="rc-util-locker-".concat(Date.now()),m=0;function h(e){var t=!!e,n=o.useState((function(){return m+=1,"".concat(v,"_").concat(m)})),i=(0,r.A)(n,1)[0];(0,u.A)((function(){if(t){var e=(r=document.body,"undefined"!=typeof document&&r&&r instanceof Element?p(r):{width:0,height:0}).width,n=document.body.scrollHeight>(window.innerHeight||document.documentElement.clientHeight)&&window.innerWidth>document.body.offsetWidth;(0,f.BD)("\nhtml body {\n overflow-y: hidden;\n ".concat(n?"width: calc(100% - ".concat(e,"px);"):"","\n}"),i)}else(0,f.m6)(i);var r;return function(){(0,f.m6)(i)}}),[t,i])}var g=!1;var b=function(e){return!1!==e&&((0,a.A)()&&e?"string"==typeof e?document.querySelector(e):"function"==typeof e?e():e:null)};const y=o.forwardRef((function(e,t){var n=e.open,f=e.autoLock,p=e.getContainer,v=(e.debug,e.autoDestroy),m=void 0===v||v,y=e.children,A=o.useState(n),w=(0,r.A)(A,2),S=w[0],x=w[1],C=S||n;o.useEffect((function(){(m||n)&&x(n)}),[n,m]);var k=o.useState((function(){return b(p)})),E=(0,r.A)(k,2),M=E[0],$=E[1];o.useEffect((function(){var e=b(p);$(null!=e?e:null)}));var O=function(e,t){var n=o.useState((function(){return(0,a.A)()?document.createElement("div"):null})),i=(0,r.A)(n,1)[0],l=o.useRef(!1),f=o.useContext(c),p=o.useState(d),v=(0,r.A)(p,2),m=v[0],h=v[1],g=f||(l.current?void 0:function(e){h((function(t){return[e].concat((0,s.A)(t))}))});function b(){i.parentElement||document.body.appendChild(i),l.current=!0}function y(){var e;null===(e=i.parentElement)||void 0===e||e.removeChild(i),l.current=!1}return(0,u.A)((function(){return e?f?f(b):b():y(),y}),[e]),(0,u.A)((function(){m.length&&(m.forEach((function(e){return e()})),h(d))}),[m]),[i,g]}(C&&!M),T=(0,r.A)(O,2),R=T[0],z=T[1],P=null!=M?M:R;h(f&&n&&(0,a.A)()&&(P===R||P===document.body));var N=null;y&&(0,l.f3)(y)&&t&&(N=y.ref);var I=(0,l.xK)(N,t);if(!C||!(0,a.A)()||void 0===M)return null;var L,j=!1===P||("boolean"==typeof L&&(g=L),g),_=y;return t&&(_=o.cloneElement(y,{ref:I})),o.createElement(c.Provider,{value:z},j?_:(0,i.createPortal)(_,P))}))},3723:(e,t,n)=>{"use strict";n.d(t,{b:()=>r});const r=(e,t,n)=>void 0!==n?n:`${e}-${t}`},3864:(e,t,n)=>{"use strict";n.d(t,{A:()=>bo});var r=n(6540),o=n(6942),i=n.n(o),a=n(9853),l=n(2279);const c=r.createContext(void 0),s=c,u=e=>{const t=r.useContext(s);return r.useMemo((()=>e?"string"==typeof e?null!=e?e:t:e instanceof Function?e(t):t:t),[e,t])},d=e=>{const{prefixCls:t,className:n,style:o,size:a,shape:l}=e,c=i()({[`${t}-lg`]:"large"===a,[`${t}-sm`]:"small"===a}),s=i()({[`${t}-circle`]:"circle"===l,[`${t}-square`]:"square"===l,[`${t}-round`]:"round"===l}),u=r.useMemo((()=>"number"==typeof a?{width:a,height:a,lineHeight:`${a}px`}:{}),[a]);return r.createElement("span",{className:i()(t,c,s,n),style:Object.assign(Object.assign({},u),o)})};var f=n(1466),p=n(665),v=n(336);const m=new f.Mo("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),h=e=>({height:e,lineHeight:(0,f.zA)(e)}),g=e=>Object.assign({width:e},h(e)),b=e=>({background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:m,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"}),y=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},h(e)),A=e=>{const{skeletonAvatarCls:t,gradientFromColor:n,controlHeight:r,controlHeightLG:o,controlHeightSM:i}=e;return{[`${t}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:n},g(r)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},g(o)),[`${t}${t}-sm`]:Object.assign({},g(i))}},w=e=>{const{controlHeight:t,borderRadiusSM:n,skeletonInputCls:r,controlHeightLG:o,controlHeightSM:i,gradientFromColor:a,calc:l}=e;return{[`${r}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:a,borderRadius:n},y(t,l)),[`${r}-lg`]:Object.assign({},y(o,l)),[`${r}-sm`]:Object.assign({},y(i,l))}},S=e=>Object.assign({width:e},h(e)),x=e=>{const{skeletonImageCls:t,imageSizeBase:n,gradientFromColor:r,borderRadiusSM:o,calc:i}=e;return{[`${t}`]:Object.assign(Object.assign({display:"flex",alignItems:"center",justifyContent:"center",verticalAlign:"top",background:r,borderRadius:o},S(i(n).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},S(n)),{maxWidth:i(n).mul(4).equal(),maxHeight:i(n).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}},C=(e,t,n)=>{const{skeletonButtonCls:r}=e;return{[`${n}${r}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${n}${r}-round`]:{borderRadius:t}}},k=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},h(e)),E=e=>{const{borderRadiusSM:t,skeletonButtonCls:n,controlHeight:r,controlHeightLG:o,controlHeightSM:i,gradientFromColor:a,calc:l}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[`${n}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:a,borderRadius:t,width:l(r).mul(2).equal(),minWidth:l(r).mul(2).equal()},k(r,l))},C(e,r,n)),{[`${n}-lg`]:Object.assign({},k(o,l))}),C(e,o,`${n}-lg`)),{[`${n}-sm`]:Object.assign({},k(i,l))}),C(e,i,`${n}-sm`))},M=e=>{const{componentCls:t,skeletonAvatarCls:n,skeletonTitleCls:r,skeletonParagraphCls:o,skeletonButtonCls:i,skeletonInputCls:a,skeletonImageCls:l,controlHeight:c,controlHeightLG:s,controlHeightSM:u,gradientFromColor:d,padding:f,marginSM:p,borderRadius:v,titleHeight:m,blockRadius:h,paragraphLiHeight:y,controlHeightXS:S,paragraphMarginTop:C}=e;return{[`${t}`]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:f,verticalAlign:"top",[`${n}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:d},g(c)),[`${n}-circle`]:{borderRadius:"50%"},[`${n}-lg`]:Object.assign({},g(s)),[`${n}-sm`]:Object.assign({},g(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[`${r}`]:{width:"100%",height:m,background:d,borderRadius:h,[`+ ${o}`]:{marginBlockStart:u}},[`${o}`]:{padding:0,"> li":{width:"100%",height:y,listStyle:"none",background:d,borderRadius:h,"+ li":{marginBlockStart:S}}},[`${o}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${r}, ${o} > li`]:{borderRadius:v}}},[`${t}-with-avatar ${t}-content`]:{[`${r}`]:{marginBlockStart:p,[`+ ${o}`]:{marginBlockStart:C}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},E(e)),A(e)),w(e)),x(e)),[`${t}${t}-block`]:{width:"100%",[`${i}`]:{width:"100%"},[`${a}`]:{width:"100%"}},[`${t}${t}-active`]:{[`\n ${r},\n ${o} > li,\n ${n},\n ${i},\n ${a},\n ${l}\n `]:Object.assign({},b(e))}}},$=(0,p.OF)("Skeleton",(e=>{const{componentCls:t,calc:n}=e,r=(0,v.h1)(e,{skeletonAvatarCls:`${t}-avatar`,skeletonTitleCls:`${t}-title`,skeletonParagraphCls:`${t}-paragraph`,skeletonButtonCls:`${t}-button`,skeletonInputCls:`${t}-input`,skeletonImageCls:`${t}-image`,imageSizeBase:n(e.controlHeight).mul(1.5).equal(),borderRadius:100,skeletonLoadingBackground:`linear-gradient(90deg, ${e.gradientFromColor} 25%, ${e.gradientToColor} 37%, ${e.gradientFromColor} 63%)`,skeletonLoadingMotionDuration:"1.4s"});return[M(r)]}),(e=>{const{colorFillContent:t,colorFill:n}=e;return{color:t,colorGradientEnd:n,gradientFromColor:t,gradientToColor:n,titleHeight:e.controlHeight/2,blockRadius:e.borderRadiusSM,paragraphMarginTop:e.marginLG+e.marginXXS,paragraphLiHeight:e.controlHeight/2}}),{deprecatedTokens:[["color","gradientFromColor"],["colorGradientEnd","gradientToColor"]]}),O=e=>{const{prefixCls:t,className:n,rootClassName:o,active:c,shape:s="circle",size:u="default"}=e,{getPrefixCls:f}=r.useContext(l.QO),p=f("skeleton",t),[v,m,h]=$(p),g=(0,a.A)(e,["prefixCls","className"]),b=i()(p,`${p}-element`,{[`${p}-active`]:c},n,o,m,h);return v(r.createElement("div",{className:b},r.createElement(d,Object.assign({prefixCls:`${p}-avatar`,shape:s,size:u},g))))},T=e=>{const{prefixCls:t,className:n,rootClassName:o,active:c,block:s=!1,size:u="default"}=e,{getPrefixCls:f}=r.useContext(l.QO),p=f("skeleton",t),[v,m,h]=$(p),g=(0,a.A)(e,["prefixCls"]),b=i()(p,`${p}-element`,{[`${p}-active`]:c,[`${p}-block`]:s},n,o,m,h);return v(r.createElement("div",{className:b},r.createElement(d,Object.assign({prefixCls:`${p}-button`,size:u},g))))},R=e=>{const{prefixCls:t,className:n,rootClassName:o,style:a,active:c}=e,{getPrefixCls:s}=r.useContext(l.QO),u=s("skeleton",t),[d,f,p]=$(u),v=i()(u,`${u}-element`,{[`${u}-active`]:c},n,o,f,p);return d(r.createElement("div",{className:v},r.createElement("div",{className:i()(`${u}-image`,n),style:a},r.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${u}-image-svg`},r.createElement("path",{d:"M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z",className:`${u}-image-path`})))))},z=e=>{const{prefixCls:t,className:n,rootClassName:o,active:c,block:s,size:u="default"}=e,{getPrefixCls:f}=r.useContext(l.QO),p=f("skeleton",t),[v,m,h]=$(p),g=(0,a.A)(e,["prefixCls"]),b=i()(p,`${p}-element`,{[`${p}-active`]:c,[`${p}-block`]:s},n,o,m,h);return v(r.createElement("div",{className:b},r.createElement(d,Object.assign({prefixCls:`${p}-input`,size:u},g))))};var P=n(8168);const N={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM288 604a64 64 0 10128 0 64 64 0 10-128 0zm118-224a48 48 0 1096 0 48 48 0 10-96 0zm158 228a96 96 0 10192 0 96 96 0 10-192 0zm148-314a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"dot-chart",theme:"outlined"};var I=n(8046),L=function(e,t){return r.createElement(I.A,(0,P.A)({},e,{ref:t,icon:N}))};const j=r.forwardRef(L),_=e=>{const{prefixCls:t,className:n,rootClassName:o,style:a,active:c,children:s}=e,{getPrefixCls:u}=r.useContext(l.QO),d=u("skeleton",t),[f,p,v]=$(d),m=i()(d,`${d}-element`,{[`${d}-active`]:c},p,n,o,v),h=null!=s?s:r.createElement(j,null);return f(r.createElement("div",{className:m},r.createElement("div",{className:i()(`${d}-image`,n),style:a},h)))};var H=n(4241);const D=(e,t)=>{const{width:n,rows:r=2}=t;return Array.isArray(n)?n[e]:r-1===e?n:void 0},B=e=>{const{prefixCls:t,className:n,style:o,rows:a}=e,l=(0,H.A)(Array(a)).map(((t,n)=>r.createElement("li",{key:n,style:{width:D(n,e)}})));return r.createElement("ul",{className:i()(t,n),style:o},l)},W=e=>{let{prefixCls:t,className:n,width:o,style:a}=e;return r.createElement("h3",{className:i()(t,n),style:Object.assign({width:o},a)})};function F(e){return e&&"object"==typeof e?e:{}}const X=e=>{const{prefixCls:t,loading:n,className:o,rootClassName:a,style:c,children:s,avatar:u=!1,title:f=!0,paragraph:p=!0,active:v,round:m}=e,{getPrefixCls:h,direction:g,skeleton:b}=r.useContext(l.QO),y=h("skeleton",t),[A,w,S]=$(y);if(n||!("loading"in e)){const e=!!u,t=!!f,n=!!p;let l,s;if(e){const e=Object.assign(Object.assign({prefixCls:`${y}-avatar`},function(e,t){return e&&!t?{size:"large",shape:"square"}:{size:"large",shape:"circle"}}(t,n)),F(u));l=r.createElement("div",{className:`${y}-header`},r.createElement(d,Object.assign({},e)))}if(t||n){let o,i;if(t){const t=Object.assign(Object.assign({prefixCls:`${y}-title`},function(e,t){return!e&&t?{width:"38%"}:e&&t?{width:"50%"}:{}}(e,n)),F(f));o=r.createElement(W,Object.assign({},t))}if(n){const n=Object.assign(Object.assign({prefixCls:`${y}-paragraph`},function(e,t){const n={};return e&&t||(n.width="61%"),n.rows=!e&&t?3:2,n}(e,t)),F(p));i=r.createElement(B,Object.assign({},n))}s=r.createElement("div",{className:`${y}-content`},o,i)}const h=i()(y,{[`${y}-with-avatar`]:e,[`${y}-active`]:v,[`${y}-rtl`]:"rtl"===g,[`${y}-round`]:m},null==b?void 0:b.className,o,a,w,S);return A(r.createElement("div",{className:h,style:Object.assign(Object.assign({},null==b?void 0:b.style),c)},l,s))}return null!=s?s:null};X.Button=T,X.Avatar=O,X.Input=z,X.Image=R,X.Node=_;const K=X;var G=n(6467);const q={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M176 511a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"ellipsis",theme:"outlined"};var Y=function(e,t){return r.createElement(I.A,(0,P.A)({},e,{ref:t,icon:q}))};const U=r.forwardRef(Y);const V={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z"}},{tag:"path",attrs:{d:"M192 474h672q8 0 8 8v60q0 8-8 8H160q-8 0-8-8v-60q0-8 8-8z"}}]},name:"plus",theme:"outlined"};var Q=function(e,t){return r.createElement(I.A,(0,P.A)({},e,{ref:t,icon:V}))};const Z=r.forwardRef(Q);var J=n(4467),ee=n(9379),te=n(6636),ne=n(2284),re=n(45),oe=n(2533);const ie=function(){if("undefined"==typeof navigator||"undefined"==typeof window)return!1;var e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(null==e?void 0:e.substr(0,4))},ae=(0,r.createContext)(null);var le=n(6351);function ce(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[];return r.Children.forEach(e,(function(e){(null!=e||t.keepEmpty)&&(Array.isArray(e)?n=n.concat(ce(e)):(0,le.isFragment)(e)&&e.props?n=n.concat(ce(e.props.children,t)):n.push(e))})),n}var se=n(8210),ue=n(6588),de=n(8719),fe=r.createContext(null);var pe=n(3591),ve=new Map;var me=new pe.A((function(e){e.forEach((function(e){var t,n=e.target;null===(t=ve.get(n))||void 0===t||t.forEach((function(e){return e(n)}))}))}));var he=n(3029),ge=n(2901),be=n(5501),ye=n(9426),Ae=function(e){(0,be.A)(n,e);var t=(0,ye.A)(n);function n(){return(0,he.A)(this,n),t.apply(this,arguments)}return(0,ge.A)(n,[{key:"render",value:function(){return this.props.children}}]),n}(r.Component);function we(e,t){var n=e.children,o=e.disabled,i=r.useRef(null),a=r.useRef(null),l=r.useContext(fe),c="function"==typeof n,s=c?n(i):n,u=r.useRef({width:-1,height:-1,offsetWidth:-1,offsetHeight:-1}),d=!c&&r.isValidElement(s)&&(0,de.f3)(s),f=d?s.ref:null,p=(0,de.xK)(f,i),v=function(){var e;return(0,ue.A)(i.current)||(i.current&&"object"===(0,ne.A)(i.current)?(0,ue.A)(null===(e=i.current)||void 0===e?void 0:e.nativeElement):null)||(0,ue.A)(a.current)};r.useImperativeHandle(t,(function(){return v()}));var m=r.useRef(e);m.current=e;var h=r.useCallback((function(e){var t=m.current,n=t.onResize,r=t.data,o=e.getBoundingClientRect(),i=o.width,a=o.height,c=e.offsetWidth,s=e.offsetHeight,d=Math.floor(i),f=Math.floor(a);if(u.current.width!==d||u.current.height!==f||u.current.offsetWidth!==c||u.current.offsetHeight!==s){var p={width:d,height:f,offsetWidth:c,offsetHeight:s};u.current=p;var v=c===Math.round(i)?i:c,h=s===Math.round(a)?a:s,g=(0,ee.A)((0,ee.A)({},p),{},{offsetWidth:v,offsetHeight:h});null==l||l(g,e,r),n&&Promise.resolve().then((function(){n(g,e)}))}}),[]);return r.useEffect((function(){var e,t,n=v();return n&&!o&&(e=n,t=h,ve.has(e)||(ve.set(e,new Set),me.observe(e)),ve.get(e).add(t)),function(){return function(e,t){ve.has(e)&&(ve.get(e).delete(t),ve.get(e).size||(me.unobserve(e),ve.delete(e)))}(n,h)}}),[i.current,o]),r.createElement(Ae,{ref:a},d?r.cloneElement(s,{ref:p}):s)}const Se=r.forwardRef(we);function xe(e,t){var n=e.children;return("function"==typeof n?[n]:ce(n)).map((function(n,o){var i=(null==n?void 0:n.key)||"".concat("rc-observer-key","-").concat(o);return r.createElement(Se,(0,P.A)({},e,{key:i,ref:0===o?t:void 0}),n)}))}var Ce=r.forwardRef(xe);Ce.Collection=function(e){var t=e.children,n=e.onBatchResize,o=r.useRef(0),i=r.useRef([]),a=r.useContext(fe),l=r.useCallback((function(e,t,r){o.current+=1;var l=o.current;i.current.push({size:e,element:t,data:r}),Promise.resolve().then((function(){l===o.current&&(null==n||n(i.current),i.current=[])})),null==a||a(e,t,r)}),[n,a]);return r.createElement(fe.Provider,{value:l},t)};const ke=Ce;var Ee=n(6956),Me=n(5371);const $e=function(e){var t=e.activeTabOffset,n=e.horizontal,o=e.rtl,i=e.indicator,a=void 0===i?{}:i,l=a.size,c=a.align,s=void 0===c?"center":c,u=(0,r.useState)(),d=(0,te.A)(u,2),f=d[0],p=d[1],v=(0,r.useRef)(),m=r.useCallback((function(e){return"function"==typeof l?l(e):"number"==typeof l?l:e}),[l]);function h(){Me.A.cancel(v.current)}return(0,r.useEffect)((function(){var e={};if(t)if(n){e.width=m(t.width);var r=o?"right":"left";"start"===s&&(e[r]=t[r]),"center"===s&&(e[r]=t[r]+t.width/2,e.transform=o?"translateX(50%)":"translateX(-50%)"),"end"===s&&(e[r]=t[r]+t.width,e.transform="translateX(-100%)")}else e.height=m(t.height),"start"===s&&(e.top=t.top),"center"===s&&(e.top=t.top+t.height/2,e.transform="translateY(-50%)"),"end"===s&&(e.top=t.top+t.height,e.transform="translateY(-100%)");return h(),v.current=(0,Me.A)((function(){p(e)})),h}),[t,n,o,s,m]),{style:f}};var Oe={width:0,height:0,left:0,top:0};function Te(e,t){var n=r.useRef(e),o=r.useState({}),i=(0,te.A)(o,2)[1];return[n.current,function(e){var r="function"==typeof e?e(n.current):e;r!==n.current&&t(r,n.current),n.current=r,i({})}]}var Re=Math.pow(.995,20);var ze=n(981);function Pe(e){var t=(0,r.useState)(0),n=(0,te.A)(t,2),o=n[0],i=n[1],a=(0,r.useRef)(0),l=(0,r.useRef)();return l.current=e,(0,ze.o)((function(){var e;null===(e=l.current)||void 0===e||e.call(l)}),[o]),function(){a.current===o&&(a.current+=1,i(a.current))}}var Ne={width:0,height:0,left:0,top:0,right:0};function Ie(e){var t;return e instanceof Map?(t={},e.forEach((function(e,n){t[n]=e}))):t=e,JSON.stringify(t)}function Le(e){return String(e).replace(/"/g,"TABS_DQ")}function je(e,t,n,r){return!(!n||r||!1===e||void 0===e&&(!1===t||null===t))}var _e=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.editable,i=e.locale,a=e.style;return o&&!1!==o.showAdd?r.createElement("button",{ref:t,type:"button",className:"".concat(n,"-nav-add"),style:a,"aria-label":(null==i?void 0:i.addAriaLabel)||"Add tab",onClick:function(e){o.onEdit("add",{event:e})}},o.addIcon||"+"):null}));const He=_e;const De=r.forwardRef((function(e,t){var n,o=e.position,i=e.prefixCls,a=e.extra;if(!a)return null;var l={};return"object"!==(0,ne.A)(a)||r.isValidElement(a)?l.right=a:l=a,"right"===o&&(n=l.right),"left"===o&&(n=l.left),n?r.createElement("div",{className:"".concat(i,"-extra-content"),ref:t},n):null}));var Be=n(5470),We=n(2633),Fe=n(6855),Xe=n(8542);function Ke(e){var t=e.prefixCls,n=e.align,o=e.arrow,a=e.arrowPos,l=o||{},c=l.className,s=l.content,u=a.x,d=void 0===u?0:u,f=a.y,p=void 0===f?0:f,v=r.useRef();if(!n||!n.points)return null;var m={position:"absolute"};if(!1!==n.autoArrow){var h=n.points[0],g=n.points[1],b=h[0],y=h[1],A=g[0],w=g[1];b!==A&&["t","b"].includes(b)?"t"===b?m.top=0:m.bottom=0:m.top=p,y!==w&&["l","r"].includes(y)?"l"===y?m.left=0:m.right=0:m.left=d}return r.createElement("div",{ref:v,className:i()("".concat(t,"-arrow"),c),style:m},s)}function Ge(e){var t=e.prefixCls,n=e.open,o=e.zIndex,a=e.mask,l=e.motion;return a?r.createElement(Xe.Ay,(0,P.A)({},l,{motionAppear:!0,visible:n,removeOnLeave:!0}),(function(e){var n=e.className;return r.createElement("div",{style:{zIndex:o},className:i()("".concat(t,"-mask"),n)})})):null}const qe=r.memo((function(e){return e.children}),(function(e,t){return t.cache}));var Ye=r.forwardRef((function(e,t){var n=e.popup,o=e.className,a=e.prefixCls,l=e.style,c=e.target,s=e.onVisibleChanged,u=e.open,d=e.keepDom,f=e.fresh,p=e.onClick,v=e.mask,m=e.arrow,h=e.arrowPos,g=e.align,b=e.motion,y=e.maskMotion,A=e.forceRender,w=e.getPopupContainer,S=e.autoDestroy,x=e.portal,C=e.zIndex,k=e.onMouseEnter,E=e.onMouseLeave,M=e.onPointerEnter,$=e.ready,O=e.offsetX,T=e.offsetY,R=e.offsetR,z=e.offsetB,N=e.onAlign,I=e.onPrepare,L=e.stretch,j=e.targetWidth,_=e.targetHeight,H="function"==typeof n?n():n,D=u||d,B=(null==w?void 0:w.length)>0,W=r.useState(!w||!B),F=(0,te.A)(W,2),X=F[0],K=F[1];if((0,ze.A)((function(){!X&&B&&c&&K(!0)}),[X,B,c]),!X)return null;var G="auto",q={left:"-1000vw",top:"-1000vh",right:G,bottom:G};if($||!u){var Y,U=g.points,V=g.dynamicInset||(null===(Y=g._experimental)||void 0===Y?void 0:Y.dynamicInset),Q=V&&"r"===U[0][1],Z=V&&"b"===U[0][0];Q?(q.right=R,q.left=G):(q.left=O,q.right=G),Z?(q.bottom=z,q.top=G):(q.top=T,q.bottom=G)}var J={};return L&&(L.includes("height")&&_?J.height=_:L.includes("minHeight")&&_&&(J.minHeight=_),L.includes("width")&&j?J.width=j:L.includes("minWidth")&&j&&(J.minWidth=j)),u||(J.pointerEvents="none"),r.createElement(x,{open:A||D,getContainer:w&&function(){return w(c)},autoDestroy:S},r.createElement(Ge,{prefixCls:a,open:u,zIndex:C,mask:v,motion:y}),r.createElement(ke,{onResize:N,disabled:!u},(function(e){return r.createElement(Xe.Ay,(0,P.A)({motionAppear:!0,motionEnter:!0,motionLeave:!0,removeOnLeave:!1,forceRender:A,leavedClassName:"".concat(a,"-hidden")},b,{onAppearPrepare:I,onEnterPrepare:I,visible:u,onVisibleChanged:function(e){var t;null==b||null===(t=b.onVisibleChanged)||void 0===t||t.call(b,e),s(e)}}),(function(n,c){var s=n.className,d=n.style,v=i()(a,s,o);return r.createElement("div",{ref:(0,de.K4)(e,t,c),className:v,style:(0,ee.A)((0,ee.A)((0,ee.A)((0,ee.A)({"--arrow-x":"".concat(h.x||0,"px"),"--arrow-y":"".concat(h.y||0,"px")},q),J),d),{},{boxSizing:"border-box",zIndex:C},l),onMouseEnter:k,onMouseLeave:E,onPointerEnter:M,onClick:p},m&&r.createElement(Ke,{prefixCls:a,arrow:m,arrowPos:h,align:g}),r.createElement(qe,{cache:!u&&!f},H))}))})))}));const Ue=Ye;const Ve=r.forwardRef((function(e,t){var n=e.children,o=e.getTriggerDOMNode,i=(0,de.f3)(n),a=r.useCallback((function(e){(0,de.Xf)(t,o?o(e):e)}),[o]),l=(0,de.xK)(a,n.ref);return i?r.cloneElement(n,{ref:l}):n}));const Qe=r.createContext(null);function Ze(e){return e?Array.isArray(e)?e:[e]:[]}const Je=function(e){if(!e)return!1;if(e instanceof Element){if(e.offsetParent)return!0;if(e.getBBox){var t=e.getBBox(),n=t.width,r=t.height;if(n||r)return!0}if(e.getBoundingClientRect){var o=e.getBoundingClientRect(),i=o.width,a=o.height;if(i||a)return!0}}return!1};function et(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return(arguments.length>2?arguments[2]:void 0)?e[0]===t[0]:e[0]===t[0]&&e[1]===t[1]}function tt(e,t,n,r){return t||(n?{motionName:"".concat(e,"-").concat(n)}:r?{motionName:r}:null)}function nt(e){return e.ownerDocument.defaultView}function rt(e){for(var t=[],n=null==e?void 0:e.parentElement,r=["hidden","scroll","clip","auto"];n;){var o=nt(n).getComputedStyle(n);[o.overflowX,o.overflowY,o.overflow].some((function(e){return r.includes(e)}))&&t.push(n),n=n.parentElement}return t}function ot(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return Number.isNaN(e)?t:e}function it(e){return ot(parseFloat(e),0)}function at(e,t){var n=(0,ee.A)({},e);return(t||[]).forEach((function(e){if(!(e instanceof HTMLBodyElement||e instanceof HTMLHtmlElement)){var t=nt(e).getComputedStyle(e),r=t.overflow,o=t.overflowClipMargin,i=t.borderTopWidth,a=t.borderBottomWidth,l=t.borderLeftWidth,c=t.borderRightWidth,s=e.getBoundingClientRect(),u=e.offsetHeight,d=e.clientHeight,f=e.offsetWidth,p=e.clientWidth,v=it(i),m=it(a),h=it(l),g=it(c),b=ot(Math.round(s.width/f*1e3)/1e3),y=ot(Math.round(s.height/u*1e3)/1e3),A=(f-p-h-g)*b,w=(u-d-v-m)*y,S=v*y,x=m*y,C=h*b,k=g*b,E=0,M=0;if("clip"===r){var $=it(o);E=$*b,M=$*y}var O=s.x+C-E,T=s.y+S-M,R=O+s.width+2*E-C-k-A,z=T+s.height+2*M-S-x-w;n.left=Math.max(n.left,O),n.top=Math.max(n.top,T),n.right=Math.min(n.right,R),n.bottom=Math.min(n.bottom,z)}})),n}function lt(e){var t="".concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0),n=t.match(/^(.*)\%$/);return n?e*(parseFloat(n[1])/100):parseFloat(t)}function ct(e,t){var n=t||[],r=(0,te.A)(n,2),o=r[0],i=r[1];return[lt(e.width,o),lt(e.height,i)]}function st(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return[e[0],e[1]]}function ut(e,t){var n,r=t[0],o=t[1];return n="t"===r?e.y:"b"===r?e.y+e.height:e.y+e.height/2,{x:"l"===o?e.x:"r"===o?e.x+e.width:e.x+e.width/2,y:n}}function dt(e,t){var n={t:"b",b:"t",l:"r",r:"l"};return e.map((function(e,r){return r===t?n[e]||"c":e})).join("")}var ft=["prefixCls","children","action","showAction","hideAction","popupVisible","defaultPopupVisible","onPopupVisibleChange","afterPopupVisibleChange","mouseEnterDelay","mouseLeaveDelay","focusDelay","blurDelay","mask","maskClosable","getPopupContainer","forceRender","autoDestroy","destroyPopupOnHide","popup","popupClassName","popupStyle","popupPlacement","builtinPlacements","popupAlign","zIndex","stretch","getPopupClassNameFromAlign","fresh","alignPoint","onPopupClick","onPopupAlign","arrow","popupMotion","maskMotion","popupTransitionName","popupAnimation","maskTransitionName","maskAnimation","className","getTriggerDOMNode"];const pt=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Be.A,t=r.forwardRef((function(t,n){var o=t.prefixCls,a=void 0===o?"rc-trigger-popup":o,l=t.children,c=t.action,s=void 0===c?"hover":c,u=t.showAction,d=t.hideAction,f=t.popupVisible,p=t.defaultPopupVisible,v=t.onPopupVisibleChange,m=t.afterPopupVisibleChange,h=t.mouseEnterDelay,g=t.mouseLeaveDelay,b=void 0===g?.1:g,y=t.focusDelay,A=t.blurDelay,w=t.mask,S=t.maskClosable,x=void 0===S||S,C=t.getPopupContainer,k=t.forceRender,E=t.autoDestroy,M=t.destroyPopupOnHide,$=t.popup,O=t.popupClassName,T=t.popupStyle,R=t.popupPlacement,z=t.builtinPlacements,P=void 0===z?{}:z,N=t.popupAlign,I=t.zIndex,L=t.stretch,j=t.getPopupClassNameFromAlign,_=t.fresh,D=t.alignPoint,B=t.onPopupClick,W=t.onPopupAlign,F=t.arrow,X=t.popupMotion,K=t.maskMotion,G=t.popupTransitionName,q=t.popupAnimation,Y=t.maskTransitionName,U=t.maskAnimation,V=t.className,Q=t.getTriggerDOMNode,Z=(0,re.A)(t,ft),J=E||M||!1,ne=r.useState(!1),oe=(0,te.A)(ne,2),ae=oe[0],le=oe[1];(0,ze.A)((function(){le(ie())}),[]);var ce=r.useRef({}),se=r.useContext(Qe),de=r.useMemo((function(){return{registerSubPopup:function(e,t){ce.current[e]=t,null==se||se.registerSubPopup(e,t)}}}),[se]),fe=(0,Fe.A)(),pe=r.useState(null),ve=(0,te.A)(pe,2),me=ve[0],he=ve[1],ge=r.useRef(null),be=(0,Ee.A)((function(e){ge.current=e,(0,ue.f)(e)&&me!==e&&he(e),null==se||se.registerSubPopup(fe,e)})),ye=r.useState(null),Ae=(0,te.A)(ye,2),we=Ae[0],Se=Ae[1],xe=r.useRef(null),Ce=(0,Ee.A)((function(e){(0,ue.f)(e)&&we!==e&&(Se(e),xe.current=e)})),Me=r.Children.only(l),$e=(null==Me?void 0:Me.props)||{},Oe={},Te=(0,Ee.A)((function(e){var t,n,r=we;return(null==r?void 0:r.contains(e))||(null===(t=(0,We.j)(r))||void 0===t?void 0:t.host)===e||e===r||(null==me?void 0:me.contains(e))||(null===(n=(0,We.j)(me))||void 0===n?void 0:n.host)===e||e===me||Object.values(ce.current).some((function(t){return(null==t?void 0:t.contains(e))||e===t}))})),Re=tt(a,X,q,G),Pe=tt(a,K,U,Y),Ne=r.useState(p||!1),Ie=(0,te.A)(Ne,2),Le=Ie[0],je=Ie[1],_e=null!=f?f:Le,He=(0,Ee.A)((function(e){void 0===f&&je(e)}));(0,ze.A)((function(){je(f||!1)}),[f]);var De=r.useRef(_e);De.current=_e;var Be=r.useRef([]);Be.current=[];var Xe=(0,Ee.A)((function(e){var t;He(e),(null!==(t=Be.current[Be.current.length-1])&&void 0!==t?t:_e)!==e&&(Be.current.push(e),null==v||v(e))})),Ke=r.useRef(),Ge=function(){clearTimeout(Ke.current)},qe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;Ge(),0===t?Xe(e):Ke.current=setTimeout((function(){Xe(e)}),1e3*t)};r.useEffect((function(){return Ge}),[]);var Ye=r.useState(!1),it=(0,te.A)(Ye,2),lt=it[0],pt=it[1];(0,ze.A)((function(e){e&&!_e||pt(!0)}),[_e]);var vt=r.useState(null),mt=(0,te.A)(vt,2),ht=mt[0],gt=mt[1],bt=r.useState([0,0]),yt=(0,te.A)(bt,2),At=yt[0],wt=yt[1],St=function(e){wt([e.clientX,e.clientY])},xt=function(e,t,n,o,i,a,l){var c=r.useState({ready:!1,offsetX:0,offsetY:0,offsetR:0,offsetB:0,arrowX:0,arrowY:0,scaleX:1,scaleY:1,align:i[o]||{}}),s=(0,te.A)(c,2),u=s[0],d=s[1],f=r.useRef(0),p=r.useMemo((function(){return t?rt(t):[]}),[t]),v=r.useRef({});e||(v.current={});var m=(0,Ee.A)((function(){if(t&&n&&e){var r,c,s,u=t,f=u.ownerDocument,m=nt(u).getComputedStyle(u),h=m.width,g=m.height,b=m.position,y=u.style.left,A=u.style.top,w=u.style.right,S=u.style.bottom,x=u.style.overflow,C=(0,ee.A)((0,ee.A)({},i[o]),a),k=f.createElement("div");if(null===(r=u.parentElement)||void 0===r||r.appendChild(k),k.style.left="".concat(u.offsetLeft,"px"),k.style.top="".concat(u.offsetTop,"px"),k.style.position=b,k.style.height="".concat(u.offsetHeight,"px"),k.style.width="".concat(u.offsetWidth,"px"),u.style.left="0",u.style.top="0",u.style.right="auto",u.style.bottom="auto",u.style.overflow="hidden",Array.isArray(n))s={x:n[0],y:n[1],width:0,height:0};else{var E=n.getBoundingClientRect();s={x:E.x,y:E.y,width:E.width,height:E.height}}var M=u.getBoundingClientRect(),$=f.documentElement,O=$.clientWidth,T=$.clientHeight,R=$.scrollWidth,z=$.scrollHeight,P=$.scrollTop,N=$.scrollLeft,I=M.height,L=M.width,j=s.height,_=s.width,H={left:0,top:0,right:O,bottom:T},D={left:-N,top:-P,right:R-N,bottom:z-P},B=C.htmlRegion,W="visible",F="visibleFirst";"scroll"!==B&&B!==F&&(B=W);var X=B===F,K=at(D,p),G=at(H,p),q=B===W?G:K,Y=X?G:q;u.style.left="auto",u.style.top="auto",u.style.right="0",u.style.bottom="0";var U=u.getBoundingClientRect();u.style.left=y,u.style.top=A,u.style.right=w,u.style.bottom=S,u.style.overflow=x,null===(c=u.parentElement)||void 0===c||c.removeChild(k);var V=ot(Math.round(L/parseFloat(h)*1e3)/1e3),Q=ot(Math.round(I/parseFloat(g)*1e3)/1e3);if(0===V||0===Q||(0,ue.f)(n)&&!Je(n))return;var Z=C.offset,J=C.targetOffset,ne=ct(M,Z),re=(0,te.A)(ne,2),oe=re[0],ie=re[1],ae=ct(s,J),le=(0,te.A)(ae,2),ce=le[0],se=le[1];s.x-=ce,s.y-=se;var de=C.points||[],fe=(0,te.A)(de,2),pe=fe[0],ve=st(fe[1]),me=st(pe),he=ut(s,ve),ge=ut(M,me),be=(0,ee.A)({},C),ye=he.x-ge.x+oe,Ae=he.y-ge.y+ie;function wt(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:q,r=M.x+e,o=M.y+t,i=r+L,a=o+I,l=Math.max(r,n.left),c=Math.max(o,n.top),s=Math.min(i,n.right),u=Math.min(a,n.bottom);return Math.max(0,(s-l)*(u-c))}var we,Se,xe,Ce,ke=wt(ye,Ae),Ee=wt(ye,Ae,G),Me=ut(s,["t","l"]),$e=ut(M,["t","l"]),Oe=ut(s,["b","r"]),Te=ut(M,["b","r"]),Re=C.overflow||{},ze=Re.adjustX,Pe=Re.adjustY,Ne=Re.shiftX,Ie=Re.shiftY,Le=function(e){return"boolean"==typeof e?e:e>=0};function St(){we=M.y+Ae,Se=we+I,xe=M.x+ye,Ce=xe+L}St();var je=Le(Pe),_e=me[0]===ve[0];if(je&&"t"===me[0]&&(Se>Y.bottom||v.current.bt)){var He=Ae;_e?He-=I-j:He=Me.y-Te.y-ie;var De=wt(ye,He),Be=wt(ye,He,G);De>ke||De===ke&&(!X||Be>=Ee)?(v.current.bt=!0,Ae=He,ie=-ie,be.points=[dt(me,0),dt(ve,0)]):v.current.bt=!1}if(je&&"b"===me[0]&&(weke||Fe===ke&&(!X||Xe>=Ee)?(v.current.tb=!0,Ae=We,ie=-ie,be.points=[dt(me,0),dt(ve,0)]):v.current.tb=!1}var Ke=Le(ze),Ge=me[1]===ve[1];if(Ke&&"l"===me[1]&&(Ce>Y.right||v.current.rl)){var qe=ye;Ge?qe-=L-_:qe=Me.x-Te.x-oe;var Ye=wt(qe,Ae),Ue=wt(qe,Ae,G);Ye>ke||Ye===ke&&(!X||Ue>=Ee)?(v.current.rl=!0,ye=qe,oe=-oe,be.points=[dt(me,1),dt(ve,1)]):v.current.rl=!1}if(Ke&&"r"===me[1]&&(xeke||Qe===ke&&(!X||Ze>=Ee)?(v.current.lr=!0,ye=Ve,oe=-oe,be.points=[dt(me,1),dt(ve,1)]):v.current.lr=!1}St();var et=!0===Ne?0:Ne;"number"==typeof et&&(xeG.right&&(ye-=Ce-G.right-oe,s.x>G.right-et&&(ye+=s.x-G.right+et)));var tt=!0===Ie?0:Ie;"number"==typeof tt&&(weG.bottom&&(Ae-=Se-G.bottom-ie,s.y>G.bottom-tt&&(Ae+=s.y-G.bottom+tt)));var rt=M.x+ye,it=rt+L,lt=M.y+Ae,ft=lt+I,pt=s.x,vt=pt+_,mt=s.y,ht=mt+j,gt=(Math.max(rt,pt)+Math.min(it,vt))/2-rt,bt=(Math.max(lt,mt)+Math.min(ft,ht))/2-lt;null==l||l(t,be);var yt=U.right-M.x-(ye+M.width),At=U.bottom-M.y-(Ae+M.height);d({ready:!0,offsetX:ye/V,offsetY:Ae/Q,offsetR:yt/V,offsetB:At/Q,arrowX:gt/V,arrowY:bt/Q,scaleX:V,scaleY:Q,align:be})}})),h=function(){d((function(e){return(0,ee.A)((0,ee.A)({},e),{},{ready:!1})}))};return(0,ze.A)(h,[o]),(0,ze.A)((function(){e||h()}),[e]),[u.ready,u.offsetX,u.offsetY,u.offsetR,u.offsetB,u.arrowX,u.arrowY,u.scaleX,u.scaleY,u.align,function(){f.current+=1;var e=f.current;Promise.resolve().then((function(){f.current===e&&m()}))}]}(_e,me,D?At:we,R,P,N,W),Ct=(0,te.A)(xt,11),kt=Ct[0],Et=Ct[1],Mt=Ct[2],$t=Ct[3],Ot=Ct[4],Tt=Ct[5],Rt=Ct[6],zt=Ct[7],Pt=Ct[8],Nt=Ct[9],It=Ct[10],Lt=function(e,t,n,o){return r.useMemo((function(){var r=Ze(null!=n?n:t),i=Ze(null!=o?o:t),a=new Set(r),l=new Set(i);return e&&(a.has("hover")&&(a.delete("hover"),a.add("click")),l.has("hover")&&(l.delete("hover"),l.add("click"))),[a,l]}),[e,t,n,o])}(ae,s,u,d),jt=(0,te.A)(Lt,2),_t=jt[0],Ht=jt[1],Dt=_t.has("click"),Bt=Ht.has("click")||Ht.has("contextMenu"),Wt=(0,Ee.A)((function(){lt||It()}));!function(e,t,n,r,o){(0,ze.A)((function(){if(e&&t&&n){var i=n,a=rt(t),l=rt(i),c=nt(i),s=new Set([c].concat((0,H.A)(a),(0,H.A)(l)));function u(){r(),o()}return s.forEach((function(e){e.addEventListener("scroll",u,{passive:!0})})),c.addEventListener("resize",u,{passive:!0}),r(),function(){s.forEach((function(e){e.removeEventListener("scroll",u),c.removeEventListener("resize",u)}))}}}),[e,t,n])}(_e,we,me,Wt,(function(){De.current&&D&&Bt&&qe(!1)})),(0,ze.A)((function(){Wt()}),[At,R]),(0,ze.A)((function(){!_e||null!=P&&P[R]||Wt()}),[JSON.stringify(N)]);var Ft=r.useMemo((function(){var e=function(e,t,n,r){for(var o=n.points,i=Object.keys(e),a=0;a1?a-1:0),c=1;c1?n-1:0),o=1;o1?n-1:0),o=1;oh,ge=(0,r.useMemo)((function(){var e=l;return ve?e=null===O&&k?l:l.slice(0,Math.min(l.length,R/f)):"number"==typeof h&&(e=l.slice(0,h)),e}),[l,f,O,h,ve]),be=(0,r.useMemo)((function(){return ve?l.slice(ae+1):l.slice(ge.length)}),[l,ge,ve,ae]),ye=(0,r.useCallback)((function(e,t){var n;return"function"==typeof u?u(e):null!==(n=u&&(null==e?void 0:e[u]))&&void 0!==n?n:t}),[u]),Ae=(0,r.useCallback)(c||function(e){return e},[c]);function we(e,t,n){(oe!==e||void 0!==t&&t!==Q)&&(ie(e),n||(ue(eR){we(r-1,e-o-q+F);break}}y&&xe(0)+q>R&&Z(null)}}),[R,I,F,q,ye,ge]);var Ce=se&&!!be.length,Ee={};null!==Q&&ve&&(Ee={position:"absolute",left:Q,top:0});var Me,$e={prefixCls:de,responsive:ve,component:S,invalidate:me},Oe=s?function(e,t){var n=ye(e,t);return r.createElement(zt.Provider,{key:n,value:(0,ee.A)((0,ee.A)({},$e),{},{order:t,item:e,itemKey:n,registerSize:Se,display:t<=ae})},s(e,t))}:function(e,t){var n=ye(e,t);return r.createElement($t,(0,P.A)({},$e,{order:t,key:n,item:e,renderItem:Ae,itemKey:n,registerSize:Se,display:t<=ae}))},Te={order:Ce?ae:Number.MAX_SAFE_INTEGER,className:"".concat(de,"-rest"),registerSize:function(e,t){X(t),D(F)},display:Ce};if(b)b&&(Me=r.createElement(zt.Provider,{value:(0,ee.A)((0,ee.A)({},$e),Te)},b(be)));else{var Re=g||Wt;Me=r.createElement($t,(0,P.A)({},$e,Te),"function"==typeof Re?Re(be):Re)}var Pe=r.createElement(w,(0,P.A)({className:i()(!me&&o,m),style:v,ref:t},C),ge.map(Oe),he?Me:null,y&&r.createElement($t,(0,P.A)({},$e,{responsive:pe,responsiveDisabled:!ve,order:ae,className:"".concat(de,"-suffix"),registerSize:function(e,t){Y(t)},display:!0,style:Ee}),y));return pe&&(Pe=r.createElement(ke,{onResize:function(e,t){T(t.clientWidth)},disabled:!ve},Pe)),Pe}var Xt=r.forwardRef(Ft);Xt.displayName="Overflow",Xt.Item=_t,Xt.RESPONSIVE=Dt,Xt.INVALIDATE=Bt;const Kt=Xt;var Gt=n(3210),qt=r.createContext(null);function Yt(e,t){return void 0===e?null:"".concat(e,"-").concat(t)}function Ut(e){return Yt(r.useContext(qt),e)}var Vt=n(8104),Qt=["children","locked"],Zt=r.createContext(null);function Jt(e){var t=e.children,n=e.locked,o=(0,re.A)(e,Qt),i=r.useContext(Zt),a=(0,Vt.A)((function(){return e=i,t=o,n=(0,ee.A)({},e),Object.keys(t).forEach((function(e){var r=t[e];void 0!==r&&(n[e]=r)})),n;var e,t,n}),[i,o],(function(e,t){return!(n||e[0]===t[0]&&(0,Gt.A)(e[1],t[1],!0))}));return r.createElement(Zt.Provider,{value:a},t)}var en=[],tn=r.createContext(null);function nn(){return r.useContext(tn)}var rn=r.createContext(en);function on(e){var t=r.useContext(rn);return r.useMemo((function(){return void 0!==e?[].concat((0,H.A)(t),[e]):t}),[t,e])}var an=r.createContext(null);const ln=r.createContext({});function cn(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(Je(e)){var n=e.nodeName.toLowerCase(),r=["input","select","textarea","button"].includes(n)||e.isContentEditable||"a"===n&&!!e.getAttribute("href"),o=e.getAttribute("tabindex"),i=Number(o),a=null;return o&&!Number.isNaN(i)?a=i:r&&null===a&&(a=0),r&&e.disabled&&(a=null),null!==a&&(a>=0||t&&a<0)}return!1}function sn(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=(0,H.A)(e.querySelectorAll("*")).filter((function(e){return cn(e,t)}));return cn(e,t)&&n.unshift(e),n}var un=vt.A.LEFT,dn=vt.A.RIGHT,fn=vt.A.UP,pn=vt.A.DOWN,vn=vt.A.ENTER,mn=vt.A.ESC,hn=vt.A.HOME,gn=vt.A.END,bn=[fn,pn,un,dn];function yn(e,t){return sn(e,!0).filter((function(e){return t.has(e)}))}function An(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;if(!e)return null;var o=yn(e,t),i=o.length,a=o.findIndex((function(e){return n===e}));return r<0?-1===a?a=i-1:a-=1:r>0&&(a+=1),o[a=(a+i)%i]}var wn=function(e,t){var n=new Set,r=new Map,o=new Map;return e.forEach((function(e){var i=document.querySelector("[data-menu-id='".concat(Yt(t,e),"']"));i&&(n.add(i),o.set(i,e),r.set(e,i))})),{elements:n,key2element:r,element2key:o}};function Sn(e,t,n,o,i,a,l,c,s,u){var d=r.useRef(),f=r.useRef();f.current=t;var p=function(){Me.A.cancel(d.current)};return r.useEffect((function(){return function(){p()}}),[]),function(r){var v=r.which;if([].concat(bn,[vn,mn,hn,gn]).includes(v)){var m=a(),h=wn(m,o),g=h,b=g.elements,y=g.key2element,A=g.element2key,w=function(e,t){for(var n=e||document.activeElement;n;){if(t.has(n))return n;n=n.parentElement}return null}(y.get(t),b),S=A.get(w),x=function(e,t,n,r){var o,i="prev",a="next",l="children",c="parent";if("inline"===e&&r===vn)return{inlineTrigger:!0};var s=(0,J.A)((0,J.A)({},fn,i),pn,a),u=(0,J.A)((0,J.A)((0,J.A)((0,J.A)({},un,n?a:i),dn,n?i:a),pn,l),vn,l),d=(0,J.A)((0,J.A)((0,J.A)((0,J.A)((0,J.A)((0,J.A)({},fn,i),pn,a),vn,l),mn,c),un,n?l:c),dn,n?c:l);switch(null===(o={inline:s,horizontal:u,vertical:d,inlineSub:s,horizontalSub:d,verticalSub:d}["".concat(e).concat(t?"":"Sub")])||void 0===o?void 0:o[r]){case i:return{offset:-1,sibling:!0};case a:return{offset:1,sibling:!0};case c:return{offset:-1,sibling:!1};case l:return{offset:1,sibling:!1};default:return null}}(e,1===l(S,!0).length,n,v);if(!x&&v!==hn&&v!==gn)return;(bn.includes(v)||[hn,gn].includes(v))&&r.preventDefault();var C=function(e){if(e){var t=e,n=e.querySelector("a");null!=n&&n.getAttribute("href")&&(t=n);var r=A.get(e);c(r),p(),d.current=(0,Me.A)((function(){f.current===r&&t.focus()}))}};if([hn,gn].includes(v)||x.sibling||!w){var k,E,M=yn(k=w&&"inline"!==e?function(e){for(var t=e;t;){if(t.getAttribute("data-menu-list"))return t;t=t.parentElement}return null}(w):i.current,b);E=v===hn?M[0]:v===gn?M[M.length-1]:An(k,b,w,x.offset),C(E)}else if(x.inlineTrigger)s(S);else if(x.offset>0)s(S,!0),p(),d.current=(0,Me.A)((function(){h=wn(m,o);var e=w.getAttribute("aria-controls"),t=An(document.getElementById(e),h.elements);C(t)}),5);else if(x.offset<0){var $=l(S,!0),O=$[$.length-2],T=y.get(O);s(O,!1),C(T)}}null==u||u(r)}}var xn="__RC_UTIL_PATH_SPLIT__",Cn=function(e){return e.join(xn)},kn="rc-menu-more";function En(){var e=r.useState({}),t=(0,te.A)(e,2)[1],n=(0,r.useRef)(new Map),o=(0,r.useRef)(new Map),i=r.useState([]),a=(0,te.A)(i,2),l=a[0],c=a[1],s=(0,r.useRef)(0),u=(0,r.useRef)(!1),d=(0,r.useCallback)((function(e,r){var i=Cn(r);o.current.set(i,e),n.current.set(e,i),s.current+=1;var a,l=s.current;a=function(){l===s.current&&(u.current||t({}))},Promise.resolve().then(a)}),[]),f=(0,r.useCallback)((function(e,t){var r=Cn(t);o.current.delete(r),n.current.delete(e)}),[]),p=(0,r.useCallback)((function(e){c(e)}),[]),v=(0,r.useCallback)((function(e,t){var r=n.current.get(e)||"",o=r.split(xn);return t&&l.includes(o[0])&&o.unshift(kn),o}),[l]),m=(0,r.useCallback)((function(e,t){return e.some((function(e){return v(e,!0).includes(t)}))}),[v]),h=(0,r.useCallback)((function(e){var t="".concat(n.current.get(e)).concat(xn),r=new Set;return(0,H.A)(o.current.keys()).forEach((function(e){e.startsWith(t)&&r.add(o.current.get(e))})),r}),[]);return r.useEffect((function(){return function(){u.current=!0}}),[]),{registerPath:d,unregisterPath:f,refreshOverflowKeys:p,isSubPathKey:m,getKeyPath:v,getKeys:function(){var e=(0,H.A)(n.current.keys());return l.length&&e.push(kn),e},getSubPathKeys:h}}function Mn(e){var t=r.useRef(e);t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o1&&(y.motionAppear=!1);var A=y.onVisibleChanged;return y.onVisibleChanged=function(e){return p.current||e||g(!0),null==A?void 0:A(e)},h?null:r.createElement(Jt,{mode:a,locked:!p.current},r.createElement(Xe.Ay,(0,P.A)({visible:b},y,{forceRender:s,removeOnLeave:!1,leavedClassName:"".concat(c,"-hidden")}),(function(e){var n=e.className,o=e.style;return r.createElement(Kn,{id:t,className:n,style:o},i)})))}var er=["style","className","title","eventKey","warnKey","disabled","internalPopupClose","children","itemIcon","expandIcon","popupClassName","popupOffset","popupStyle","onClick","onMouseEnter","onMouseLeave","onTitleClick","onTitleMouseEnter","onTitleMouseLeave"],tr=["active"],nr=function(e){var t=e.style,n=e.className,o=e.title,a=e.eventKey,l=(e.warnKey,e.disabled),c=e.internalPopupClose,s=e.children,u=e.itemIcon,d=e.expandIcon,f=e.popupClassName,p=e.popupOffset,v=e.popupStyle,m=e.onClick,h=e.onMouseEnter,g=e.onMouseLeave,b=e.onTitleClick,y=e.onTitleMouseEnter,A=e.onTitleMouseLeave,w=(0,re.A)(e,er),S=Ut(a),x=r.useContext(Zt),C=x.prefixCls,k=x.mode,E=x.openKeys,M=x.disabled,$=x.overflowDisabled,O=x.activeKey,T=x.selectedKeys,R=x.itemIcon,z=x.expandIcon,N=x.onItemClick,I=x.onOpenChange,L=x.onActive,j=r.useContext(ln)._internalRenderSubMenuItem,_=r.useContext(an).isSubPathKey,H=on(),D="".concat(C,"-submenu"),B=M||l,W=r.useRef(),F=r.useRef();var X=null!=u?u:R,K=null!=d?d:z,G=E.includes(a),q=!$&&G,Y=_(T,a),U=Tn(a,B,y,A),V=U.active,Q=(0,re.A)(U,tr),Z=r.useState(!1),ne=(0,te.A)(Z,2),oe=ne[0],ie=ne[1],ae=function(e){B||ie(e)},le=r.useMemo((function(){return V||"inline"!==k&&(oe||_([O],a))}),[k,V,O,oe,a,_]),ce=Rn(H.length),se=Mn((function(e){null==m||m(Nn(e)),N(e)})),ue=S&&"".concat(S,"-popup"),de=r.createElement("div",(0,P.A)({role:"menuitem",style:ce,className:"".concat(D,"-title"),tabIndex:B?null:-1,ref:W,title:"string"==typeof o?o:null,"data-menu-id":$&&S?null:S,"aria-expanded":q,"aria-haspopup":!0,"aria-controls":ue,"aria-disabled":B,onClick:function(e){B||(null==b||b({key:a,domEvent:e}),"inline"===k&&I(a,!G))},onFocus:function(){L(a)}},Q),o,r.createElement(zn,{icon:"horizontal"!==k?K:void 0,props:(0,ee.A)((0,ee.A)({},e),{},{isOpen:q,isSubMenu:!0})},r.createElement("i",{className:"".concat(D,"-arrow")}))),fe=r.useRef(k);if("inline"!==k&&H.length>1?fe.current="vertical":fe.current=k,!$){var pe=fe.current;de=r.createElement(Zn,{mode:pe,prefixCls:D,visible:!c&&q&&"inline"!==k,popupClassName:f,popupOffset:p,popupStyle:v,popup:r.createElement(Jt,{mode:"horizontal"===pe?"vertical":pe},r.createElement(Kn,{id:ue,ref:F},s)),disabled:B,onVisibleChange:function(e){"inline"!==k&&I(a,e)}},de)}var ve=r.createElement(Kt.Item,(0,P.A)({role:"none"},w,{component:"li",style:t,className:i()(D,"".concat(D,"-").concat(k),n,(0,J.A)((0,J.A)((0,J.A)((0,J.A)({},"".concat(D,"-open"),q),"".concat(D,"-active"),le),"".concat(D,"-selected"),Y),"".concat(D,"-disabled"),B)),onMouseEnter:function(e){ae(!0),null==h||h({key:a,domEvent:e})},onMouseLeave:function(e){ae(!1),null==g||g({key:a,domEvent:e})}}),de,!$&&r.createElement(Jn,{id:ue,open:q,keyPath:H},s));return j&&(ve=j(ve,e,{selected:Y,active:le,open:q,disabled:B})),r.createElement(Jt,{onItemClick:se,mode:"horizontal"===k?"vertical":k,itemIcon:X,expandIcon:K},ve)};function rr(e){var t,n=e.eventKey,o=e.children,i=on(n),a=Gn(o,i),l=nn();return r.useEffect((function(){if(l)return l.registerPath(n,i),function(){l.unregisterPath(n,i)}}),[i]),t=l?a:r.createElement(nr,e,a),r.createElement(rn.Provider,{value:i},t)}var or=["className","title","eventKey","children"],ir=["children"],ar=function(e){var t=e.className,n=e.title,o=(e.eventKey,e.children),a=(0,re.A)(e,or),l=r.useContext(Zt).prefixCls,c="".concat(l,"-item-group");return r.createElement("li",(0,P.A)({role:"presentation"},a,{onClick:function(e){return e.stopPropagation()},className:i()(c,t)}),r.createElement("div",{role:"presentation",className:"".concat(c,"-title"),title:"string"==typeof n?n:void 0},n),r.createElement("ul",{role:"group",className:"".concat(c,"-list")},o))};function lr(e){var t=e.children,n=(0,re.A)(e,ir),o=Gn(t,on(n.eventKey));return nn()?o:r.createElement(ar,(0,a.A)(n,["warnKey"]),o)}function cr(e){var t=e.className,n=e.style,o=r.useContext(Zt).prefixCls;return nn()?null:r.createElement("li",{role:"separator",className:i()("".concat(o,"-item-divider"),t),style:n})}var sr=["label","children","key","type"];function ur(e){return(e||[]).map((function(e,t){if(e&&"object"===(0,ne.A)(e)){var n=e,o=n.label,i=n.children,a=n.key,l=n.type,c=(0,re.A)(n,sr),s=null!=a?a:"tmp-".concat(t);return i||"group"===l?"group"===l?r.createElement(lr,(0,P.A)({key:s},c,{title:o}),ur(i)):r.createElement(rr,(0,P.A)({key:s},c,{title:o}),ur(i)):"divider"===l?r.createElement(cr,(0,P.A)({key:s},c)):r.createElement(Bn,(0,P.A)({key:s},c),o)}return null})).filter((function(e){return e}))}function dr(e,t,n){var r=e;return t&&(r=ur(t)),Gn(r,n)}var fr=["prefixCls","rootClassName","style","className","tabIndex","items","children","direction","id","mode","inlineCollapsed","disabled","disabledOverflow","subMenuOpenDelay","subMenuCloseDelay","forceSubMenuRender","defaultOpenKeys","openKeys","activeKey","defaultActiveFirst","selectable","multiple","defaultSelectedKeys","selectedKeys","onSelect","onDeselect","inlineIndent","motion","defaultMotions","triggerSubMenuAction","builtinPlacements","itemIcon","expandIcon","overflowedIndicator","overflowedIndicatorPopupClassName","getPopupContainer","onClick","onOpenChange","onKeyDown","openAnimation","openTransitionName","_internalRenderMenuItem","_internalRenderSubMenuItem"],pr=[],vr=r.forwardRef((function(e,t){var n,o=e,a=o.prefixCls,l=void 0===a?"rc-menu":a,c=o.rootClassName,s=o.style,u=o.className,d=o.tabIndex,f=void 0===d?0:d,p=o.items,v=o.children,m=o.direction,h=o.id,g=o.mode,b=void 0===g?"vertical":g,y=o.inlineCollapsed,A=o.disabled,w=o.disabledOverflow,S=o.subMenuOpenDelay,x=void 0===S?.1:S,C=o.subMenuCloseDelay,k=void 0===C?.1:C,E=o.forceSubMenuRender,M=o.defaultOpenKeys,$=o.openKeys,O=o.activeKey,T=o.defaultActiveFirst,R=o.selectable,z=void 0===R||R,N=o.multiple,I=void 0!==N&&N,L=o.defaultSelectedKeys,j=o.selectedKeys,_=o.onSelect,D=o.onDeselect,B=o.inlineIndent,W=void 0===B?24:B,F=o.motion,X=o.defaultMotions,K=o.triggerSubMenuAction,G=void 0===K?"hover":K,q=o.builtinPlacements,Y=o.itemIcon,U=o.expandIcon,V=o.overflowedIndicator,Q=void 0===V?"...":V,Z=o.overflowedIndicatorPopupClassName,ne=o.getPopupContainer,ie=o.onClick,ae=o.onOpenChange,le=o.onKeyDown,ce=(o.openAnimation,o.openTransitionName,o._internalRenderMenuItem),se=o._internalRenderSubMenuItem,ue=(0,re.A)(o,fr),de=r.useMemo((function(){return dr(v,p,pr)}),[v,p]),fe=r.useState(!1),pe=(0,te.A)(fe,2),ve=pe[0],me=pe[1],he=r.useRef(),ge=function(e){var t=(0,oe.A)(e,{value:e}),n=(0,te.A)(t,2),o=n[0],i=n[1];return r.useEffect((function(){On+=1;var e="".concat($n,"-").concat(On);i("rc-menu-uuid-".concat(e))}),[]),o}(h),be="rtl"===m;var ye=(0,oe.A)(M,{value:$,postState:function(e){return e||pr}}),Ae=(0,te.A)(ye,2),we=Ae[0],Se=Ae[1],xe=function(e){function t(){Se(e),null==ae||ae(e)}arguments.length>1&&void 0!==arguments[1]&&arguments[1]?(0,Ot.flushSync)(t):t()},Ce=r.useState(we),ke=(0,te.A)(Ce,2),Ee=ke[0],Me=ke[1],$e=r.useRef(!1),Oe=r.useMemo((function(){return"inline"!==b&&"vertical"!==b||!y?[b,!1]:["vertical",y]}),[b,y]),Te=(0,te.A)(Oe,2),Re=Te[0],ze=Te[1],Pe="inline"===Re,Ne=r.useState(Re),Ie=(0,te.A)(Ne,2),Le=Ie[0],je=Ie[1],_e=r.useState(ze),He=(0,te.A)(_e,2),De=He[0],Be=He[1];r.useEffect((function(){je(Re),Be(ze),$e.current&&(Pe?Se(Ee):xe(pr))}),[Re,ze]);var We=r.useState(0),Fe=(0,te.A)(We,2),Xe=Fe[0],Ke=Fe[1],Ge=Xe>=de.length-1||"horizontal"!==Le||w;r.useEffect((function(){Pe&&Me(we)}),[we]),r.useEffect((function(){return $e.current=!0,function(){$e.current=!1}}),[]);var qe=En(),Ye=qe.registerPath,Ue=qe.unregisterPath,Ve=qe.refreshOverflowKeys,Qe=qe.isSubPathKey,Ze=qe.getKeyPath,Je=qe.getKeys,et=qe.getSubPathKeys,tt=r.useMemo((function(){return{registerPath:Ye,unregisterPath:Ue}}),[Ye,Ue]),nt=r.useMemo((function(){return{isSubPathKey:Qe}}),[Qe]);r.useEffect((function(){Ve(Ge?pr:de.slice(Xe+1).map((function(e){return e.key})))}),[Xe,Ge]);var rt=(0,oe.A)(O||T&&(null===(n=de[0])||void 0===n?void 0:n.key),{value:O}),ot=(0,te.A)(rt,2),it=ot[0],at=ot[1],lt=Mn((function(e){at(e)})),ct=Mn((function(){at(void 0)}));(0,r.useImperativeHandle)(t,(function(){return{list:he.current,focus:function(e){var t,n,r=Je(),o=wn(r,ge),i=o.elements,a=o.key2element,l=o.element2key,c=yn(he.current,i),s=null!=it?it:c[0]?l.get(c[0]):null===(t=de.find((function(e){return!e.props.disabled})))||void 0===t?void 0:t.key,u=a.get(s);s&&u&&(null==u||null===(n=u.focus)||void 0===n||n.call(u,e))}}}));var st=(0,oe.A)(L||[],{value:j,postState:function(e){return Array.isArray(e)?e:null==e?pr:[e]}}),ut=(0,te.A)(st,2),dt=ut[0],ft=ut[1],pt=Mn((function(e){null==ie||ie(Nn(e)),function(e){if(z){var t,n=e.key,r=dt.includes(n);t=I?r?dt.filter((function(e){return e!==n})):[].concat((0,H.A)(dt),[n]):[n],ft(t);var o=(0,ee.A)((0,ee.A)({},e),{},{selectedKeys:t});r?null==D||D(o):null==_||_(o)}!I&&we.length&&"inline"!==Le&&xe(pr)}(e)})),vt=Mn((function(e,t){var n=we.filter((function(t){return t!==e}));if(t)n.push(e);else if("inline"!==Le){var r=et(e);n=n.filter((function(e){return!r.has(e)}))}(0,Gt.A)(we,n,!0)||xe(n,!0)})),mt=Sn(Le,it,be,ge,he,Je,Ze,at,(function(e,t){var n=null!=t?t:!we.includes(e);vt(e,n)}),le);r.useEffect((function(){me(!0)}),[]);var ht=r.useMemo((function(){return{_internalRenderMenuItem:ce,_internalRenderSubMenuItem:se}}),[ce,se]),gt="horizontal"!==Le||w?de:de.map((function(e,t){return r.createElement(Jt,{key:e.key,overflowDisabled:t>Xe},e)})),bt=r.createElement(Kt,(0,P.A)({id:h,ref:he,prefixCls:"".concat(l,"-overflow"),component:"ul",itemComponent:Bn,className:i()(l,"".concat(l,"-root"),"".concat(l,"-").concat(Le),u,(0,J.A)((0,J.A)({},"".concat(l,"-inline-collapsed"),De),"".concat(l,"-rtl"),be),c),dir:m,style:s,role:"menu",tabIndex:f,data:gt,renderRawItem:function(e){return e},renderRawRest:function(e){var t=e.length,n=t?de.slice(-t):null;return r.createElement(rr,{eventKey:kn,title:Q,disabled:Ge,internalPopupClose:0===t,popupClassName:Z},n)},maxCount:"horizontal"!==Le||w?Kt.INVALIDATE:Kt.RESPONSIVE,ssr:"full","data-menu-list":!0,onVisibleChange:function(e){Ke(e)},onKeyDown:mt},ue));return r.createElement(ln.Provider,{value:ht},r.createElement(qt.Provider,{value:ge},r.createElement(Jt,{prefixCls:l,rootClassName:c,mode:Le,openKeys:we,rtl:be,disabled:A,motion:ve?F:null,defaultMotions:ve?X:null,activeKey:it,onActive:lt,onInactive:ct,selectedKeys:dt,inlineIndent:W,subMenuOpenDelay:x,subMenuCloseDelay:k,forceSubMenuRender:E,builtinPlacements:q,triggerSubMenuAction:G,getPopupContainer:ne,itemIcon:Y,expandIcon:U,onItemClick:pt,onOpenChange:vt},r.createElement(an.Provider,{value:nt},bt),r.createElement("div",{style:{display:"none"},"aria-hidden":!0},r.createElement(tn.Provider,{value:tt},de)))))}));var mr=vr;mr.Item=Bn,mr.SubMenu=rr,mr.ItemGroup=lr,mr.Divider=cr;const hr=mr;var gr=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.id,a=e.tabs,l=e.locale,c=e.mobile,s=e.moreIcon,u=void 0===s?"More":s,d=e.moreTransitionName,f=e.style,p=e.className,v=e.editable,m=e.tabBarGutter,h=e.rtl,g=e.removeAriaLabel,b=e.onTabClick,y=e.getPopupContainer,A=e.popupClassName,w=(0,r.useState)(!1),S=(0,te.A)(w,2),x=S[0],C=S[1],k=(0,r.useState)(null),E=(0,te.A)(k,2),M=E[0],$=E[1],O="".concat(o,"-more-popup"),T="".concat(n,"-dropdown"),R=null!==M?"".concat(O,"-").concat(M):null,z=null==l?void 0:l.dropdownAriaLabel;var P=r.createElement(hr,{onClick:function(e){var t=e.key,n=e.domEvent;b(t,n),C(!1)},prefixCls:"".concat(T,"-menu"),id:O,tabIndex:-1,role:"listbox","aria-activedescendant":R,selectedKeys:[M],"aria-label":void 0!==z?z:"expanded dropdown"},a.map((function(e){var t=e.closable,n=e.disabled,i=e.closeIcon,a=e.key,l=e.label,c=je(t,i,v,n);return r.createElement(Bn,{key:a,id:"".concat(O,"-").concat(a),role:"option","aria-controls":o&&"".concat(o,"-panel-").concat(a),disabled:n},r.createElement("span",null,l),c&&r.createElement("button",{type:"button","aria-label":g||"remove",tabIndex:0,className:"".concat(T,"-menu-item-remove"),onClick:function(e){e.stopPropagation(),function(e,t){e.preventDefault(),e.stopPropagation(),v.onEdit("remove",{key:t,event:e})}(e,a)}},i||v.removeIcon||"\xd7"))})));function N(e){for(var t=a.filter((function(e){return!e.disabled})),n=t.findIndex((function(e){return e.key===M}))||0,r=t.length,o=0;ot?"left":"right"})})),R=(0,te.A)(T,2),z=R[0],N=R[1],I=Te(0,(function(e,t){!O&&g&&g({direction:e>t?"top":"bottom"})})),L=(0,te.A)(I,2),j=L[0],_=L[1],D=(0,r.useState)([0,0]),B=(0,te.A)(D,2),W=B[0],F=B[1],X=(0,r.useState)([0,0]),K=(0,te.A)(X,2),G=K[0],q=K[1],Y=(0,r.useState)([0,0]),U=(0,te.A)(Y,2),V=U[0],Q=U[1],Z=(0,r.useState)([0,0]),ne=(0,te.A)(Z,2),re=ne[0],oe=ne[1],ie=function(e){var t=(0,r.useRef)([]),n=(0,r.useState)({}),o=(0,te.A)(n,2)[1],i=(0,r.useRef)("function"==typeof e?e():e),a=Pe((function(){var e=i.current;t.current.forEach((function(t){e=t(e)})),t.current=[],i.current=e,o({})}));return[i.current,function(e){t.current.push(e),a()}]}(new Map),le=(0,te.A)(ie,2),ce=le[0],se=le[1],ue=function(e,t,n){return(0,r.useMemo)((function(){for(var n,r=new Map,o=t.get(null===(n=e[0])||void 0===n?void 0:n.key)||Oe,i=o.left+o.width,a=0;aAe?Ae:e}O&&s?(ye=0,Ae=Math.max(0,pe-ge)):(ye=Math.min(0,ge-pe),Ae=0);var Se=(0,r.useRef)(null),xe=(0,r.useState)(),Ce=(0,te.A)(xe,2),Me=Ce[0],ze=Ce[1];function je(){ze(Date.now())}function _e(){Se.current&&clearTimeout(Se.current)}!function(e,t){var n=(0,r.useState)(),o=(0,te.A)(n,2),i=o[0],a=o[1],l=(0,r.useState)(0),c=(0,te.A)(l,2),s=c[0],u=c[1],d=(0,r.useState)(0),f=(0,te.A)(d,2),p=f[0],v=f[1],m=(0,r.useState)(),h=(0,te.A)(m,2),g=h[0],b=h[1],y=(0,r.useRef)(),A=(0,r.useRef)(),w=(0,r.useRef)(null);w.current={onTouchStart:function(e){var t=e.touches[0],n=t.screenX,r=t.screenY;a({x:n,y:r}),window.clearInterval(y.current)},onTouchMove:function(e){if(i){e.preventDefault();var n=e.touches[0],r=n.screenX,o=n.screenY;a({x:r,y:o});var l=r-i.x,c=o-i.y;t(l,c);var d=Date.now();u(d),v(d-s),b({x:l,y:c})}},onTouchEnd:function(){if(i&&(a(null),b(null),g)){var e=g.x/p,n=g.y/p,r=Math.abs(e),o=Math.abs(n);if(Math.max(r,o)<.1)return;var l=e,c=n;y.current=window.setInterval((function(){Math.abs(l)<.01&&Math.abs(c)<.01?window.clearInterval(y.current):t(20*(l*=Re),20*(c*=Re))}),20)}},onWheel:function(e){var n=e.deltaX,r=e.deltaY,o=0,i=Math.abs(n),a=Math.abs(r);i===a?o="x"===A.current?n:r:i>a?(o=n,A.current="x"):(o=r,A.current="y"),t(-o,-o)&&e.preventDefault()}},r.useEffect((function(){function t(e){w.current.onTouchMove(e)}function n(e){w.current.onTouchEnd(e)}return document.addEventListener("touchmove",t,{passive:!1}),document.addEventListener("touchend",n,{passive:!1}),e.current.addEventListener("touchstart",(function(e){w.current.onTouchStart(e)}),{passive:!1}),e.current.addEventListener("wheel",(function(e){w.current.onWheel(e)})),function(){document.removeEventListener("touchmove",t),document.removeEventListener("touchend",n)}}),[])}(k,(function(e,t){function n(e,t){e((function(e){return we(e+t)}))}return!!he&&(O?n(N,e):n(_,t),_e(),je(),!0)})),(0,r.useEffect)((function(){return _e(),Me&&(Se.current=setTimeout((function(){ze(0)}),100)),_e}),[Me]);var Be=function(e,t,n,o,i,a,l){var c,s,u,d=l.tabs,f=l.tabPosition,p=l.rtl;return["top","bottom"].includes(f)?(c="width",s=p?"right":"left",u=Math.abs(n)):(c="height",s="top",u=-n),(0,r.useMemo)((function(){if(!d.length)return[0,0];for(var n=d.length,r=n,o=0;ou+t){r=o-1;break}}for(var a=0,l=n-1;l>=0;l-=1)if((e.get(d[l].key)||Ne)[s]=r?[0,0]:[a,r]}),[e,t,o,i,a,u,f,d.map((function(e){return e.key})).join("_"),p])}(ue,ge,O?z:j,pe,ve,me,(0,ee.A)((0,ee.A)({},e),{},{tabs:w})),We=(0,te.A)(Be,2),Fe=We[0],Xe=We[1],Ke=(0,Ee.A)((function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:c,t=ue.get(e)||{width:0,height:0,left:0,right:0,top:0};if(O){var n=z;s?t.rightz+ge&&(n=t.right+t.width-ge):t.left<-z?n=-t.left:t.left+t.width>-z+ge&&(n=-(t.left+t.width-ge)),_(0),N(we(n))}else{var r=j;t.top<-j?r=-t.top:t.top+t.height>-j+ge&&(r=-(t.top+t.height-ge)),N(0),_(we(r))}})),Ge={};"top"===p||"bottom"===p?Ge[s?"marginRight":"marginLeft"]=v:Ge.marginTop=v;var qe=w.map((function(e,t){var n=e.key;return r.createElement(yr,{id:a,prefixCls:A,key:n,tab:e,style:0===t?void 0:Ge,closable:e.closable,editable:d,active:n===c,renderWrapper:m,removeAriaLabel:null==f?void 0:f.removeAriaLabel,onClick:function(e){h(n,e)},onFocus:function(){Ke(n),je(),k.current&&(s||(k.current.scrollLeft=0),k.current.scrollTop=0)}})})),Ye=function(){return se((function(){var e,t=new Map,n=null===(e=E.current)||void 0===e?void 0:e.getBoundingClientRect();return w.forEach((function(e){var r,o=e.key,i=null===(r=E.current)||void 0===r?void 0:r.querySelector('[data-node-key="'.concat(Le(o),'"]'));if(i){var a=function(e,t){var n=e.offsetWidth,r=e.offsetHeight,o=e.offsetTop,i=e.offsetLeft,a=e.getBoundingClientRect(),l=a.width,c=a.height,s=a.x,u=a.y;return Math.abs(l-n)<1?[l,c,s-t.x,u-t.y]:[n,r,i,o]}(i,n),l=(0,te.A)(a,4),c=l[0],s=l[1],u=l[2],d=l[3];t.set(o,{width:c,height:s,left:u,top:d})}})),t}))};(0,r.useEffect)((function(){Ye()}),[w.map((function(e){return e.key})).join("_")]);var Ue=Pe((function(){var e=Ar(S),t=Ar(x),n=Ar(C);F([e[0]-t[0]-n[0],e[1]-t[1]-n[1]]);var r=Ar($);Q(r);var o=Ar(M);oe(o);var i=Ar(E);q([i[0]-r[0],i[1]-r[1]]),Ye()})),Ve=w.slice(0,Fe),Qe=w.slice(Xe+1),Ze=[].concat((0,H.A)(Ve),(0,H.A)(Qe)),Je=ue.get(c),et=$e({activeTabOffset:Je,horizontal:O,indicator:b,rtl:s}).style;(0,r.useEffect)((function(){Ke()}),[c,ye,Ae,Ie(Je),Ie(ue),O]),(0,r.useEffect)((function(){Ue()}),[s]);var tt,nt,rt,ot,it=!!Ze.length,at="".concat(A,"-nav-wrap");return O?s?(nt=z>0,tt=z!==Ae):(tt=z<0,nt=z!==ye):(rt=j<0,ot=j!==ye),r.createElement(ke,{onResize:Ue},r.createElement("div",{ref:(0,de.xK)(t,S),role:"tablist",className:i()("".concat(A,"-nav"),n),style:o,onKeyDown:function(){je()}},r.createElement(De,{ref:x,position:"left",extra:u,prefixCls:A}),r.createElement(ke,{onResize:Ue},r.createElement("div",{className:i()(at,(0,J.A)((0,J.A)((0,J.A)((0,J.A)({},"".concat(at,"-ping-left"),tt),"".concat(at,"-ping-right"),nt),"".concat(at,"-ping-top"),rt),"".concat(at,"-ping-bottom"),ot)),ref:k},r.createElement(ke,{onResize:Ue},r.createElement("div",{ref:E,className:"".concat(A,"-nav-list"),style:{transform:"translate(".concat(z,"px, ").concat(j,"px)"),transition:Me?"none":void 0}},qe,r.createElement(He,{ref:$,prefixCls:A,locale:f,editable:d,style:(0,ee.A)((0,ee.A)({},0===qe.length?void 0:Ge),{},{visibility:it?"hidden":null})}),r.createElement("div",{className:i()("".concat(A,"-ink-bar"),(0,J.A)({},"".concat(A,"-ink-bar-animated"),l.inkBar)),style:et}))))),r.createElement(br,(0,P.A)({},e,{removeAriaLabel:null==f?void 0:f.removeAriaLabel,ref:M,prefixCls:A,tabs:Ze,className:!it&&be,tabMoving:!!Me})),r.createElement(De,{ref:C,position:"right",extra:u,prefixCls:A})))}));const xr=Sr;var Cr=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.className,a=e.style,l=e.id,c=e.active,s=e.tabKey,u=e.children;return r.createElement("div",{id:l&&"".concat(l,"-panel-").concat(s),role:"tabpanel",tabIndex:c?0:-1,"aria-labelledby":l&&"".concat(l,"-tab-").concat(s),"aria-hidden":!c,style:a,className:i()(n,c&&"".concat(n,"-active"),o),ref:t},u)}));const kr=Cr;var Er=["renderTabBar"],Mr=["label","key"];const $r=function(e){var t=e.renderTabBar,n=(0,re.A)(e,Er),o=r.useContext(ae).tabs;return t?t((0,ee.A)((0,ee.A)({},n),{},{panes:o.map((function(e){var t=e.label,n=e.key,o=(0,re.A)(e,Mr);return r.createElement(kr,(0,P.A)({tab:t,key:n,tabKey:n},o))}))}),xr):r.createElement(xr,n)};var Or=["key","forceRender","style","className","destroyInactiveTabPane"];const Tr=function(e){var t=e.id,n=e.activeKey,o=e.animated,a=e.tabPosition,l=e.destroyInactiveTabPane,c=r.useContext(ae),s=c.prefixCls,u=c.tabs,d=o.tabPane,f="".concat(s,"-tabpane");return r.createElement("div",{className:i()("".concat(s,"-content-holder"))},r.createElement("div",{className:i()("".concat(s,"-content"),"".concat(s,"-content-").concat(a),(0,J.A)({},"".concat(s,"-content-animated"),d))},u.map((function(e){var a=e.key,c=e.forceRender,s=e.style,u=e.className,p=e.destroyInactiveTabPane,v=(0,re.A)(e,Or),m=a===n;return r.createElement(Xe.Ay,(0,P.A)({key:a,visible:m,forceRender:c,removeOnLeave:!(!l&&!p),leavedClassName:"".concat(f,"-hidden")},o.tabPaneMotion),(function(e,n){var o=e.style,l=e.className;return r.createElement(kr,(0,P.A)({},v,{prefixCls:f,id:t,tabKey:a,animated:d,active:m,style:(0,ee.A)((0,ee.A)({},s),o),className:i()(u,l),ref:n}))}))}))))};var Rr=["id","prefixCls","className","items","direction","activeKey","defaultActiveKey","editable","animated","tabPosition","tabBarGutter","tabBarStyle","tabBarExtraContent","locale","moreIcon","moreTransitionName","destroyInactiveTabPane","renderTabBar","onChange","onTabClick","onTabScroll","getPopupContainer","popupClassName","indicator"],zr=0;const Pr=r.forwardRef((function(e,t){var n=e.id,o=e.prefixCls,a=void 0===o?"rc-tabs":o,l=e.className,c=e.items,s=e.direction,u=e.activeKey,d=e.defaultActiveKey,f=e.editable,p=e.animated,v=e.tabPosition,m=void 0===v?"top":v,h=e.tabBarGutter,g=e.tabBarStyle,b=e.tabBarExtraContent,y=e.locale,A=e.moreIcon,w=e.moreTransitionName,S=e.destroyInactiveTabPane,x=e.renderTabBar,C=e.onChange,k=e.onTabClick,E=e.onTabScroll,M=e.getPopupContainer,$=e.popupClassName,O=e.indicator,T=(0,re.A)(e,Rr),R=r.useMemo((function(){return(c||[]).filter((function(e){return e&&"object"===(0,ne.A)(e)&&"key"in e}))}),[c]),z="rtl"===s,N=function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{inkBar:!0,tabPane:!1};return(e=!1===t?{inkBar:!1,tabPane:!1}:!0===t?{inkBar:!0,tabPane:!1}:(0,ee.A)({inkBar:!0},"object"===(0,ne.A)(t)?t:{})).tabPaneMotion&&void 0===e.tabPane&&(e.tabPane=!0),!e.tabPaneMotion&&e.tabPane&&(e.tabPane=!1),e}(p),I=(0,r.useState)(!1),L=(0,te.A)(I,2),j=L[0],_=L[1];(0,r.useEffect)((function(){_(ie())}),[]);var H=(0,oe.A)((function(){var e;return null===(e=R[0])||void 0===e?void 0:e.key}),{value:u,defaultValue:d}),D=(0,te.A)(H,2),B=D[0],W=D[1],F=(0,r.useState)((function(){return R.findIndex((function(e){return e.key===B}))})),X=(0,te.A)(F,2),K=X[0],G=X[1];(0,r.useEffect)((function(){var e,t=R.findIndex((function(e){return e.key===B}));-1===t&&(t=Math.max(0,Math.min(K,R.length-1)),W(null===(e=R[t])||void 0===e?void 0:e.key));G(t)}),[R.map((function(e){return e.key})).join("_"),B,K]);var q=(0,oe.A)(null,{value:n}),Y=(0,te.A)(q,2),U=Y[0],V=Y[1];(0,r.useEffect)((function(){n||(V("rc-tabs-".concat(zr)),zr+=1)}),[]);var Q={id:U,activeKey:B,animated:N,tabPosition:m,rtl:z,mobile:j},Z=(0,ee.A)((0,ee.A)({},Q),{},{editable:f,locale:y,moreIcon:A,moreTransitionName:w,tabBarGutter:h,onTabClick:function(e,t){null==k||k(e,t);var n=e!==B;W(e),n&&(null==C||C(e))},onTabScroll:E,extra:b,style:g,panes:null,getPopupContainer:M,popupClassName:$,indicator:O});return r.createElement(ae.Provider,{value:{tabs:R,prefixCls:a}},r.createElement("div",(0,P.A)({ref:t,id:n,className:i()(a,"".concat(a,"-").concat(m),(0,J.A)((0,J.A)((0,J.A)({},"".concat(a,"-mobile"),j),"".concat(a,"-editable"),f),"".concat(a,"-rtl"),z),l)},T),r.createElement($r,(0,P.A)({},Z,{renderTabBar:x})),r.createElement(Tr,(0,P.A)({destroyInactiveTabPane:S},Q,{animated:N}))))}));var Nr=n(934),Ir=n(3723);const Lr={motionAppear:!1,motionEnter:!0,motionLeave:!0};var jr=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{antCls:n}=e,r=`${n}-${t}`,{inKeyframes:o,outKeyframes:i}=Dr[t];return[(0,Hr.b)(r,o,i,e.motionDurationMid),{[`\n ${r}-enter,\n ${r}-appear\n `]:{transform:"scale(0)",transformOrigin:"0% 0%",opacity:0,animationTimingFunction:e.motionEaseOutQuint,"&-prepare":{transform:"scale(1)"}},[`${r}-leave`]:{animationTimingFunction:e.motionEaseInQuint}}]},Wr=e=>{const{componentCls:t,motionDurationSlow:n}=e;return[{[t]:{[`${t}-switch`]:{"&-appear, &-enter":{transition:"none","&-start":{opacity:0},"&-active":{opacity:1,transition:`opacity ${n}`}},"&-leave":{position:"absolute",transition:"none",inset:0,"&-start":{opacity:1},"&-active":{opacity:0,transition:`opacity ${n}`}}}}},[Br(e,"slide-up"),Br(e,"slide-down")]]},Fr=e=>{const{componentCls:t,tabsCardPadding:n,cardBg:r,cardGutter:o,colorBorderSecondary:i,itemSelectedColor:a}=e;return{[`${t}-card`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{margin:0,padding:n,background:r,border:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${i}`,transition:`all ${e.motionDurationSlow} ${e.motionEaseInOut}`},[`${t}-tab-active`]:{color:a,background:e.colorBgContainer},[`${t}-ink-bar`]:{visibility:"hidden"}},[`&${t}-top, &${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab + ${t}-tab`]:{marginLeft:{_skip_check_:!0,value:(0,f.zA)(o)}}}},[`&${t}-top`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0`},[`${t}-tab-active`]:{borderBottomColor:e.colorBgContainer}}},[`&${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:`0 0 ${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)}`},[`${t}-tab-active`]:{borderTopColor:e.colorBgContainer}}},[`&${t}-left, &${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab + ${t}-tab`]:{marginTop:(0,f.zA)(o)}}},[`&${t}-left`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`${(0,f.zA)(e.borderRadiusLG)} 0 0 ${(0,f.zA)(e.borderRadiusLG)}`}},[`${t}-tab-active`]:{borderRightColor:{_skip_check_:!0,value:e.colorBgContainer}}}},[`&${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`0 ${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0`}},[`${t}-tab-active`]:{borderLeftColor:{_skip_check_:!0,value:e.colorBgContainer}}}}}}},Xr=e=>{const{componentCls:t,itemHoverColor:n,dropdownEdgeChildVerticalPadding:r}=e;return{[`${t}-dropdown`]:Object.assign(Object.assign({},(0,_r.dF)(e)),{position:"absolute",top:-9999,left:{_skip_check_:!0,value:-9999},zIndex:e.zIndexPopup,display:"block","&-hidden":{display:"none"},[`${t}-dropdown-menu`]:{maxHeight:e.tabsDropdownHeight,margin:0,padding:`${(0,f.zA)(r)} 0`,overflowX:"hidden",overflowY:"auto",textAlign:{_skip_check_:!0,value:"left"},listStyleType:"none",backgroundColor:e.colorBgContainer,backgroundClip:"padding-box",borderRadius:e.borderRadiusLG,outline:"none",boxShadow:e.boxShadowSecondary,"&-item":Object.assign(Object.assign({},_r.L9),{display:"flex",alignItems:"center",minWidth:e.tabsDropdownWidth,margin:0,padding:`${(0,f.zA)(e.paddingXXS)} ${(0,f.zA)(e.paddingSM)}`,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer",transition:`all ${e.motionDurationSlow}`,"> span":{flex:1,whiteSpace:"nowrap"},"&-remove":{flex:"none",marginLeft:{_skip_check_:!0,value:e.marginSM},color:e.colorTextDescription,fontSize:e.fontSizeSM,background:"transparent",border:0,cursor:"pointer","&:hover":{color:n}},"&:hover":{background:e.controlItemBgHover},"&-disabled":{"&, &:hover":{color:e.colorTextDisabled,background:"transparent",cursor:"not-allowed"}}})}})}},Kr=e=>{const{componentCls:t,margin:n,colorBorderSecondary:r,horizontalMargin:o,verticalItemPadding:i,verticalItemMargin:a,calc:l}=e;return{[`${t}-top, ${t}-bottom`]:{flexDirection:"column",[`> ${t}-nav, > div > ${t}-nav`]:{margin:o,"&::before":{position:"absolute",right:{_skip_check_:!0,value:0},left:{_skip_check_:!0,value:0},borderBottom:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${r}`,content:"''"},[`${t}-ink-bar`]:{height:e.lineWidthBold,"&-animated":{transition:`width ${e.motionDurationSlow}, left ${e.motionDurationSlow},\n right ${e.motionDurationSlow}`}},[`${t}-nav-wrap`]:{"&::before, &::after":{top:0,bottom:0,width:e.controlHeight},"&::before":{left:{_skip_check_:!0,value:0},boxShadow:e.boxShadowTabsOverflowLeft},"&::after":{right:{_skip_check_:!0,value:0},boxShadow:e.boxShadowTabsOverflowRight},[`&${t}-nav-wrap-ping-left::before`]:{opacity:1},[`&${t}-nav-wrap-ping-right::after`]:{opacity:1}}}},[`${t}-top`]:{[`> ${t}-nav,\n > div > ${t}-nav`]:{"&::before":{bottom:0},[`${t}-ink-bar`]:{bottom:0}}},[`${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{order:1,marginTop:n,marginBottom:0,"&::before":{top:0},[`${t}-ink-bar`]:{top:0}},[`> ${t}-content-holder, > div > ${t}-content-holder`]:{order:0}},[`${t}-left, ${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{flexDirection:"column",minWidth:l(e.controlHeight).mul(1.25).equal(),[`${t}-tab`]:{padding:i,textAlign:"center"},[`${t}-tab + ${t}-tab`]:{margin:a},[`${t}-nav-wrap`]:{flexDirection:"column","&::before, &::after":{right:{_skip_check_:!0,value:0},left:{_skip_check_:!0,value:0},height:e.controlHeight},"&::before":{top:0,boxShadow:e.boxShadowTabsOverflowTop},"&::after":{bottom:0,boxShadow:e.boxShadowTabsOverflowBottom},[`&${t}-nav-wrap-ping-top::before`]:{opacity:1},[`&${t}-nav-wrap-ping-bottom::after`]:{opacity:1}},[`${t}-ink-bar`]:{width:e.lineWidthBold,"&-animated":{transition:`height ${e.motionDurationSlow}, top ${e.motionDurationSlow}`}},[`${t}-nav-list, ${t}-nav-operations`]:{flex:"1 0 auto",flexDirection:"column"}}},[`${t}-left`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-ink-bar`]:{right:{_skip_check_:!0,value:0}}},[`> ${t}-content-holder, > div > ${t}-content-holder`]:{marginLeft:{_skip_check_:!0,value:(0,f.zA)(l(e.lineWidth).mul(-1).equal())},borderLeft:{_skip_check_:!0,value:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`},[`> ${t}-content > ${t}-tabpane`]:{paddingLeft:{_skip_check_:!0,value:e.paddingLG}}}},[`${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{order:1,[`${t}-ink-bar`]:{left:{_skip_check_:!0,value:0}}},[`> ${t}-content-holder, > div > ${t}-content-holder`]:{order:0,marginRight:{_skip_check_:!0,value:l(e.lineWidth).mul(-1).equal()},borderRight:{_skip_check_:!0,value:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`},[`> ${t}-content > ${t}-tabpane`]:{paddingRight:{_skip_check_:!0,value:e.paddingLG}}}}}},Gr=e=>{const{componentCls:t,cardPaddingSM:n,cardPaddingLG:r,horizontalItemPaddingSM:o,horizontalItemPaddingLG:i}=e;return{[t]:{"&-small":{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:o,fontSize:e.titleFontSizeSM}}},"&-large":{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:i,fontSize:e.titleFontSizeLG}}}},[`${t}-card`]:{[`&${t}-small`]:{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:n}},[`&${t}-bottom`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:`0 0 ${(0,f.zA)(e.borderRadius)} ${(0,f.zA)(e.borderRadius)}`}},[`&${t}-top`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:`${(0,f.zA)(e.borderRadius)} ${(0,f.zA)(e.borderRadius)} 0 0`}},[`&${t}-right`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`0 ${(0,f.zA)(e.borderRadius)} ${(0,f.zA)(e.borderRadius)} 0`}}},[`&${t}-left`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`${(0,f.zA)(e.borderRadius)} 0 0 ${(0,f.zA)(e.borderRadius)}`}}}},[`&${t}-large`]:{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:r}}}}}},qr=e=>{const{componentCls:t,itemActiveColor:n,itemHoverColor:r,iconCls:o,tabsHorizontalItemMargin:i,horizontalItemPadding:a,itemSelectedColor:l,itemColor:c}=e,s=`${t}-tab`;return{[s]:{position:"relative",WebkitTouchCallout:"none",WebkitTapHighlightColor:"transparent",display:"inline-flex",alignItems:"center",padding:a,fontSize:e.titleFontSize,background:"transparent",border:0,outline:"none",cursor:"pointer",color:c,"&-btn, &-remove":Object.assign({"&:focus:not(:focus-visible), &:active":{color:n}},(0,_r.K8)(e)),"&-btn":{outline:"none",transition:`all ${e.motionDurationSlow}`,[`${s}-icon:not(:last-child)`]:{marginInlineEnd:e.marginSM}},"&-remove":{flex:"none",marginRight:{_skip_check_:!0,value:e.calc(e.marginXXS).mul(-1).equal()},marginLeft:{_skip_check_:!0,value:e.marginXS},color:e.colorTextDescription,fontSize:e.fontSizeSM,background:"transparent",border:"none",outline:"none",cursor:"pointer",transition:`all ${e.motionDurationSlow}`,"&:hover":{color:e.colorTextHeading}},"&:hover":{color:r},[`&${s}-active ${s}-btn`]:{color:l,textShadow:e.tabsActiveTextShadow},[`&${s}-disabled`]:{color:e.colorTextDisabled,cursor:"not-allowed"},[`&${s}-disabled ${s}-btn, &${s}-disabled ${t}-remove`]:{"&:focus, &:active":{color:e.colorTextDisabled}},[`& ${s}-remove ${o}`]:{margin:0},[`${o}:not(:last-child)`]:{marginRight:{_skip_check_:!0,value:e.marginSM}}},[`${s} + ${s}`]:{margin:{_skip_check_:!0,value:i}}}},Yr=e=>{const{componentCls:t,tabsHorizontalItemMarginRTL:n,iconCls:r,cardGutter:o,calc:i}=e,a=`${t}-rtl`;return{[a]:{direction:"rtl",[`${t}-nav`]:{[`${t}-tab`]:{margin:{_skip_check_:!0,value:n},[`${t}-tab:last-of-type`]:{marginLeft:{_skip_check_:!0,value:0}},[r]:{marginRight:{_skip_check_:!0,value:0},marginLeft:{_skip_check_:!0,value:(0,f.zA)(e.marginSM)}},[`${t}-tab-remove`]:{marginRight:{_skip_check_:!0,value:(0,f.zA)(e.marginXS)},marginLeft:{_skip_check_:!0,value:(0,f.zA)(i(e.marginXXS).mul(-1).equal())},[r]:{margin:0}}}},[`&${t}-left`]:{[`> ${t}-nav`]:{order:1},[`> ${t}-content-holder`]:{order:0}},[`&${t}-right`]:{[`> ${t}-nav`]:{order:0},[`> ${t}-content-holder`]:{order:1}},[`&${t}-card${t}-top, &${t}-card${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab + ${t}-tab`]:{marginRight:{_skip_check_:!0,value:o},marginLeft:{_skip_check_:!0,value:0}}}}},[`${t}-dropdown-rtl`]:{direction:"rtl"},[`${t}-menu-item`]:{[`${t}-dropdown-rtl`]:{textAlign:{_skip_check_:!0,value:"right"}}}}},Ur=e=>{const{componentCls:t,tabsCardPadding:n,cardHeight:r,cardGutter:o,itemHoverColor:i,itemActiveColor:a,colorBorderSecondary:l}=e;return{[t]:Object.assign(Object.assign(Object.assign(Object.assign({},(0,_r.dF)(e)),{display:"flex",[`> ${t}-nav, > div > ${t}-nav`]:{position:"relative",display:"flex",flex:"none",alignItems:"center",[`${t}-nav-wrap`]:{position:"relative",display:"flex",flex:"auto",alignSelf:"stretch",overflow:"hidden",whiteSpace:"nowrap",transform:"translate(0)","&::before, &::after":{position:"absolute",zIndex:1,opacity:0,transition:`opacity ${e.motionDurationSlow}`,content:"''",pointerEvents:"none"}},[`${t}-nav-list`]:{position:"relative",display:"flex",transition:`opacity ${e.motionDurationSlow}`},[`${t}-nav-operations`]:{display:"flex",alignSelf:"stretch"},[`${t}-nav-operations-hidden`]:{position:"absolute",visibility:"hidden",pointerEvents:"none"},[`${t}-nav-more`]:{position:"relative",padding:n,background:"transparent",border:0,color:e.colorText,"&::after":{position:"absolute",right:{_skip_check_:!0,value:0},bottom:0,left:{_skip_check_:!0,value:0},height:e.calc(e.controlHeightLG).div(8).equal(),transform:"translateY(100%)",content:"''"}},[`${t}-nav-add`]:Object.assign({minWidth:r,minHeight:r,marginLeft:{_skip_check_:!0,value:o},padding:`0 ${(0,f.zA)(e.paddingXS)}`,background:"transparent",border:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${l}`,borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0`,outline:"none",cursor:"pointer",color:e.colorText,transition:`all ${e.motionDurationSlow} ${e.motionEaseInOut}`,"&:hover":{color:i},"&:active, &:focus:not(:focus-visible)":{color:a}},(0,_r.K8)(e))},[`${t}-extra-content`]:{flex:"none"},[`${t}-ink-bar`]:{position:"absolute",background:e.inkBarColor,pointerEvents:"none"}}),qr(e)),{[`${t}-content`]:{position:"relative",width:"100%"},[`${t}-content-holder`]:{flex:"auto",minWidth:0,minHeight:0},[`${t}-tabpane`]:{outline:"none","&-hidden":{display:"none"}}}),[`${t}-centered`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-nav-wrap`]:{[`&:not([class*='${t}-nav-wrap-ping'])`]:{justifyContent:"center"}}}}}},Vr=(0,p.OF)("Tabs",(e=>{const t=(0,v.h1)(e,{tabsCardPadding:e.cardPadding,dropdownEdgeChildVerticalPadding:e.paddingXXS,tabsActiveTextShadow:"0 0 0.25px currentcolor",tabsDropdownHeight:200,tabsDropdownWidth:120,tabsHorizontalItemMargin:`0 0 0 ${(0,f.zA)(e.horizontalItemGutter)}`,tabsHorizontalItemMarginRTL:`0 0 0 ${(0,f.zA)(e.horizontalItemGutter)}`});return[Gr(t),Yr(t),Kr(t),Xr(t),Fr(t),Ur(t),Wr(t)]}),(e=>{const t=e.controlHeightLG;return{zIndexPopup:e.zIndexPopupBase+50,cardBg:e.colorFillAlter,cardHeight:t,cardPadding:`${(t-Math.round(e.fontSize*e.lineHeight))/2-e.lineWidth}px ${e.padding}px`,cardPaddingSM:`${1.5*e.paddingXXS}px ${e.padding}px`,cardPaddingLG:`${e.paddingXS}px ${e.padding}px ${1.5*e.paddingXXS}px`,titleFontSize:e.fontSize,titleFontSizeLG:e.fontSizeLG,titleFontSizeSM:e.fontSize,inkBarColor:e.colorPrimary,horizontalMargin:`0 0 ${e.margin}px 0`,horizontalItemGutter:32,horizontalItemMargin:"",horizontalItemMarginRTL:"",horizontalItemPadding:`${e.paddingSM}px 0`,horizontalItemPaddingSM:`${e.paddingXS}px 0`,horizontalItemPaddingLG:`${e.padding}px 0`,verticalItemPadding:`${e.paddingXS}px ${e.paddingLG}px`,verticalItemMargin:`${e.margin}px 0 0 0`,itemColor:e.colorText,itemSelectedColor:e.colorPrimary,itemHoverColor:e.colorPrimaryHover,itemActiveColor:e.colorPrimaryActive,cardGutter:e.marginXXS/2}}));var Qr=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{var t,n,o,a,c,s,d,f;const{type:p,className:v,rootClassName:m,size:h,onEdit:g,hideAdd:b,centered:y,addIcon:A,removeIcon:w,moreIcon:S,popupClassName:x,children:C,items:k,animated:E,style:M,indicatorSize:$,indicator:O}=e,T=Qr(e,["type","className","rootClassName","size","onEdit","hideAdd","centered","addIcon","removeIcon","moreIcon","popupClassName","children","items","animated","style","indicatorSize","indicator"]),{prefixCls:R}=T,{direction:z,tabs:P,getPrefixCls:N,getPopupContainer:I}=r.useContext(l.QO),L=N("tabs",R),j=(0,Nr.A)(L),[_,H,D]=Vr(L,j);let B;"editable-card"===p&&(B={onEdit:(e,t)=>{let{key:n,event:r}=t;null==g||g("add"===e?r:n,e)},removeIcon:null!==(t=null!=w?w:null==P?void 0:P.removeIcon)&&void 0!==t?t:r.createElement(G.A,null),addIcon:(null!=A?A:null==P?void 0:P.addIcon)||r.createElement(Z,null),showAdd:!0!==b});const W=N();const F=u(h),X=function(e,t){return e||function(e){return e.filter((e=>e))}(ce(t).map((e=>{if(r.isValidElement(e)){const{key:t,props:n}=e,r=n||{},{tab:o}=r,i=jr(r,["tab"]);return Object.assign(Object.assign({key:String(t)},i),{label:o})}return null})))}(k,C),K=function(e){let t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{inkBar:!0,tabPane:!1};return t=!1===n?{inkBar:!1,tabPane:!1}:!0===n?{inkBar:!0,tabPane:!0}:Object.assign({inkBar:!0},"object"==typeof n?n:{}),t.tabPane&&(t.tabPaneMotion=Object.assign(Object.assign({},Lr),{motionName:(0,Ir.b)(e,"switch")})),t}(L,E),q=Object.assign(Object.assign({},null==P?void 0:P.style),M),Y={align:null!==(n=null==O?void 0:O.align)&&void 0!==n?n:null===(o=null==P?void 0:P.indicator)||void 0===o?void 0:o.align,size:null!==(d=null!==(c=null!==(a=null==O?void 0:O.size)&&void 0!==a?a:$)&&void 0!==c?c:null===(s=null==P?void 0:P.indicator)||void 0===s?void 0:s.size)&&void 0!==d?d:null==P?void 0:P.indicatorSize};return _(r.createElement(Pr,Object.assign({direction:z,getPopupContainer:I,moreTransitionName:`${W}-slide-up`},T,{items:X,className:i()({[`${L}-${F}`]:F,[`${L}-card`]:["card","editable-card"].includes(p),[`${L}-editable-card`]:"editable-card"===p,[`${L}-centered`]:y},null==P?void 0:P.className,v,m,H,D,j),popupClassName:i()(x,H,D,j),style:q,editable:B,moreIcon:null!==(f=null!=S?S:null==P?void 0:P.moreIcon)&&void 0!==f?f:r.createElement(U,null),prefixCls:L,animated:K,indicator:Y})))};Zr.TabPane=()=>null;const Jr=Zr;var eo=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{var{prefixCls:t,className:n,hoverable:o=!0}=e,a=eo(e,["prefixCls","className","hoverable"]);const{getPrefixCls:c}=r.useContext(l.QO),s=c("card",t),u=i()(`${s}-grid`,n,{[`${s}-grid-hoverable`]:o});return r.createElement("div",Object.assign({},a,{className:u}))},no=e=>{const{antCls:t,componentCls:n,headerHeight:r,cardPaddingBase:o,tabsMarginBottom:i}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:r,marginBottom:-1,padding:`0 ${(0,f.zA)(o)}`,color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.headerFontSize,background:e.headerBg,borderBottom:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`,borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0`},(0,_r.t6)()),{"&-wrapper":{width:"100%",display:"flex",alignItems:"center"},"&-title":Object.assign(Object.assign({display:"inline-block",flex:1},_r.L9),{[`\n > ${n}-typography,\n > ${n}-typography-edit-content\n `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:i,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,"&-bar":{borderBottom:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})},ro=e=>{const{cardPaddingBase:t,colorBorderSecondary:n,cardShadow:r,lineWidth:o}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:`\n ${(0,f.zA)(o)} 0 0 0 ${n},\n 0 ${(0,f.zA)(o)} 0 0 ${n},\n ${(0,f.zA)(o)} ${(0,f.zA)(o)} 0 0 ${n},\n ${(0,f.zA)(o)} 0 0 0 ${n} inset,\n 0 ${(0,f.zA)(o)} 0 0 ${n} inset;\n `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:r}}},oo=e=>{const{componentCls:t,iconCls:n,actionsLiMargin:r,cardActionsIconSize:o,colorBorderSecondary:i,actionsBg:a}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:a,borderTop:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${i}`,display:"flex",borderRadius:`0 0 ${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)}`},(0,_r.t6)()),{"& > li":{margin:r,color:e.colorTextDescription,textAlign:"center","> span":{position:"relative",display:"block",minWidth:e.calc(e.cardActionsIconSize).mul(2).equal(),fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer","&:hover":{color:e.colorPrimary,transition:`color ${e.motionDurationMid}`},[`a:not(${t}-btn), > ${n}`]:{display:"inline-block",width:"100%",color:e.colorTextDescription,lineHeight:(0,f.zA)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${n}`]:{fontSize:o,lineHeight:(0,f.zA)(e.calc(o).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${i}`}}})},io=e=>Object.assign(Object.assign({margin:`${(0,f.zA)(e.calc(e.marginXXS).mul(-1).equal())} 0`,display:"flex"},(0,_r.t6)()),{"&-avatar":{paddingInlineEnd:e.padding},"&-detail":{overflow:"hidden",flex:1,"> div:not(:last-child)":{marginBottom:e.marginXS}},"&-title":Object.assign({color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG},_r.L9),"&-description":{color:e.colorTextDescription}}),ao=e=>{const{componentCls:t,cardPaddingBase:n,colorFillAlter:r}=e;return{[`${t}-head`]:{padding:`0 ${(0,f.zA)(n)}`,background:r,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,f.zA)(e.padding)} ${(0,f.zA)(n)}`}}},lo=e=>{const{componentCls:t}=e;return{overflow:"hidden",[`${t}-body`]:{userSelect:"none"}}},co=e=>{const{antCls:t,componentCls:n,cardShadow:r,cardHeadPadding:o,colorBorderSecondary:i,boxShadowTertiary:a,cardPaddingBase:l,extraColor:c}=e;return{[n]:Object.assign(Object.assign({},(0,_r.dF)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${n}-bordered)`]:{boxShadow:a},[`${n}-head`]:no(e),[`${n}-extra`]:{marginInlineStart:"auto",color:c,fontWeight:"normal",fontSize:e.fontSize},[`${n}-body`]:Object.assign({padding:l,borderRadius:`0 0 ${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)}`},(0,_r.t6)()),[`${n}-grid`]:ro(e),[`${n}-cover`]:{"> *":{display:"block",width:"100%"},[`img, img + ${t}-image-mask`]:{borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0`}},[`${n}-actions`]:oo(e),[`${n}-meta`]:io(e)}),[`${n}-bordered`]:{border:`${(0,f.zA)(e.lineWidth)} ${e.lineType} ${i}`,[`${n}-cover`]:{marginTop:-1,marginInlineStart:-1,marginInlineEnd:-1}},[`${n}-hoverable`]:{cursor:"pointer",transition:`box-shadow ${e.motionDurationMid}, border-color ${e.motionDurationMid}`,"&:hover":{borderColor:"transparent",boxShadow:r}},[`${n}-contain-grid`]:{borderRadius:`${(0,f.zA)(e.borderRadiusLG)} ${(0,f.zA)(e.borderRadiusLG)} 0 0 `,[`${n}-body`]:{display:"flex",flexWrap:"wrap"},[`&:not(${n}-loading) ${n}-body`]:{marginBlockStart:e.calc(e.lineWidth).mul(-1).equal(),marginInlineStart:e.calc(e.lineWidth).mul(-1).equal(),padding:0}},[`${n}-contain-tabs`]:{[`> ${n}-head`]:{minHeight:0,[`${n}-head-title, ${n}-extra`]:{paddingTop:o}}},[`${n}-type-inner`]:ao(e),[`${n}-loading`]:lo(e),[`${n}-rtl`]:{direction:"rtl"}}},so=e=>{const{componentCls:t,cardPaddingSM:n,headerHeightSM:r,headerFontSizeSM:o}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:r,padding:`0 ${(0,f.zA)(n)}`,fontSize:o,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:n}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}},uo=(0,p.OF)("Card",(e=>{const t=(0,v.h1)(e,{cardShadow:e.boxShadowCard,cardHeadPadding:e.padding,cardPaddingBase:e.paddingLG,cardActionsIconSize:e.fontSize,cardPaddingSM:12});return[co(t),so(t)]}),(e=>({headerBg:"transparent",headerFontSize:e.fontSizeLG,headerFontSizeSM:e.fontSize,headerHeight:e.fontSizeLG*e.lineHeightLG+2*e.padding,headerHeightSM:e.fontSize*e.lineHeight+2*e.paddingXS,actionsBg:e.colorBgContainer,actionsLiMargin:`${e.paddingSM}px 0`,tabsMarginBottom:-e.padding-e.lineWidth,extraColor:e.colorText})));var fo=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{actionClasses:t,actions:n=[],actionStyle:o}=e;return r.createElement("ul",{className:t,style:o},n.map(((e,t)=>{const o=`action-${t}`;return r.createElement("li",{style:{width:100/n.length+"%"},key:o},r.createElement("span",null,e))})))},vo=r.forwardRef(((e,t)=>{const{prefixCls:n,className:o,rootClassName:c,style:s,extra:d,headStyle:f={},bodyStyle:p={},title:v,loading:m,bordered:h=!0,size:g,type:b,cover:y,actions:A,tabList:w,children:S,activeTabKey:x,defaultActiveTabKey:C,tabBarExtraContent:k,hoverable:E,tabProps:M={},classNames:$,styles:O}=e,T=fo(e,["prefixCls","className","rootClassName","style","extra","headStyle","bodyStyle","title","loading","bordered","size","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey","tabBarExtraContent","hoverable","tabProps","classNames","styles"]),{getPrefixCls:R,direction:z,card:P}=r.useContext(l.QO);const N=e=>{var t;return i()(null===(t=null==P?void 0:P.classNames)||void 0===t?void 0:t[e],null==$?void 0:$[e])},I=e=>{var t;return Object.assign(Object.assign({},null===(t=null==P?void 0:P.styles)||void 0===t?void 0:t[e]),null==O?void 0:O[e])},L=r.useMemo((()=>{let e=!1;return r.Children.forEach(S,(t=>{t&&t.type&&t.type===to&&(e=!0)})),e}),[S]),j=R("card",n),[_,H,D]=uo(j),B=r.createElement(K,{loading:!0,active:!0,paragraph:{rows:4},title:!1},S),W=void 0!==x,F=Object.assign(Object.assign({},M),{[W?"activeKey":"defaultActiveKey"]:W?x:C,tabBarExtraContent:k});let X;const G=u(g),q=G&&"default"!==G?G:"large",Y=w?r.createElement(Jr,Object.assign({size:q},F,{className:`${j}-head-tabs`,onChange:t=>{var n;null===(n=e.onTabChange)||void 0===n||n.call(e,t)},items:w.map((e=>{var{tab:t}=e,n=fo(e,["tab"]);return Object.assign({label:t},n)}))})):null;if(v||d||Y){const e=i()(`${j}-head`,N("header")),t=i()(`${j}-head-title`,N("title")),n=i()(`${j}-extra`,N("extra")),o=Object.assign(Object.assign({},f),I("header"));X=r.createElement("div",{className:e,style:o},r.createElement("div",{className:`${j}-head-wrapper`},v&&r.createElement("div",{className:t,style:I("title")},v),d&&r.createElement("div",{className:n,style:I("extra")},d)),Y)}const U=i()(`${j}-cover`,N("cover")),V=y?r.createElement("div",{className:U,style:I("cover")},y):null,Q=i()(`${j}-body`,N("body")),Z=Object.assign(Object.assign({},p),I("body")),J=r.createElement("div",{className:Q,style:Z},m?B:S),ee=i()(`${j}-actions`,N("actions")),te=A&&A.length?r.createElement(po,{actionClasses:ee,actionStyle:I("actions"),actions:A}):null,ne=(0,a.A)(T,["onTabChange"]),re=i()(j,null==P?void 0:P.className,{[`${j}-loading`]:m,[`${j}-bordered`]:h,[`${j}-hoverable`]:E,[`${j}-contain-grid`]:L,[`${j}-contain-tabs`]:w&&w.length,[`${j}-${G}`]:G,[`${j}-type-${b}`]:!!b,[`${j}-rtl`]:"rtl"===z},o,c,H,D),oe=Object.assign(Object.assign({},null==P?void 0:P.style),s);return _(r.createElement("div",Object.assign({ref:t},ne,{className:re,style:oe}),X,V,J,te))}));var mo=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{prefixCls:t,className:n,avatar:o,title:a,description:c}=e,s=mo(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:u}=r.useContext(l.QO),d=u("card",t),f=i()(`${d}-meta`,n),p=o?r.createElement("div",{className:`${d}-meta-avatar`},o):null,v=a?r.createElement("div",{className:`${d}-meta-title`},a):null,m=c?r.createElement("div",{className:`${d}-meta-description`},c):null,h=v||m?r.createElement("div",{className:`${d}-meta-detail`},v,m):null;return r.createElement("div",Object.assign({},s,{className:f}),p,h)},go=vo;go.Grid=to,go.Meta=ho;const bo=go},3517:(e,t,n)=>{"use strict";n.d(t,{A:()=>ge});var r=n(6540),o=n(8168),i=n(9379),a=n(3029),l=n(2901),c=n(6822),s=n(2176),u=n(3954),d=n(5501),f=n(4467),p=n(2284),v=n(45);const m={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0};function h(e,t,n){var r=(n||{}).atBegin;return function(e,t,n){var r,o=n||{},i=o.noTrailing,a=void 0!==i&&i,l=o.noLeading,c=void 0!==l&&l,s=o.debounceMode,u=void 0===s?void 0:s,d=!1,f=0;function p(){r&&clearTimeout(r)}function v(){for(var n=arguments.length,o=new Array(n),i=0;ie?c?(f=Date.now(),a||(r=setTimeout(u?m:v,e))):v():!0!==a&&(r=setTimeout(u?m:v,void 0===u?e-s:e)))}return v.cancel=function(e){var t=(e||{}).upcomingOnly,n=void 0!==t&&t;p(),d=!n},v}(e,t,{debounceMode:!1!==(void 0!==r&&r)})}var g=n(6942),b=n.n(g);const y={accessibility:!0,adaptiveHeight:!1,afterChange:null,appendDots:function(e){return r.createElement("ul",{style:{display:"block"}},e)},arrows:!0,autoplay:!1,autoplaySpeed:3e3,beforeChange:null,centerMode:!1,centerPadding:"50px",className:"",cssEase:"ease",customPaging:function(e){return r.createElement("button",null,e+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:null,nextArrow:null,onEdge:null,onInit:null,onLazyLoadError:null,onReInit:null,pauseOnDotsHover:!1,pauseOnFocus:!1,pauseOnHover:!0,prevArrow:null,responsive:null,rows:1,rtl:!1,slide:"div",slidesPerRow:1,slidesToScroll:1,slidesToShow:1,speed:500,swipe:!0,swipeEvent:null,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,waitForAnimate:!0,asNavFor:null};function A(e,t,n){return Math.max(t,Math.min(e,n))}var w=function(e){["onTouchStart","onTouchMove","onWheel"].includes(e._reactName)||e.preventDefault()},S=function(e){for(var t=[],n=x(e),r=C(e),o=n;o0?1:0):0},E=function(e){return e.centerMode?Math.floor((e.slidesToShow-1)/2)+1+(parseInt(e.centerPadding)>0?1:0):e.slidesToShow},M=function(e){return e&&e.offsetWidth||0},$=function(e){return e&&e.offsetHeight||0},O=function(e){var t,n,r,o,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t=e.startX-e.curX,n=e.startY-e.curY,r=Math.atan2(n,t),(o=Math.round(180*r/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0||o<=360&&o>=315?"left":o>=135&&o<=225?"right":!0===i?o>=35&&o<=135?"up":"down":"vertical"},T=function(e){var t=!0;return e.infinite||(e.centerMode&&e.currentSlide>=e.slideCount-1||e.slideCount<=e.slidesToShow||e.currentSlide>=e.slideCount-e.slidesToShow)&&(t=!1),t},R=function(e,t){var n={};return t.forEach((function(t){return n[t]=e[t]})),n},z=function(e,t){var n=function(e){for(var t=e.infinite?2*e.slideCount:e.slideCount,n=e.infinite?-1*e.slidesToShow:0,r=e.infinite?-1*e.slidesToShow:0,o=[];nn[n.length-1])t=n[n.length-1];else for(var o in n){if(t-1*e.swipeLeft)return n=r,!1}else if(r.offsetLeft-t+M(r)/2>-1*e.swipeLeft)return n=r,!1;return!0})),!n)return 0;var i=!0===e.rtl?e.slideCount-e.currentSlide:e.currentSlide;return Math.abs(n.dataset.index-i)||1}return e.slidesToScroll},N=function(e,t){return t.reduce((function(t,n){return t&&e.hasOwnProperty(n)}),!0)?null:console.error("Keys Missing:",e)},I=function(e){var t,n;(N(e,["left","variableWidth","slideCount","slidesToShow","slideWidth"]),e.vertical)?n=(e.unslick?e.slideCount:e.slideCount+2*e.slidesToShow)*e.slideHeight:t=D(e)*e.slideWidth;var r={opacity:1,transition:"",WebkitTransition:""};if(e.useTransform){var o=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",a=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",l=e.vertical?"translateY("+e.left+"px)":"translateX("+e.left+"px)";r=(0,i.A)((0,i.A)({},r),{},{WebkitTransform:o,transform:a,msTransform:l})}else e.vertical?r.top=e.left:r.left=e.left;return e.fade&&(r={opacity:1}),t&&(r.width=t),n&&(r.height=n),window&&!window.addEventListener&&window.attachEvent&&(e.vertical?r.marginTop=e.left+"px":r.marginLeft=e.left+"px"),r},L=function(e){N(e,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var t=I(e);return e.useTransform?(t.WebkitTransition="-webkit-transform "+e.speed+"ms "+e.cssEase,t.transition="transform "+e.speed+"ms "+e.cssEase):e.vertical?t.transition="top "+e.speed+"ms "+e.cssEase:t.transition="left "+e.speed+"ms "+e.cssEase,t},j=function(e){if(e.unslick)return 0;N(e,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var t,n,r=e.slideIndex,o=e.trackRef,i=e.infinite,a=e.centerMode,l=e.slideCount,c=e.slidesToShow,s=e.slidesToScroll,u=e.slideWidth,d=e.listWidth,f=e.variableWidth,p=e.slideHeight,v=e.fade,m=e.vertical;if(v||1===e.slideCount)return 0;var h=0;if(i?(h=-_(e),l%s!=0&&r+s>l&&(h=-(r>l?c-(r-l):l%s)),a&&(h+=parseInt(c/2))):(l%s!=0&&r+s>l&&(h=c-l%s),a&&(h=parseInt(c/2))),t=m?r*p*-1+h*p:r*u*-1+h*u,!0===f){var g,b=o&&o.node;if(g=r+_(e),t=(n=b&&b.childNodes[g])?-1*n.offsetLeft:0,!0===a){g=i?r+_(e):r,n=b&&b.children[g],t=0;for(var y=0;ye.currentSlide?e.targetSlide>e.currentSlide+W(e)?"left":"right":e.targetSlide0&&(i+=1),r&&t%2==0&&(i+=1),i}return r?0:t-1},F=function(e){var t=e.slidesToShow,n=e.centerMode,r=e.rtl,o=e.centerPadding;if(n){var i=(t-1)/2+1;return parseInt(o)>0&&(i+=1),r||t%2!=0||(i+=1),i}return r?t-1:0},X=function(){return!("undefined"==typeof window||!window.document||!window.document.createElement)},K=Object.keys(y);var G=function(e){var t,n,r,o,i;return r=(i=e.rtl?e.slideCount-1-e.index:e.index)<0||i>=e.slideCount,e.centerMode?(o=Math.floor(e.slidesToShow/2),n=(i-e.currentSlide)%e.slideCount==0,i>e.currentSlide-o-1&&i<=e.currentSlide+o&&(t=!0)):t=e.currentSlide<=i&&i=e.slideCount?e.targetSlide-e.slideCount:e.targetSlide)}},q=function(e,t){return e.key+"-"+t},Y=function(e){var t,n=[],o=[],a=[],l=r.Children.count(e.children),c=x(e),s=C(e);return r.Children.forEach(e.children,(function(u,d){var f,p={message:"children",index:d,slidesToScroll:e.slidesToScroll,currentSlide:e.currentSlide};f=!e.lazyLoad||e.lazyLoad&&e.lazyLoadedList.indexOf(d)>=0?u:r.createElement("div",null);var v=function(e){var t={};return void 0!==e.variableWidth&&!1!==e.variableWidth||(t.width=e.slideWidth),e.fade&&(t.position="relative",e.vertical&&e.slideHeight?t.top=-e.index*parseInt(e.slideHeight):t.left=-e.index*parseInt(e.slideWidth),t.opacity=e.currentSlide===e.index?1:0,t.zIndex=e.currentSlide===e.index?999:998,e.useCSS&&(t.transition="opacity "+e.speed+"ms "+e.cssEase+", visibility "+e.speed+"ms "+e.cssEase)),t}((0,i.A)((0,i.A)({},e),{},{index:d})),m=f.props.className||"",h=G((0,i.A)((0,i.A)({},e),{},{index:d}));if(n.push(r.cloneElement(f,{key:"original"+q(f,d),"data-index":d,className:b()(h,m),tabIndex:"-1","aria-hidden":!h["slick-active"],style:(0,i.A)((0,i.A)({outline:"none"},f.props.style||{}),v),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}})),e.infinite&&l>1&&!1===e.fade&&!e.unslick){var g=l-d;g<=_(e)&&((t=-g)>=c&&(f=u),h=G((0,i.A)((0,i.A)({},e),{},{index:t})),o.push(r.cloneElement(f,{key:"precloned"+q(f,t),"data-index":t,tabIndex:"-1",className:b()(h,m),"aria-hidden":!h["slick-active"],style:(0,i.A)((0,i.A)({},f.props.style||{}),v),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}}))),(t=l+d)=w&&d<=g:d===w}),x={message:"dots",index:m,slidesToScroll:c,currentSlide:d},C=this.clickHandler.bind(this,x);v=v.concat(r.createElement("li",{key:m,className:S},r.cloneElement(this.props.customPaging(m),{onClick:C})))}return r.cloneElement(this.props.appendDots(v),(0,i.A)({className:this.props.dotsClass},p))}}])}(r.PureComponent);function Q(e,t,n){return t=(0,u.A)(t),(0,c.A)(e,(0,s.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var Z=function(e){function t(){return(0,a.A)(this,t),Q(this,t,arguments)}return(0,d.A)(t,e),(0,l.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-prev":!0},t=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(0===this.props.currentSlide||this.props.slideCount<=this.props.slidesToShow)&&(e["slick-disabled"]=!0,t=null);var n={key:"0","data-role":"none",className:b()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.prevArrow?r.cloneElement(this.props.prevArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"0",type:"button"},n)," ","Previous")}}])}(r.PureComponent),J=function(e){function t(){return(0,a.A)(this,t),Q(this,t,arguments)}return(0,d.A)(t,e),(0,l.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-next":!0},t=this.clickHandler.bind(this,{message:"next"});T(this.props)||(e["slick-disabled"]=!0,t=null);var n={key:"1","data-role":"none",className:b()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.nextArrow?r.cloneElement(this.props.nextArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"1",type:"button"},n)," ","Next")}}])}(r.PureComponent),ee=n(3591),te=["animating"];var ne=function(e){function t(e){var n,l,d,p;(0,a.A)(this,t),l=this,d=t,p=[e],d=(0,u.A)(d),n=(0,c.A)(l,(0,s.A)()?Reflect.construct(d,p||[],(0,u.A)(l).constructor):d.apply(l,p)),(0,f.A)(n,"listRefHandler",(function(e){return n.list=e})),(0,f.A)(n,"trackRefHandler",(function(e){return n.track=e})),(0,f.A)(n,"adaptHeight",(function(){if(n.props.adaptiveHeight&&n.list){var e=n.list.querySelector('[data-index="'.concat(n.state.currentSlide,'"]'));n.list.style.height=$(e)+"px"}})),(0,f.A)(n,"componentDidMount",(function(){if(n.props.onInit&&n.props.onInit(),n.props.lazyLoad){var e=S((0,i.A)((0,i.A)({},n.props),n.state));e.length>0&&(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e))}var t=(0,i.A)({listRef:n.list,trackRef:n.track},n.props);n.updateState(t,!0,(function(){n.adaptHeight(),n.props.autoplay&&n.autoPlay("playing")})),"progressive"===n.props.lazyLoad&&(n.lazyLoadTimer=setInterval(n.progressiveLazyLoad,1e3)),n.ro=new ee.A((function(){n.state.animating?(n.onWindowResized(!1),n.callbackTimers.push(setTimeout((function(){return n.onWindowResized()}),n.props.speed))):n.onWindowResized()})),n.ro.observe(n.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),(function(e){e.onfocus=n.props.pauseOnFocus?n.onSlideFocus:null,e.onblur=n.props.pauseOnFocus?n.onSlideBlur:null})),window.addEventListener?window.addEventListener("resize",n.onWindowResized):window.attachEvent("onresize",n.onWindowResized)})),(0,f.A)(n,"componentWillUnmount",(function(){n.animationEndCallback&&clearTimeout(n.animationEndCallback),n.lazyLoadTimer&&clearInterval(n.lazyLoadTimer),n.callbackTimers.length&&(n.callbackTimers.forEach((function(e){return clearTimeout(e)})),n.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",n.onWindowResized):window.detachEvent("onresize",n.onWindowResized),n.autoplayTimer&&clearInterval(n.autoplayTimer),n.ro.disconnect()})),(0,f.A)(n,"componentDidUpdate",(function(e){if(n.checkImagesLoad(),n.props.onReInit&&n.props.onReInit(),n.props.lazyLoad){var t=S((0,i.A)((0,i.A)({},n.props),n.state));t.length>0&&(n.setState((function(e){return{lazyLoadedList:e.lazyLoadedList.concat(t)}})),n.props.onLazyLoad&&n.props.onLazyLoad(t))}n.adaptHeight();var o=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state),a=n.didPropsChange(e);a&&n.updateState(o,a,(function(){n.state.currentSlide>=r.Children.count(n.props.children)&&n.changeSlide({message:"index",index:r.Children.count(n.props.children)-n.props.slidesToShow,currentSlide:n.state.currentSlide}),e.autoplay===n.props.autoplay&&e.autoplaySpeed===n.props.autoplaySpeed||(!e.autoplay&&n.props.autoplay?n.autoPlay("playing"):n.props.autoplay?n.autoPlay("update"):n.pause("paused"))}))})),(0,f.A)(n,"onWindowResized",(function(e){n.debouncedResize&&n.debouncedResize.cancel(),n.debouncedResize=h(50,(function(){return n.resizeWindow(e)})),n.debouncedResize()})),(0,f.A)(n,"resizeWindow",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];if(Boolean(n.track&&n.track.node)){var t=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state);n.updateState(t,e,(function(){n.props.autoplay?n.autoPlay("update"):n.pause("paused")})),n.setState({animating:!1}),clearTimeout(n.animationEndCallback),delete n.animationEndCallback}})),(0,f.A)(n,"updateState",(function(e,t,o){var a=function(e){var t,n=r.Children.count(e.children),o=e.listRef,a=Math.ceil(M(o)),l=e.trackRef&&e.trackRef.node,c=Math.ceil(M(l));if(e.vertical)t=a;else{var s=e.centerMode&&2*parseInt(e.centerPadding);"string"==typeof e.centerPadding&&"%"===e.centerPadding.slice(-1)&&(s*=a/100),t=Math.ceil((a-s)/e.slidesToShow)}var u=o&&$(o.querySelector('[data-index="0"]')),d=u*e.slidesToShow,f=void 0===e.currentSlide?e.initialSlide:e.currentSlide;e.rtl&&void 0===e.currentSlide&&(f=n-1-e.initialSlide);var p=e.lazyLoadedList||[],v=S((0,i.A)((0,i.A)({},e),{},{currentSlide:f,lazyLoadedList:p})),m={slideCount:n,slideWidth:t,listWidth:a,trackWidth:c,currentSlide:f,slideHeight:u,listHeight:d,lazyLoadedList:p=p.concat(v)};return null===e.autoplaying&&e.autoplay&&(m.autoplaying="playing"),m}(e);e=(0,i.A)((0,i.A)((0,i.A)({},e),a),{},{slideIndex:a.currentSlide});var l=j(e);e=(0,i.A)((0,i.A)({},e),{},{left:l});var c=I(e);(t||r.Children.count(n.props.children)!==r.Children.count(e.children))&&(a.trackStyle=c),n.setState(a,o)})),(0,f.A)(n,"ssrInit",(function(){if(n.props.variableWidth){var e=0,t=0,o=[],a=_((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length})),l=H((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length}));n.props.children.forEach((function(t){o.push(t.props.style.width),e+=t.props.style.width}));for(var c=0;c=t&&n.onWindowResized()};if(e.onclick){var i=e.onclick;e.onclick=function(t){i(t),e.parentNode.focus()}}else e.onclick=function(){return e.parentNode.focus()};e.onload||(n.props.lazyLoad?e.onload=function(){n.adaptHeight(),n.callbackTimers.push(setTimeout(n.onWindowResized,n.props.speed))}:(e.onload=o,e.onerror=function(){o(),n.props.onLazyLoadError&&n.props.onLazyLoadError()}))}))})),(0,f.A)(n,"progressiveLazyLoad",(function(){for(var e=[],t=(0,i.A)((0,i.A)({},n.props),n.state),r=n.state.currentSlide;r=-_(t);o--)if(n.state.lazyLoadedList.indexOf(o)<0){e.push(o);break}e.length>0?(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e)):n.lazyLoadTimer&&(clearInterval(n.lazyLoadTimer),delete n.lazyLoadTimer)})),(0,f.A)(n,"slideHandler",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=n.props,o=r.asNavFor,a=r.beforeChange,l=r.onLazyLoad,c=r.speed,s=r.afterChange,u=n.state.currentSlide,d=function(e){var t=e.waitForAnimate,n=e.animating,r=e.fade,o=e.infinite,a=e.index,l=e.slideCount,c=e.lazyLoad,s=e.currentSlide,u=e.centerMode,d=e.slidesToScroll,f=e.slidesToShow,p=e.useCSS,v=e.lazyLoadedList;if(t&&n)return{};var m,h,g,b=a,y={},w={},x=o?a:A(a,0,l-1);if(r){if(!o&&(a<0||a>=l))return{};a<0?b=a+l:a>=l&&(b=a-l),c&&v.indexOf(b)<0&&(v=v.concat(b)),y={animating:!0,currentSlide:b,lazyLoadedList:v,targetSlide:b},w={animating:!1,targetSlide:b}}else m=b,b<0?(m=b+l,o?l%d!=0&&(m=l-l%d):m=0):!T(e)&&b>s?b=m=s:u&&b>=l?(b=o?l:l-1,m=o?0:l-1):b>=l&&(m=b-l,o?l%d!=0&&(m=0):m=l-f),!o&&b+f>=l&&(m=l-f),h=j((0,i.A)((0,i.A)({},e),{},{slideIndex:b})),g=j((0,i.A)((0,i.A)({},e),{},{slideIndex:m})),o||(h===g&&(b=m),h=g),c&&(v=v.concat(S((0,i.A)((0,i.A)({},e),{},{currentSlide:b})))),p?(y={animating:!0,currentSlide:m,trackStyle:L((0,i.A)((0,i.A)({},e),{},{left:h})),lazyLoadedList:v,targetSlide:x},w={animating:!1,currentSlide:m,trackStyle:I((0,i.A)((0,i.A)({},e),{},{left:g})),swipeLeft:null,targetSlide:x}):y={currentSlide:m,trackStyle:I((0,i.A)((0,i.A)({},e),{},{left:g})),lazyLoadedList:v,targetSlide:x};return{state:y,nextState:w}}((0,i.A)((0,i.A)((0,i.A)({index:e},n.props),n.state),{},{trackRef:n.track,useCSS:n.props.useCSS&&!t})),f=d.state,p=d.nextState;if(f){a&&a(u,f.currentSlide);var m=f.lazyLoadedList.filter((function(e){return n.state.lazyLoadedList.indexOf(e)<0}));l&&m.length>0&&l(m),!n.props.waitForAnimate&&n.animationEndCallback&&(clearTimeout(n.animationEndCallback),s&&s(u),delete n.animationEndCallback),n.setState(f,(function(){o&&n.asNavForIndex!==e&&(n.asNavForIndex=e,o.innerSlider.slideHandler(e)),p&&(n.animationEndCallback=setTimeout((function(){var e=p.animating,t=(0,v.A)(p,te);n.setState(t,(function(){n.callbackTimers.push(setTimeout((function(){return n.setState({animating:e})}),10)),s&&s(f.currentSlide),delete n.animationEndCallback}))}),c))}))}})),(0,f.A)(n,"changeSlide",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=function(e,t){var n,r,o,a,l=e.slidesToScroll,c=e.slidesToShow,s=e.slideCount,u=e.currentSlide,d=e.targetSlide,f=e.lazyLoad,p=e.infinite;if(n=s%l!=0?0:(s-u)%l,"previous"===t.message)a=u-(o=0===n?l:c-n),f&&!p&&(a=-1==(r=u-o)?s-1:r),p||(a=d-l);else if("next"===t.message)a=u+(o=0===n?l:n),f&&!p&&(a=(u+l)%s+n),p||(a=d+l);else if("dots"===t.message)a=t.index*t.slidesToScroll;else if("children"===t.message){if(a=t.index,p){var v=B((0,i.A)((0,i.A)({},e),{},{targetSlide:a}));a>t.currentSlide&&"left"===v?a-=s:a10)return{scrolling:!0};l&&(b.swipeLength=E);var M=(c?-1:1)*(b.curX>b.startX?1:-1);l&&(M=b.curY>b.startY?1:-1);var $=Math.ceil(m/h),R=O(t.touchObject,l),z=b.swipeLength;return g||(0===s&&("right"===R||"down"===R)||s+1>=$&&("left"===R||"up"===R)||!T(t)&&("left"===R||"up"===R))&&(z=b.swipeLength*u,!1===d&&f&&(f(R),C.edgeDragged=!0)),!p&&y&&(y(R),C.swiped=!0),x=o?k+z*(A/S)*M:c?k-z*M:k+z*M,l&&(x=k+z*M),C=(0,i.A)((0,i.A)({},C),{},{touchObject:b,swipeLeft:x,trackStyle:I((0,i.A)((0,i.A)({},t),{},{left:x}))}),Math.abs(b.curX-b.startX)<.8*Math.abs(b.curY-b.startY)||b.swipeLength>10&&(C.swiping=!0,w(e)),C}}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));t&&(t.swiping&&(n.clickable=!1),n.setState(t))})),(0,f.A)(n,"swipeEnd",(function(e){var t=function(e,t){var n=t.dragging,r=t.swipe,o=t.touchObject,a=t.listWidth,l=t.touchThreshold,c=t.verticalSwiping,s=t.listHeight,u=t.swipeToSlide,d=t.scrolling,f=t.onSwipe,p=t.targetSlide,v=t.currentSlide,m=t.infinite;if(!n)return r&&w(e),{};var h=c?s/l:a/l,g=O(o,c),b={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(d)return b;if(!o.swipeLength)return b;if(o.swipeLength>h){var y,A;w(e),f&&f(g);var S=m?v:p;switch(g){case"left":case"up":A=S+P(t),y=u?z(t,A):A,b.currentDirection=0;break;case"right":case"down":A=S-P(t),y=u?z(t,A):A,b.currentDirection=1;break;default:y=S}b.triggerSlideHandler=y}else{var x=j(t);b.trackStyle=L((0,i.A)((0,i.A)({},t),{},{left:x}))}return b}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));if(t){var r=t.triggerSlideHandler;delete t.triggerSlideHandler,n.setState(t),void 0!==r&&(n.slideHandler(r),n.props.verticalSwiping&&n.enableBodyScroll())}})),(0,f.A)(n,"touchEnd",(function(e){n.swipeEnd(e),n.clickable=!0})),(0,f.A)(n,"slickPrev",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"previous"})}),0))})),(0,f.A)(n,"slickNext",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"next"})}),0))})),(0,f.A)(n,"slickGoTo",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e=Number(e),isNaN(e))return"";n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"index",index:e,currentSlide:n.state.currentSlide},t)}),0))})),(0,f.A)(n,"play",(function(){var e;if(n.props.rtl)e=n.state.currentSlide-n.props.slidesToScroll;else{if(!T((0,i.A)((0,i.A)({},n.props),n.state)))return!1;e=n.state.currentSlide+n.props.slidesToScroll}n.slideHandler(e)})),(0,f.A)(n,"autoPlay",(function(e){n.autoplayTimer&&clearInterval(n.autoplayTimer);var t=n.state.autoplaying;if("update"===e){if("hovered"===t||"focused"===t||"paused"===t)return}else if("leave"===e){if("paused"===t||"focused"===t)return}else if("blur"===e&&("paused"===t||"hovered"===t))return;n.autoplayTimer=setInterval(n.play,n.props.autoplaySpeed+50),n.setState({autoplaying:"playing"})})),(0,f.A)(n,"pause",(function(e){n.autoplayTimer&&(clearInterval(n.autoplayTimer),n.autoplayTimer=null);var t=n.state.autoplaying;"paused"===e?n.setState({autoplaying:"paused"}):"focused"===e?"hovered"!==t&&"playing"!==t||n.setState({autoplaying:"focused"}):"playing"===t&&n.setState({autoplaying:"hovered"})})),(0,f.A)(n,"onDotsOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onDotsLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onTrackOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onTrackLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onSlideFocus",(function(){return n.props.autoplay&&n.pause("focused")})),(0,f.A)(n,"onSlideBlur",(function(){return n.props.autoplay&&"focused"===n.state.autoplaying&&n.autoPlay("blur")})),(0,f.A)(n,"render",(function(){var e,t,a,l=b()("slick-slider",n.props.className,{"slick-vertical":n.props.vertical,"slick-initialized":!0}),c=(0,i.A)((0,i.A)({},n.props),n.state),s=R(c,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),u=n.props.pauseOnHover;if(s=(0,i.A)((0,i.A)({},s),{},{onMouseEnter:u?n.onTrackOver:null,onMouseLeave:u?n.onTrackLeave:null,onMouseOver:u?n.onTrackOver:null,focusOnSelect:n.props.focusOnSelect&&n.clickable?n.selectHandler:null}),!0===n.props.dots&&n.state.slideCount>=n.props.slidesToShow){var d=R(c,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),f=n.props.pauseOnDotsHover;d=(0,i.A)((0,i.A)({},d),{},{clickHandler:n.changeSlide,onMouseEnter:f?n.onDotsLeave:null,onMouseOver:f?n.onDotsOver:null,onMouseLeave:f?n.onDotsLeave:null}),e=r.createElement(V,d)}var p=R(c,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);p.clickHandler=n.changeSlide,n.props.arrows&&(t=r.createElement(Z,p),a=r.createElement(J,p));var v=null;n.props.vertical&&(v={height:n.state.listHeight});var m=null;!1===n.props.vertical?!0===n.props.centerMode&&(m={padding:"0px "+n.props.centerPadding}):!0===n.props.centerMode&&(m={padding:n.props.centerPadding+" 0px"});var h=(0,i.A)((0,i.A)({},v),m),g=n.props.touchMove,y={className:"slick-list",style:h,onClick:n.clickHandler,onMouseDown:g?n.swipeStart:null,onMouseMove:n.state.dragging&&g?n.swipeMove:null,onMouseUp:g?n.swipeEnd:null,onMouseLeave:n.state.dragging&&g?n.swipeEnd:null,onTouchStart:g?n.swipeStart:null,onTouchMove:n.state.dragging&&g?n.swipeMove:null,onTouchEnd:g?n.touchEnd:null,onTouchCancel:n.state.dragging&&g?n.swipeEnd:null,onKeyDown:n.props.accessibility?n.keyHandler:null},A={className:l,dir:"ltr",style:n.props.style};return n.props.unslick&&(y={className:"slick-list"},A={className:l,style:n.props.style}),r.createElement("div",A,n.props.unslick?"":t,r.createElement("div",(0,o.A)({ref:n.listRefHandler},y),r.createElement(U,(0,o.A)({ref:n.trackRefHandler},s),n.props.children)),n.props.unslick?"":a,n.props.unslick?"":e)})),n.list=null,n.track=null,n.state=(0,i.A)((0,i.A)({},m),{},{currentSlide:n.props.initialSlide,targetSlide:n.props.initialSlide?n.props.initialSlide:0,slideCount:r.Children.count(n.props.children)}),n.callbackTimers=[],n.clickable=!0,n.debouncedResize=null;var g=n.ssrInit();return n.state=(0,i.A)((0,i.A)({},n.state),g),n}return(0,d.A)(t,e),(0,l.A)(t,[{key:"didPropsChange",value:function(e){for(var t=!1,n=0,o=Object.keys(this.props);n1&&void 0!==arguments[1]&&arguments[1];return n.innerSlider.slickGoTo(e,t)})),(0,f.A)(n,"slickPause",(function(){return n.innerSlider.pause("paused")})),(0,f.A)(n,"slickPlay",(function(){return n.innerSlider.autoPlay("play")})),n.state={breakpoint:null},n._responsiveMediaHandlers=[],n}return(0,d.A)(t,e),(0,l.A)(t,[{key:"media",value:function(e,t){var n=window.matchMedia(e),r=function(e){e.matches&&t()};n.addListener(r),r(n),this._responsiveMediaHandlers.push({mql:n,query:e,listener:r})}},{key:"componentDidMount",value:function(){var e=this;if(this.props.responsive){var t=this.props.responsive.map((function(e){return e.breakpoint}));t.sort((function(e,t){return e-t})),t.forEach((function(n,r){var o;o=0===r?oe()({minWidth:0,maxWidth:n}):oe()({minWidth:t[r-1]+1,maxWidth:n}),X()&&e.media(o,(function(){e.setState({breakpoint:n})}))}));var n=oe()({minWidth:t.slice(-1)[0]});X()&&this.media(n,(function(){e.setState({breakpoint:null})}))}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach((function(e){e.mql.removeListener(e.listener)}))}},{key:"render",value:function(){var e,t,n=this;(e=this.state.breakpoint?"unslick"===(t=this.props.responsive.filter((function(e){return e.breakpoint===n.state.breakpoint})))[0].settings?"unslick":(0,i.A)((0,i.A)((0,i.A)({},y),this.props),t[0].settings):(0,i.A)((0,i.A)({},y),this.props)).centerMode&&(e.slidesToScroll,e.slidesToScroll=1),e.fade&&(e.slidesToShow,e.slidesToScroll,e.slidesToShow=1,e.slidesToScroll=1);var a=r.Children.toArray(this.props.children);a=a.filter((function(e){return"string"==typeof e?!!e.trim():!!e})),e.variableWidth&&(e.rows>1||e.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),e.variableWidth=!1);for(var l=[],c=null,s=0;s=a.length));p+=1)f.push(r.cloneElement(a[p],{key:100*s+10*d+p,tabIndex:-1,style:{width:"".concat(100/e.slidesPerRow,"%"),display:"inline-block"}}));u.push(r.createElement("div",{key:10*s+d},f))}e.variableWidth?l.push(r.createElement("div",{key:s,style:{width:c}},u)):l.push(r.createElement("div",{key:s},u))}if("unslick"===e){var v="regular slider "+(this.props.className||"");return r.createElement("div",{className:v},a)}return l.length<=e.slidesToShow&&!e.infinite&&(e.unslick=!0),r.createElement(ne,(0,o.A)({style:this.props.style,ref:this.innerSliderRefHandler},function(e){return K.reduce((function(t,n){return e.hasOwnProperty(n)&&(t[n]=e[n]),t}),{})}(e)),l)}}])}(r.Component);var ae=n(2279),le=n(1466),ce=n(5905),se=n(665),ue=n(336);const de=e=>{const{componentCls:t,antCls:n,carouselArrowSize:r,carouselDotOffset:o,marginXXS:i}=e,a=e.calc(r).mul(-1.25).equal(),l=i;return{[t]:Object.assign(Object.assign({},(0,ce.dF)(e)),{".slick-slider":{position:"relative",display:"block",boxSizing:"border-box",touchAction:"pan-y",WebkitTouchCallout:"none",WebkitTapHighlightColor:"transparent",".slick-track, .slick-list":{transform:"translate3d(0, 0, 0)",touchAction:"pan-y"}},".slick-list":{position:"relative",display:"block",margin:0,padding:0,overflow:"hidden","&:focus":{outline:"none"},"&.dragging":{cursor:"pointer"},".slick-slide":{pointerEvents:"none",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"hidden"},"&.slick-active":{pointerEvents:"auto",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"visible"}},"> div > div":{verticalAlign:"bottom"}}},".slick-track":{position:"relative",top:0,insetInlineStart:0,display:"block","&::before, &::after":{display:"table",content:'""'},"&::after":{clear:"both"}},".slick-slide":{display:"none",float:"left",height:"100%",minHeight:1,img:{display:"block"},"&.dragging img":{pointerEvents:"none"}},".slick-initialized .slick-slide":{display:"block"},".slick-vertical .slick-slide":{display:"block",height:"auto"},".slick-arrow.slick-hidden":{display:"none"},".slick-prev, .slick-next":{position:"absolute",top:"50%",display:"block",width:r,height:r,marginTop:e.calc(r).mul(-1).div(2).equal(),padding:0,color:"transparent",fontSize:0,lineHeight:0,background:"transparent",border:0,outline:"none",cursor:"pointer","&:hover, &:focus":{color:"transparent",background:"transparent",outline:"none","&::before":{opacity:1}},"&.slick-disabled::before":{opacity:.25}},".slick-prev":{insetInlineStart:a,"&::before":{content:'"\u2190"'}},".slick-next":{insetInlineEnd:a,"&::before":{content:'"\u2192"'}},".slick-dots":{position:"absolute",insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:15,display:"flex !important",justifyContent:"center",paddingInlineStart:0,margin:0,listStyle:"none","&-bottom":{bottom:o},"&-top":{top:o,bottom:"auto"},li:{position:"relative",display:"inline-block",flex:"0 1 auto",boxSizing:"content-box",width:e.dotWidth,height:e.dotHeight,marginInline:l,padding:0,textAlign:"center",textIndent:-999,verticalAlign:"top",transition:`all ${e.motionDurationSlow}`,button:{position:"relative",display:"block",width:"100%",height:e.dotHeight,padding:0,color:"transparent",fontSize:0,background:e.colorBgContainer,border:0,borderRadius:e.dotHeight,outline:"none",cursor:"pointer",opacity:.3,transition:`all ${e.motionDurationSlow}`,"&: hover, &:focus":{opacity:.75},"&::after":{position:"absolute",inset:e.calc(l).mul(-1).equal(),content:'""'}},"&.slick-active":{width:e.dotActiveWidth,"& button":{background:e.colorBgContainer,opacity:1},"&: hover, &:focus":{opacity:1}}}}})}},fe=e=>{const{componentCls:t,carouselDotOffset:n,marginXXS:r}=e,o={width:e.dotHeight,height:e.dotWidth};return{[`${t}-vertical`]:{".slick-dots":{top:"50%",bottom:"auto",flexDirection:"column",width:e.dotHeight,height:"auto",margin:0,transform:"translateY(-50%)","&-left":{insetInlineEnd:"auto",insetInlineStart:n},"&-right":{insetInlineEnd:n,insetInlineStart:"auto"},li:Object.assign(Object.assign({},o),{margin:`${(0,le.zA)(r)} 0`,verticalAlign:"baseline",button:o,"&.slick-active":Object.assign(Object.assign({},o),{button:o})})}}}},pe=e=>{const{componentCls:t}=e;return[{[`${t}-rtl`]:{direction:"rtl",".slick-dots":{[`${t}-rtl&`]:{flexDirection:"row-reverse"}}}},{[`${t}-vertical`]:{".slick-dots":{[`${t}-rtl&`]:{flexDirection:"column"}}}}]},ve=(0,se.OF)("Carousel",(e=>{const{controlHeightLG:t,controlHeightSM:n}=e,r=(0,ue.h1)(e,{carouselArrowSize:e.calc(t).div(2).equal(),carouselDotOffset:e.calc(n).div(2).equal()});return[de(r),fe(r),pe(r)]}),(()=>({dotWidth:16,dotHeight:3,dotWidthActive:24,dotActiveWidth:24})),{deprecatedTokens:[["dotWidthActive","dotActiveWidth"]]});var me=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{dots:n=!0,arrows:o=!1,draggable:i=!1,waitForAnimate:a=!1,dotPosition:l="bottom",vertical:c="left"===l||"right"===l,rootClassName:s,className:u,style:d,id:f}=e,p=me(e,["dots","arrows","draggable","waitForAnimate","dotPosition","vertical","rootClassName","className","style","id"]),{getPrefixCls:v,direction:m,carousel:h}=r.useContext(ae.QO),g=r.useRef(),y=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];g.current.slickGoTo(e,t)};r.useImperativeHandle(t,(()=>({goTo:y,autoPlay:g.current.innerSlider.autoPlay,innerSlider:g.current.innerSlider,prev:g.current.slickPrev,next:g.current.slickNext})),[g.current]);const A=r.useRef(r.Children.count(e.children));r.useEffect((()=>{A.current!==r.Children.count(e.children)&&(y(e.initialSlide||0,!1),A.current=r.Children.count(e.children))}),[e.children]);const w=Object.assign({vertical:c,className:b()(u,null==h?void 0:h.className),style:Object.assign(Object.assign({},null==h?void 0:h.style),d)},p);"fade"===w.effect&&(w.fade=!0);const S=v("carousel",w.prefixCls),x="slick-dots",C=!!n,k=b()(x,`${x}-${l}`,"boolean"!=typeof n&&(null==n?void 0:n.className)),[E,M,$]=ve(S),O=b()(S,{[`${S}-rtl`]:"rtl"===m,[`${S}-vertical`]:w.vertical},M,$,s);return E(r.createElement("div",{className:O,id:f},r.createElement(ie,Object.assign({ref:g},w,{dots:C,dotsClass:k,arrows:o,draggable:i,verticalSwiping:c,waitForAnimate:a}))))}));const ge=he},2279:(e,t,n)=>{"use strict";n.d(t,{QO:()=>r});const r=n(6540).createContext({getPrefixCls:(e,t)=>t||(e?`ant-${e}`:"ant"),iconPrefixCls:"anticon"}),{Consumer:o}=r},934:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3511);const o=e=>{const[,,,,t]=(0,r.Ay)();return t?`${e}-css-var`:""}},4016:(e,t,n)=>{"use strict";n.d(t,{A:()=>x});var r=n(6540),o=n(6942),i=n.n(o),a=n(9853);function l(e){return["small","middle","large"].includes(e)}var c=n(2279),s=n(665),u=n(336);const d=["wrap","nowrap","wrap-reverse"],f=["flex-start","flex-end","start","end","center","space-between","space-around","space-evenly","stretch","normal","left","right"],p=["center","start","end","flex-start","flex-end","self-start","self-end","baseline","normal","stretch"];const v=function(e,t){return i()(Object.assign(Object.assign(Object.assign({},((e,t)=>{const n={};return d.forEach((r=>{n[`${e}-wrap-${r}`]=t.wrap===r})),n})(e,t)),((e,t)=>{const n={};return p.forEach((r=>{n[`${e}-align-${r}`]=t.align===r})),n[`${e}-align-stretch`]=!t.align&&!!t.vertical,n})(e,t)),((e,t)=>{const n={};return f.forEach((r=>{n[`${e}-justify-${r}`]=t.justify===r})),n})(e,t)))},m=e=>{const{componentCls:t}=e;return{[t]:{display:"flex","&-vertical":{flexDirection:"column"},"&-rtl":{direction:"rtl"},"&:empty":{display:"none"}}}},h=e=>{const{componentCls:t}=e;return{[t]:{"&-gap-small":{gap:e.flexGapSM},"&-gap-middle":{gap:e.flexGap},"&-gap-large":{gap:e.flexGapLG}}}},g=e=>{const{componentCls:t}=e,n={};return d.forEach((e=>{n[`${t}-wrap-${e}`]={flexWrap:e}})),n},b=e=>{const{componentCls:t}=e,n={};return p.forEach((e=>{n[`${t}-align-${e}`]={alignItems:e}})),n},y=e=>{const{componentCls:t}=e,n={};return f.forEach((e=>{n[`${t}-justify-${e}`]={justifyContent:e}})),n},A=(0,s.OF)("Flex",(e=>{const{paddingXS:t,padding:n,paddingLG:r}=e,o=(0,u.h1)(e,{flexGapSM:t,flexGap:n,flexGapLG:r});return[m(o),h(o),g(o),b(o),y(o)]}),(()=>({})),{resetStyle:!1});var w=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{prefixCls:n,rootClassName:o,className:s,style:u,flex:d,gap:f,children:p,vertical:m=!1,component:h="div"}=e,g=w(e,["prefixCls","rootClassName","className","style","flex","gap","children","vertical","component"]),{flex:b,direction:y,getPrefixCls:S}=r.useContext(c.QO),x=S("flex",n),[C,k,E]=A(x),M=null!=m?m:null==b?void 0:b.vertical,$=i()(s,o,null==b?void 0:b.className,x,k,E,v(x,e),{[`${x}-rtl`]:"rtl"===y,[`${x}-gap-${f}`]:l(f),[`${x}-vertical`]:M}),O=Object.assign(Object.assign({},null==b?void 0:b.style),u);return d&&(O.flex=d),f&&!l(f)&&(O.gap=f),C(r.createElement(h,Object.assign({ref:t,className:$,style:O},(0,a.A)(g,["justify","wrap","align"])),p))}));const x=S},3343:(e,t,n)=>{"use strict";n.d(t,{A:()=>$t});var r=n(6540),o=n(8168);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"}}]},name:"eye",theme:"outlined"};var a=n(8046),l=function(e,t){return r.createElement(a.A,(0,o.A)({},e,{ref:t,icon:i}))};const c=r.forwardRef(l);var s=n(6942),u=n.n(s),d=n(9379),f=n(4467),p=n(6636),v=n(2284),m=n(45);function h(){return{width:document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight}}var g=n(2533),b=["crossOrigin","decoding","draggable","loading","referrerPolicy","sizes","srcSet","useMap","alt"],y=r.createContext(null),A=0;function w(e){var t=e.src,n=e.isCustomPlaceholder,o=e.fallback,i=(0,r.useState)(n?"loading":"normal"),a=(0,p.A)(i,2),l=a[0],c=a[1],s=(0,r.useRef)(!1),u="error"===l;(0,r.useEffect)((function(){var e=!0;return function(e){return new Promise((function(t){var n=document.createElement("img");n.onerror=function(){return t(!1)},n.onload=function(){return t(!0)},n.src=e}))}(t).then((function(t){!t&&e&&c("error")})),function(){e=!1}}),[t]),(0,r.useEffect)((function(){n&&!s.current?c("loading"):u&&c("normal")}),[t]);var d=function(){c("normal")};return[function(e){s.current=!1,"loading"===l&&null!=e&&e.complete&&(e.naturalWidth||e.naturalHeight)&&(s.current=!0,d())},u&&o?{src:o}:{onLoad:d,src:t},l]}var S=n(5470),x=r.createContext({}),C=n(4808),k=n(6855),E=n(6928),M="".concat("accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap"," ").concat("onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError").split(/[\s\n]+/),$="aria-",O="data-";function T(e,t){return 0===e.indexOf(t)}function R(e){var t,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t=!1===n?{aria:!0,data:!0,attr:!0}:!0===n?{aria:!0}:(0,d.A)({},n);var r={};return Object.keys(e).forEach((function(n){(t.aria&&("role"===n||T(n,$))||t.data&&T(n,O)||t.attr&&M.includes(n))&&(r[n]=e[n])})),r}function z(e,t,n){var r=t;return!r&&n&&(r="".concat(e,"-").concat(n)),r}function P(e,t){var n=e["page".concat(t?"Y":"X","Offset")],r="scroll".concat(t?"Top":"Left");if("number"!=typeof n){var o=e.document;"number"!=typeof(n=o.documentElement[r])&&(n=o.body[r])}return n}var N=n(8542),I=n(8719);const L=r.memo((function(e){return e.children}),(function(e,t){return!t.shouldUpdate}));var j={width:0,height:0,overflow:"hidden",outline:"none"},_={outline:"none"},H=r.forwardRef((function(e,t){var n=e.prefixCls,i=e.className,a=e.style,l=e.title,c=e.ariaId,s=e.footer,f=e.closable,p=e.closeIcon,m=e.onClose,h=e.children,g=e.bodyStyle,b=e.bodyProps,y=e.modalRender,A=e.onMouseDown,w=e.onMouseUp,S=e.holderRef,C=e.visible,k=e.forceRender,E=e.width,M=e.height,$=e.classNames,O=e.styles,T=r.useContext(x).panel,z=(0,I.xK)(S,T),P=(0,r.useRef)(),N=(0,r.useRef)(),H=(0,r.useRef)();r.useImperativeHandle(t,(function(){return{focus:function(){var e;null===(e=H.current)||void 0===e||e.focus()},changeActive:function(e){var t=document.activeElement;e&&t===N.current?P.current.focus():e||t!==P.current||N.current.focus()}}}));var D,B,W={};void 0!==E&&(W.width=E),void 0!==M&&(W.height=M),s&&(D=r.createElement("div",{className:u()("".concat(n,"-footer"),null==$?void 0:$.footer),style:(0,d.A)({},null==O?void 0:O.footer)},s)),l&&(B=r.createElement("div",{className:u()("".concat(n,"-header"),null==$?void 0:$.header),style:(0,d.A)({},null==O?void 0:O.header)},r.createElement("div",{className:"".concat(n,"-title"),id:c},l)));var F,X=(0,r.useMemo)((function(){return"object"===(0,v.A)(f)&&null!==f?f:f?{closeIcon:null!=p?p:r.createElement("span",{className:"".concat(n,"-close-x")})}:{}}),[f,p]),K=R(X,!0);f&&(F=r.createElement("button",(0,o.A)({type:"button",onClick:m,"aria-label":"Close"},K,{className:"".concat(n,"-close")}),X.closeIcon));var G=r.createElement("div",{className:u()("".concat(n,"-content"),null==$?void 0:$.content),style:null==O?void 0:O.content},F,B,r.createElement("div",(0,o.A)({className:u()("".concat(n,"-body"),null==$?void 0:$.body),style:(0,d.A)((0,d.A)({},g),null==O?void 0:O.body)},b),h),D);return r.createElement("div",{key:"dialog-element",role:"dialog","aria-labelledby":l?c:null,"aria-modal":"true",ref:z,style:(0,d.A)((0,d.A)({},a),W),className:u()(n,i),onMouseDown:A,onMouseUp:w},r.createElement("div",{tabIndex:0,ref:P,style:j,"aria-hidden":"true"}),r.createElement("div",{ref:H,tabIndex:-1,style:_},r.createElement(L,{shouldUpdate:C||k},y?y(G):G)),r.createElement("div",{tabIndex:0,ref:N,style:j,"aria-hidden":"true"}))}));const D=H;var B=r.forwardRef((function(e,t){var n=e.prefixCls,i=e.title,a=e.style,l=e.className,c=e.visible,s=e.forceRender,f=e.destroyOnClose,v=e.motionName,m=e.ariaId,h=e.onVisibleChanged,g=e.mousePosition,b=(0,r.useRef)(),y=r.useState(),A=(0,p.A)(y,2),w=A[0],S=A[1],x={};function C(){var e,t,n,r,o,i=(e=b.current,t=e.getBoundingClientRect(),n={left:t.left,top:t.top},r=e.ownerDocument,o=r.defaultView||r.parentWindow,n.left+=P(o),n.top+=P(o,!0),n);S(g?"".concat(g.x-i.left,"px ").concat(g.y-i.top,"px"):"")}return w&&(x.transformOrigin=w),r.createElement(N.Ay,{visible:c,onVisibleChanged:h,onAppearPrepare:C,onEnterPrepare:C,forceRender:s,motionName:v,removeOnLeave:f,ref:b},(function(c,s){var f=c.className,p=c.style;return r.createElement(D,(0,o.A)({},e,{ref:t,title:i,ariaId:m,prefixCls:n,holderRef:s,style:(0,d.A)((0,d.A)((0,d.A)({},p),a),x),className:u()(l,f)}))}))}));B.displayName="Content";const W=B;function F(e){var t=e.prefixCls,n=e.style,i=e.visible,a=e.maskProps,l=e.motionName,c=e.className;return r.createElement(N.Ay,{key:"mask",visible:i,motionName:l,leavedClassName:"".concat(t,"-mask-hidden")},(function(e,i){var l=e.className,s=e.style;return r.createElement("div",(0,o.A)({ref:i,style:(0,d.A)((0,d.A)({},s),n),className:u()("".concat(t,"-mask"),l,c)},a))}))}var X=n(8210);function K(e){var t=e.prefixCls,n=void 0===t?"rc-dialog":t,i=e.zIndex,a=e.visible,l=void 0!==a&&a,c=e.keyboard,s=void 0===c||c,f=e.focusTriggerAfterClose,v=void 0===f||f,m=e.wrapStyle,h=e.wrapClassName,g=e.wrapProps,b=e.onClose,y=e.afterOpenChange,A=e.afterClose,w=e.transitionName,S=e.animation,x=e.closable,M=void 0===x||x,$=e.mask,O=void 0===$||$,T=e.maskTransitionName,P=e.maskAnimation,N=e.maskClosable,I=void 0===N||N,L=e.maskStyle,j=e.maskProps,_=e.rootClassName,H=e.classNames,D=e.styles;var B=(0,r.useRef)(),X=(0,r.useRef)(),K=(0,r.useRef)(),G=r.useState(l),q=(0,p.A)(G,2),Y=q[0],U=q[1],V=(0,k.A)();function Q(e){null==b||b(e)}var Z=(0,r.useRef)(!1),J=(0,r.useRef)(),ee=null;return I&&(ee=function(e){Z.current?Z.current=!1:X.current===e.target&&Q(e)}),(0,r.useEffect)((function(){l&&(U(!0),(0,C.A)(X.current,document.activeElement)||(B.current=document.activeElement))}),[l]),(0,r.useEffect)((function(){return function(){clearTimeout(J.current)}}),[]),r.createElement("div",(0,o.A)({className:u()("".concat(n,"-root"),_)},R(e,{data:!0})),r.createElement(F,{prefixCls:n,visible:O&&l,motionName:z(n,T,P),style:(0,d.A)((0,d.A)({zIndex:i},L),null==D?void 0:D.mask),maskProps:j,className:null==H?void 0:H.mask}),r.createElement("div",(0,o.A)({tabIndex:-1,onKeyDown:function(e){if(s&&e.keyCode===E.A.ESC)return e.stopPropagation(),void Q(e);l&&e.keyCode===E.A.TAB&&K.current.changeActive(!e.shiftKey)},className:u()("".concat(n,"-wrap"),h,null==H?void 0:H.wrapper),ref:X,onClick:ee,style:(0,d.A)((0,d.A)((0,d.A)({zIndex:i},m),null==D?void 0:D.wrapper),{},{display:Y?null:"none"})},g),r.createElement(W,(0,o.A)({},e,{onMouseDown:function(){clearTimeout(J.current),Z.current=!0},onMouseUp:function(){J.current=setTimeout((function(){Z.current=!1}))},ref:K,closable:M,ariaId:V,prefixCls:n,visible:l&&Y,onClose:Q,onVisibleChanged:function(e){if(e)(0,C.A)(X.current,document.activeElement)||null===(t=K.current)||void 0===t||t.focus();else{if(U(!1),O&&B.current&&v){try{B.current.focus({preventScroll:!0})}catch(n){}B.current=null}Y&&(null==A||A())}var t;null==y||y(e)},motionName:z(n,w,S)}))))}var G=function(e){var t=e.visible,n=e.getContainer,i=e.forceRender,a=e.destroyOnClose,l=void 0!==a&&a,c=e.afterClose,s=e.panelRef,u=r.useState(t),d=(0,p.A)(u,2),f=d[0],v=d[1],m=r.useMemo((function(){return{panel:s}}),[s]);return r.useEffect((function(){t&&v(!0)}),[t]),i||!l||f?r.createElement(x.Provider,{value:m},r.createElement(S.A,{open:t||i||f,autoDestroy:!1,getContainer:n,autoLock:t||f},r.createElement(K,(0,o.A)({},e,{destroyOnClose:l,afterClose:function(){null==c||c(),v(!1)}})))):null};G.displayName="Dialog";const q=G;var Y=n(961);function U(e,t,n,r){var o=Y.unstable_batchedUpdates?function(e){Y.unstable_batchedUpdates(n,e)}:n;return null!=e&&e.addEventListener&&e.addEventListener(t,o,r),{remove:function(){null!=e&&e.removeEventListener&&e.removeEventListener(t,o,r)}}}var V=n(3210),Q=n(5371),Z={x:0,y:0,rotate:0,scale:1,flipX:!1,flipY:!1};function J(e,t,n,r){var o=t+n,i=(n-r)/2;if(n>r){if(t>0)return(0,f.A)({},e,i);if(t<0&&or)return(0,f.A)({},e,t<0?i:-i);return{}}function ee(e,t,n,r){var o=h(),i=o.width,a=o.height,l=null;return e<=i&&t<=a?l={x:0,y:0}:(e>i||t>a)&&(l=(0,d.A)((0,d.A)({},J("x",n,e,i)),J("y",r,t,a))),l}function te(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.hypot(n,r)}function ne(e,t,n,o,i,a,l){var c=i.rotate,s=i.scale,u=i.x,f=i.y,v=(0,r.useState)(!1),m=(0,p.A)(v,2),h=m[0],g=m[1],b=(0,r.useRef)({point1:{x:0,y:0},point2:{x:0,y:0},eventType:"none"}),y=function(e){b.current=(0,d.A)((0,d.A)({},b.current),e)};return(0,r.useEffect)((function(){var e;return n&&t&&(e=U(window,"touchmove",(function(e){return e.preventDefault()}),{passive:!1})),function(){var t;null===(t=e)||void 0===t||t.remove()}}),[n,t]),{isTouching:h,onTouchStart:function(e){if(t){e.stopPropagation(),g(!0);var n=e.touches,r=void 0===n?[]:n;r.length>1?y({point1:{x:r[0].clientX,y:r[0].clientY},point2:{x:r[1].clientX,y:r[1].clientY},eventType:"touchZoom"}):y({point1:{x:r[0].clientX-u,y:r[0].clientY-f},eventType:"move"})}},onTouchMove:function(e){var t=e.touches,n=void 0===t?[]:t,r=b.current,o=r.point1,i=r.point2,c=r.eventType;if(n.length>1&&"touchZoom"===c){var s={x:n[0].clientX,y:n[0].clientY},u={x:n[1].clientX,y:n[1].clientY},d=function(e,t,n,r){var o=te(e,n),i=te(t,r);if(0===o&&0===i)return[e.x,e.y];var a=o/(o+i);return[e.x+a*(t.x-e.x),e.y+a*(t.y-e.y)]}(o,i,s,u),f=(0,p.A)(d,2),v=f[0],m=f[1],h=te(s,u)/te(o,i);l(h,"touchZoom",v,m,!0),y({point1:s,point2:u,eventType:"touchZoom"})}else"move"===c&&(a({x:n[0].clientX-o.x,y:n[0].clientY-o.y},"move"),y({eventType:"move"}))},onTouchEnd:function(){if(n){if(h&&g(!1),y({eventType:"none"}),o>s)return a({x:0,y:0,scale:o},"touchZoom");var t=e.current.offsetWidth*s,r=e.current.offsetHeight*s,i=e.current.getBoundingClientRect(),l=i.left,u=i.top,f=c%180!=0,p=ee(f?r:t,f?t:r,l,u);p&&a((0,d.A)({},p),"dragRebound")}}}}const re=function(e){var t=e.visible,n=e.maskTransitionName,o=e.getContainer,i=e.prefixCls,a=e.rootClassName,l=e.icons,c=e.countRender,s=e.showSwitch,p=e.showProgress,v=e.current,m=e.transform,h=e.count,g=e.scale,b=e.minScale,A=e.maxScale,w=e.closeIcon,x=e.onSwitchLeft,C=e.onSwitchRight,k=e.onClose,M=e.onZoomIn,$=e.onZoomOut,O=e.onRotateRight,T=e.onRotateLeft,R=e.onFlipX,z=e.onFlipY,P=e.toolbarRender,I=e.zIndex,L=(0,r.useContext)(y),j=l.rotateLeft,_=l.rotateRight,H=l.zoomIn,D=l.zoomOut,B=l.close,W=l.left,F=l.right,X=l.flipX,K=l.flipY,G="".concat(i,"-operations-operation");r.useEffect((function(){var e=function(e){e.keyCode===E.A.ESC&&k()};return t&&window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t]);var q=[{icon:K,onClick:z,type:"flipY"},{icon:X,onClick:R,type:"flipX"},{icon:j,onClick:T,type:"rotateLeft"},{icon:_,onClick:O,type:"rotateRight"},{icon:D,onClick:$,type:"zoomOut",disabled:g<=b},{icon:H,onClick:M,type:"zoomIn",disabled:g===A}].map((function(e){var t,n=e.icon,o=e.onClick,a=e.type,l=e.disabled;return r.createElement("div",{className:u()(G,(t={},(0,f.A)(t,"".concat(i,"-operations-operation-").concat(a),!0),(0,f.A)(t,"".concat(i,"-operations-operation-disabled"),!!l),t)),onClick:o,key:a},n)})),Y=r.createElement("div",{className:"".concat(i,"-operations")},q);return r.createElement(N.Ay,{visible:t,motionName:n},(function(e){var t=e.className,n=e.style;return r.createElement(S.A,{open:!0,getContainer:null!=o?o:document.body},r.createElement("div",{className:u()("".concat(i,"-operations-wrapper"),t,a),style:(0,d.A)((0,d.A)({},n),{},{zIndex:I})},null===w?null:r.createElement("button",{className:"".concat(i,"-close"),onClick:k},w||B),s&&r.createElement(r.Fragment,null,r.createElement("div",{className:u()("".concat(i,"-switch-left"),(0,f.A)({},"".concat(i,"-switch-left-disabled"),0===v)),onClick:x},W),r.createElement("div",{className:u()("".concat(i,"-switch-right"),(0,f.A)({},"".concat(i,"-switch-right-disabled"),v===h-1)),onClick:C},F)),r.createElement("div",{className:"".concat(i,"-footer")},p&&r.createElement("div",{className:"".concat(i,"-progress")},c?c(v+1,h):"".concat(v+1," / ").concat(h)),P?P(Y,(0,d.A)({icons:{flipYIcon:q[0],flipXIcon:q[1],rotateLeftIcon:q[2],rotateRightIcon:q[3],zoomOutIcon:q[4],zoomInIcon:q[5]},actions:{onFlipY:z,onFlipX:R,onRotateLeft:T,onRotateRight:O,onZoomOut:$,onZoomIn:M},transform:m},L?{current:v,total:h}:{})):Y)))}))};var oe=["fallback","src","imgRef"],ie=["prefixCls","src","alt","fallback","movable","onClose","visible","icons","rootClassName","closeIcon","getContainer","current","count","countRender","scaleStep","minScale","maxScale","transitionName","maskTransitionName","imageRender","imgCommonProps","toolbarRender","onTransform","onChange"],ae=function(e){var t=e.fallback,n=e.src,i=e.imgRef,a=(0,m.A)(e,oe),l=w({src:n,fallback:t}),c=(0,p.A)(l,2),s=c[0],u=c[1];return r.createElement("img",(0,o.A)({ref:function(e){i.current=e,s(e)}},a,u))};const le=function(e){var t=e.prefixCls,n=e.src,i=e.alt,a=e.fallback,l=e.movable,c=void 0===l||l,s=e.onClose,v=e.visible,g=e.icons,b=void 0===g?{}:g,A=e.rootClassName,w=e.closeIcon,S=e.getContainer,x=e.current,C=void 0===x?0:x,k=e.count,M=void 0===k?1:k,$=e.countRender,O=e.scaleStep,T=void 0===O?.5:O,R=e.minScale,z=void 0===R?1:R,P=e.maxScale,N=void 0===P?50:P,I=e.transitionName,L=void 0===I?"zoom":I,j=e.maskTransitionName,_=void 0===j?"fade":j,H=e.imageRender,D=e.imgCommonProps,B=e.toolbarRender,W=e.onTransform,F=e.onChange,K=(0,m.A)(e,ie),G=(0,r.useRef)(),Y=(0,r.useContext)(y),J=Y&&M>1,te=Y&&M>=1,oe=(0,r.useState)(!0),le=(0,p.A)(oe,2),ce=le[0],se=le[1],ue=function(e,t,n,o){var i=(0,r.useRef)(null),a=(0,r.useRef)([]),l=(0,r.useState)(Z),c=(0,p.A)(l,2),s=c[0],u=c[1],f=function(e,t){null===i.current&&(a.current=[],i.current=(0,Q.A)((function(){u((function(e){var n=e;return a.current.forEach((function(e){n=(0,d.A)((0,d.A)({},n),e)})),i.current=null,null==o||o({transform:n,action:t}),n}))}))),a.current.push((0,d.A)((0,d.A)({},s),e))};return{transform:s,resetTransform:function(e){u(Z),o&&!(0,V.A)(Z,s)&&o({transform:Z,action:e})},updateTransform:f,dispatchZoomChange:function(r,o,i,a,l){var c=e.current,u=c.width,d=c.height,p=c.offsetWidth,v=c.offsetHeight,m=c.offsetLeft,g=c.offsetTop,b=r,y=s.scale*r;y>n?(y=n,b=n/s.scale):y0&&(r=1/r),l(r,"wheel",e.clientX,e.clientY)}}}}(G,c,v,T,de,pe,ve),he=me.isMoving,ge=me.onMouseDown,be=me.onWheel,ye=ne(G,c,v,z,de,pe,ve),Ae=ye.isTouching,we=ye.onTouchStart,Se=ye.onTouchMove,xe=ye.onTouchEnd,Ce=de.rotate,ke=de.scale,Ee=u()((0,f.A)({},"".concat(t,"-moving"),he));(0,r.useEffect)((function(){ce||se(!0)}),[ce]);var Me=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),C>0&&(se(!1),fe("prev"),null==F||F(C-1,C))},$e=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),C1&&void 0!==arguments[1]&&arguments[1];const{antCls:n}=e,r=`${n}-fade`,o=t?"&":"";return[(0,Ze.b)(r,Je,et,e.motionDurationMid,t),{[`\n ${o}${r}-enter,\n ${o}${r}-appear\n `]:{opacity:0,animationTimingFunction:"linear"},[`${o}${r}-leave`]:{animationTimingFunction:"linear"}}]},nt=new Ue.Mo("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),rt=new Ue.Mo("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),ot=new Ue.Mo("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),it=new Ue.Mo("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),at=new Ue.Mo("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),lt=new Ue.Mo("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),ct={zoom:{inKeyframes:nt,outKeyframes:rt},"zoom-big":{inKeyframes:ot,outKeyframes:it},"zoom-big-fast":{inKeyframes:ot,outKeyframes:it},"zoom-left":{inKeyframes:new Ue.Mo("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),outKeyframes:new Ue.Mo("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}})},"zoom-right":{inKeyframes:new Ue.Mo("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),outKeyframes:new Ue.Mo("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}})},"zoom-up":{inKeyframes:at,outKeyframes:lt},"zoom-down":{inKeyframes:new Ue.Mo("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),outKeyframes:new Ue.Mo("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}})}},st=(e,t)=>{const{antCls:n}=e,r=`${n}-${t}`,{inKeyframes:o,outKeyframes:i}=ct[t];return[(0,Ze.b)(r,o,i,"zoom-big-fast"===t?e.motionDurationFast:e.motionDurationMid),{[`\n ${r}-enter,\n ${r}-appear\n `]:{transform:"scale(0)",opacity:0,animationTimingFunction:e.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${r}-leave`]:{animationTimingFunction:e.motionEaseInOutCirc}}]};var ut=n(336),dt=n(665);function ft(e){return{position:e,inset:0}}const pt=e=>{const{componentCls:t,antCls:n}=e;return[{[`${t}-root`]:{[`${t}${n}-zoom-enter, ${t}${n}-zoom-appear`]:{transform:"none",opacity:0,animationDuration:e.motionDurationSlow,userSelect:"none"},[`${t}${n}-zoom-leave ${t}-content`]:{pointerEvents:"none"},[`${t}-mask`]:Object.assign(Object.assign({},ft("fixed")),{zIndex:e.zIndexPopupBase,height:"100%",backgroundColor:e.colorBgMask,pointerEvents:"none",[`${t}-hidden`]:{display:"none"}}),[`${t}-wrap`]:Object.assign(Object.assign({},ft("fixed")),{zIndex:e.zIndexPopupBase,overflow:"auto",outline:0,WebkitOverflowScrolling:"touch"})}},{[`${t}-root`]:tt(e)}]},vt=e=>{const{componentCls:t}=e;return[{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl"},[`${t}-centered`]:{textAlign:"center","&::before":{display:"inline-block",width:0,height:"100%",verticalAlign:"middle",content:'""'},[t]:{top:0,display:"inline-block",paddingBottom:0,textAlign:"start",verticalAlign:"middle"}},[`@media (max-width: ${e.screenSMMax}px)`]:{[t]:{maxWidth:"calc(100vw - 16px)",margin:`${(0,Ue.zA)(e.marginXS)} auto`},[`${t}-centered`]:{[t]:{flex:1}}}}},{[t]:Object.assign(Object.assign({},(0,Qe.dF)(e)),{pointerEvents:"none",position:"relative",top:100,width:"auto",maxWidth:`calc(100vw - ${(0,Ue.zA)(e.calc(e.margin).mul(2).equal())})`,margin:"0 auto",paddingBottom:e.paddingLG,[`${t}-title`]:{margin:0,color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.titleFontSize,lineHeight:e.titleLineHeight,wordWrap:"break-word"},[`${t}-content`]:{position:"relative",backgroundColor:e.contentBg,backgroundClip:"padding-box",border:0,borderRadius:e.borderRadiusLG,boxShadow:e.boxShadow,pointerEvents:"auto",padding:e.contentPadding},[`${t}-close`]:Object.assign({position:"absolute",top:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),insetInlineEnd:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),zIndex:e.calc(e.zIndexPopupBase).add(10).equal(),padding:0,color:e.modalCloseIconColor,fontWeight:e.fontWeightStrong,lineHeight:1,textDecoration:"none",background:"transparent",borderRadius:e.borderRadiusSM,width:e.modalCloseBtnSize,height:e.modalCloseBtnSize,border:0,outline:0,cursor:"pointer",transition:`color ${e.motionDurationMid}, background-color ${e.motionDurationMid}`,"&-x":{display:"flex",fontSize:e.fontSizeLG,fontStyle:"normal",lineHeight:`${(0,Ue.zA)(e.modalCloseBtnSize)}`,justifyContent:"center",textTransform:"none",textRendering:"auto"},"&:hover":{color:e.modalCloseIconHoverColor,backgroundColor:e.colorBgTextHover,textDecoration:"none"},"&:active":{backgroundColor:e.colorBgTextActive}},(0,Qe.K8)(e)),[`${t}-header`]:{color:e.colorText,background:e.headerBg,borderRadius:`${(0,Ue.zA)(e.borderRadiusLG)} ${(0,Ue.zA)(e.borderRadiusLG)} 0 0`,marginBottom:e.headerMarginBottom,padding:e.headerPadding,borderBottom:e.headerBorderBottom},[`${t}-body`]:{fontSize:e.fontSize,lineHeight:e.lineHeight,wordWrap:"break-word",padding:e.bodyPadding},[`${t}-footer`]:{textAlign:"end",background:e.footerBg,marginTop:e.footerMarginTop,padding:e.footerPadding,borderTop:e.footerBorderTop,borderRadius:e.footerBorderRadius,[`> ${e.antCls}-btn + ${e.antCls}-btn`]:{marginInlineStart:e.marginXS}},[`${t}-open`]:{overflow:"hidden"}})},{[`${t}-pure-panel`]:{top:"auto",padding:0,display:"flex",flexDirection:"column",[`${t}-content,\n ${t}-body,\n ${t}-confirm-body-wrapper`]:{display:"flex",flexDirection:"column",flex:"auto"},[`${t}-confirm-body`]:{marginBottom:"auto"}}}]},mt=e=>{const{componentCls:t}=e;return{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl",[`${t}-confirm-body`]:{direction:"rtl"}}}}},ht=((0,dt.OF)("Modal",(e=>{const t=(e=>{const t=e.padding,n=e.fontSizeHeading5,r=e.lineHeightHeading5;return(0,ut.h1)(e,{modalHeaderHeight:e.calc(e.calc(r).mul(n).equal()).add(e.calc(t).mul(2).equal()).equal(),modalFooterBorderColorSplit:e.colorSplit,modalFooterBorderStyle:e.lineType,modalFooterBorderWidth:e.lineWidth,modalCloseIconColor:e.colorIcon,modalCloseIconHoverColor:e.colorIconHover,modalCloseBtnSize:e.controlHeight,modalConfirmIconSize:e.fontHeight,modalTitleHeight:e.calc(e.titleFontSize).mul(e.titleLineHeight).equal()})})(e);return[vt(t),mt(t),pt(t),st(t,"zoom")]}),(e=>({footerBg:"transparent",headerBg:e.colorBgElevated,titleLineHeight:e.lineHeightHeading5,titleFontSize:e.fontSizeHeading5,contentBg:e.colorBgElevated,titleColor:e.colorTextHeading,contentPadding:e.wireframe?0:`${(0,Ue.zA)(e.paddingMD)} ${(0,Ue.zA)(e.paddingContentHorizontalLG)}`,headerPadding:e.wireframe?`${(0,Ue.zA)(e.padding)} ${(0,Ue.zA)(e.paddingLG)}`:0,headerBorderBottom:e.wireframe?`${(0,Ue.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",headerMarginBottom:e.wireframe?0:e.marginXS,bodyPadding:e.wireframe?e.paddingLG:0,footerPadding:e.wireframe?`${(0,Ue.zA)(e.paddingXS)} ${(0,Ue.zA)(e.padding)}`:0,footerBorderTop:e.wireframe?`${(0,Ue.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",footerBorderRadius:e.wireframe?`0 0 ${(0,Ue.zA)(e.borderRadiusLG)} ${(0,Ue.zA)(e.borderRadiusLG)}`:0,footerMarginTop:e.wireframe?0:e.marginSM,confirmBodyPadding:e.wireframe?`${(0,Ue.zA)(2*e.padding)} ${(0,Ue.zA)(2*e.padding)} ${(0,Ue.zA)(e.paddingLG)}`:0,confirmIconMarginInlineEnd:e.wireframe?e.margin:e.marginSM,confirmBtnsMarginTop:e.wireframe?e.marginLG:e.marginSM})),{unitless:{titleLineHeight:!0}}),e=>({position:e||"absolute",inset:0})),gt=e=>{const{iconCls:t,motionDurationSlow:n,paddingXXS:r,marginXXS:o,prefixCls:i,colorTextLightSolid:a}=e;return{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",color:a,background:new Ve.q("#000").setAlpha(.5).toRgbString(),cursor:"pointer",opacity:0,transition:`opacity ${n}`,[`.${i}-mask-info`]:Object.assign(Object.assign({},Qe.L9),{padding:`0 ${(0,Ue.zA)(r)}`,[t]:{marginInlineEnd:o,svg:{verticalAlign:"baseline"}}})}},bt=e=>{const{previewCls:t,modalMaskBg:n,paddingSM:r,marginXL:o,margin:i,paddingLG:a,previewOperationColorDisabled:l,previewOperationHoverColor:c,motionDurationSlow:s,iconCls:u,colorTextLightSolid:d}=e,f=new Ve.q(n).setAlpha(.1),p=f.clone().setAlpha(.2);return{[`${t}-footer`]:{position:"fixed",bottom:o,left:{_skip_check_:!0,value:0},width:"100%",display:"flex",flexDirection:"column",alignItems:"center",color:e.previewOperationColor},[`${t}-progress`]:{marginBottom:i},[`${t}-close`]:{position:"fixed",top:o,right:{_skip_check_:!0,value:o},display:"flex",color:d,backgroundColor:f.toRgbString(),borderRadius:"50%",padding:r,outline:0,border:0,cursor:"pointer",transition:`all ${s}`,"&:hover":{backgroundColor:p.toRgbString()},[`& > ${u}`]:{fontSize:e.previewOperationSize}},[`${t}-operations`]:{display:"flex",alignItems:"center",padding:`0 ${(0,Ue.zA)(a)}`,backgroundColor:f.toRgbString(),borderRadius:100,"&-operation":{marginInlineStart:r,padding:r,cursor:"pointer",transition:`all ${s}`,userSelect:"none",[`&:not(${t}-operations-operation-disabled):hover > ${u}`]:{color:c},"&-disabled":{color:l,cursor:"not-allowed"},"&:first-of-type":{marginInlineStart:0},[`& > ${u}`]:{fontSize:e.previewOperationSize}}}}},yt=e=>{const{modalMaskBg:t,iconCls:n,previewOperationColorDisabled:r,previewCls:o,zIndexPopup:i,motionDurationSlow:a}=e,l=new Ve.q(t).setAlpha(.1),c=l.clone().setAlpha(.2);return{[`${o}-switch-left, ${o}-switch-right`]:{position:"fixed",insetBlockStart:"50%",zIndex:e.calc(i).add(1).equal({unit:!1}),display:"flex",alignItems:"center",justifyContent:"center",width:e.imagePreviewSwitchSize,height:e.imagePreviewSwitchSize,marginTop:e.calc(e.imagePreviewSwitchSize).mul(-1).div(2).equal(),color:e.previewOperationColor,background:l.toRgbString(),borderRadius:"50%",transform:"translateY(-50%)",cursor:"pointer",transition:`all ${a}`,userSelect:"none","&:hover":{background:c.toRgbString()},"&-disabled":{"&, &:hover":{color:r,background:"transparent",cursor:"not-allowed",[`> ${n}`]:{cursor:"not-allowed"}}},[`> ${n}`]:{fontSize:e.previewOperationSize}},[`${o}-switch-left`]:{insetInlineStart:e.marginSM},[`${o}-switch-right`]:{insetInlineEnd:e.marginSM}}},At=e=>{const{motionEaseOut:t,previewCls:n,motionDurationSlow:r,componentCls:o}=e;return[{[`${o}-preview-root`]:{[n]:{height:"100%",textAlign:"center",pointerEvents:"none"},[`${n}-body`]:Object.assign(Object.assign({},ht()),{overflow:"hidden"}),[`${n}-img`]:{maxWidth:"100%",maxHeight:"70%",verticalAlign:"middle",transform:"scale3d(1, 1, 1)",cursor:"grab",transition:`transform ${r} ${t} 0s`,userSelect:"none","&-wrapper":Object.assign(Object.assign({},ht()),{transition:`transform ${r} ${t} 0s`,display:"flex",justifyContent:"center",alignItems:"center","& > *":{pointerEvents:"auto"},"&::before":{display:"inline-block",width:1,height:"50%",marginInlineEnd:-1,content:'""'}})},[`${n}-moving`]:{[`${n}-preview-img`]:{cursor:"grabbing","&-wrapper":{transitionDuration:"0s"}}}}},{[`${o}-preview-root`]:{[`${n}-wrap`]:{zIndex:e.zIndexPopup}}},{[`${o}-preview-operations-wrapper`]:{position:"fixed",zIndex:e.calc(e.zIndexPopup).add(1).equal({unit:!1})},"&":[bt(e),yt(e)]}]},wt=e=>{const{componentCls:t}=e;return{[t]:{position:"relative",display:"inline-block",[`${t}-img`]:{width:"100%",height:"auto",verticalAlign:"middle"},[`${t}-img-placeholder`]:{backgroundColor:e.colorBgContainerDisabled,backgroundImage:"url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=')",backgroundRepeat:"no-repeat",backgroundPosition:"center center",backgroundSize:"30%"},[`${t}-mask`]:Object.assign({},gt(e)),[`${t}-mask:hover`]:{opacity:1},[`${t}-placeholder`]:Object.assign({},ht())}}},St=e=>{const{previewCls:t}=e;return{[`${t}-root`]:st(e,"zoom"),"&":tt(e,!0)}},xt=(0,dt.OF)("Image",(e=>{const t=`${e.componentCls}-preview`,n=(0,ut.h1)(e,{previewCls:t,modalMaskBg:new Ve.q("#000").setAlpha(.45).toRgbString(),imagePreviewSwitchSize:e.controlHeightLG});return[wt(n),At(n),pt((0,ut.h1)(n,{componentCls:t})),St(n)]}),(e=>({zIndexPopup:e.zIndexPopupBase+80,previewOperationColor:new Ve.q(e.colorTextLightSolid).setAlpha(.65).toRgbString(),previewOperationHoverColor:new Ve.q(e.colorTextLightSolid).setAlpha(.85).toRgbString(),previewOperationColorDisabled:new Ve.q(e.colorTextLightSolid).setAlpha(.25).toRgbString(),previewOperationSize:1.5*e.fontSizeIcon})));var Ct=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{var t;const{prefixCls:n,preview:o,className:i,rootClassName:a,style:l}=e,s=Et(e,["prefixCls","preview","className","rootClassName","style"]),{getPrefixCls:d,locale:f=Te,getPopupContainer:p,image:v}=r.useContext(xe.QO),m=d("image",n),h=d(),g=f.Image||Te.Image,b=(0,Ce.A)(m),[y,A,w]=xt(m,b),S=u()(a,A,w,b),x=u()(i,A,null==v?void 0:v.className),[C]=we("ImagePreview","object"==typeof o?o.zIndex:void 0),k=r.useMemo((()=>{var e;if(!1===o)return o;const t="object"==typeof o?o:{},{getContainer:n,closeIcon:i}=t,a=Et(t,["getContainer","closeIcon"]);return Object.assign(Object.assign({mask:r.createElement("div",{className:`${m}-mask-info`},r.createElement(c,null),null==g?void 0:g.preview),icons:kt},a),{getContainer:null!=n?n:p,transitionName:(0,Se.b)(h,"zoom",t.transitionName),maskTransitionName:(0,Se.b)(h,"fade",t.maskTransitionName),zIndex:C,closeIcon:null!=i?i:null===(e=null==v?void 0:v.preview)||void 0===e?void 0:e.closeIcon})}),[o,g,null===(t=null==v?void 0:v.preview)||void 0===t?void 0:t.closeIcon]),E=Object.assign(Object.assign({},null==v?void 0:v.style),l);return y(r.createElement(me,Object.assign({prefixCls:m,preview:k,rootClassName:S,className:x,style:E},s)))};Mt.PreviewGroup=e=>{var{previewPrefixCls:t,preview:n}=e,o=Ct(e,["previewPrefixCls","preview"]);const{getPrefixCls:i}=r.useContext(xe.QO),a=i("image",t),l=`${a}-preview`,c=i(),s=(0,Ce.A)(a),[d,f,p]=xt(a,s),[v]=we("ImagePreview","object"==typeof n?n.zIndex:void 0),m=r.useMemo((()=>{var e;if(!1===n)return n;const t="object"==typeof n?n:{},r=u()(f,p,s,null!==(e=t.rootClassName)&&void 0!==e?e:"");return Object.assign(Object.assign({},t),{transitionName:(0,Se.b)(c,"zoom",t.transitionName),maskTransitionName:(0,Se.b)(c,"fade",t.maskTransitionName),rootClassName:r,zIndex:v})}),[n]);return d(r.createElement(me.PreviewGroup,Object.assign({preview:m,previewPrefixCls:l,icons:kt},o)))};const $t=Mt},5905:(e,t,n)=>{"use strict";n.d(t,{K8:()=>d,L9:()=>o,Nk:()=>a,av:()=>c,dF:()=>i,t6:()=>l,vj:()=>s});var r=n(1466);const o={overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"},i=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{boxSizing:"border-box",margin:0,padding:0,color:e.colorText,fontSize:e.fontSize,lineHeight:e.lineHeight,listStyle:"none",fontFamily:t?"inherit":e.fontFamily}},a=()=>({display:"inline-flex",alignItems:"center",color:"inherit",fontStyle:"normal",lineHeight:0,textAlign:"center",textTransform:"none",verticalAlign:"-0.125em",textRendering:"optimizeLegibility","-webkit-font-smoothing":"antialiased","-moz-osx-font-smoothing":"grayscale","> *":{lineHeight:1},svg:{display:"inline-block"}}),l=()=>({"&::before":{display:"table",content:'""'},"&::after":{display:"table",clear:"both",content:'""'}}),c=e=>({a:{color:e.colorLink,textDecoration:e.linkDecoration,backgroundColor:"transparent",outline:"none",cursor:"pointer",transition:`color ${e.motionDurationSlow}`,"-webkit-text-decoration-skip":"objects","&:hover":{color:e.colorLinkHover},"&:active":{color:e.colorLinkActive},"&:active,\n &:hover":{textDecoration:e.linkHoverDecoration,outline:0},"&:focus":{textDecoration:e.linkFocusDecoration,outline:0},"&[disabled]":{color:e.colorTextDisabled,cursor:"not-allowed"}}}),s=(e,t,n,r)=>{const o=`[class^="${t}"], [class*=" ${t}"]`,i=n?`.${n}`:o,a={boxSizing:"border-box","&::before, &::after":{boxSizing:"border-box"}};let l={};return!1!==r&&(l={fontFamily:e.fontFamily,fontSize:e.fontSize}),{[i]:Object.assign(Object.assign(Object.assign({},l),a),{[o]:a})}},u=e=>({outline:`${(0,r.zA)(e.lineWidthFocus)} solid ${e.colorPrimaryBorder}`,outlineOffset:1,transition:"outline-offset 0s, outline 0s"}),d=e=>({"&:focus-visible":Object.assign({},u(e))})},4980:(e,t,n)=>{"use strict";n.d(t,{b:()=>i});const r=e=>({animationDuration:e,animationFillMode:"both"}),o=e=>({animationDuration:e,animationFillMode:"both"}),i=function(e,t,n,i){const a=arguments.length>4&&void 0!==arguments[4]&&arguments[4]?"&":"";return{[`\n ${a}${e}-enter,\n ${a}${e}-appear\n `]:Object.assign(Object.assign({},r(i)),{animationPlayState:"paused"}),[`${a}${e}-leave`]:Object.assign(Object.assign({},o(i)),{animationPlayState:"paused"}),[`\n ${a}${e}-enter${e}-enter-active,\n ${a}${e}-appear${e}-appear-active\n `]:{animationName:t,animationPlayState:"running"},[`${a}${e}-leave${e}-leave-active`]:{animationName:n,animationPlayState:"running",pointerEvents:"none"}}}},3511:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>O,Xe:()=>E,Is:()=>k});var r=n(6540),o=n(1466);const i="5.16.4";var a=n(2200);const l={blue:"#1677ff",purple:"#722ED1",cyan:"#13C2C2",green:"#52C41A",magenta:"#EB2F96",pink:"#eb2f96",red:"#F5222D",orange:"#FA8C16",yellow:"#FADB14",volcano:"#FA541C",geekblue:"#2F54EB",gold:"#FAAD14",lime:"#A0D911"},c=Object.assign(Object.assign({},l),{colorPrimary:"#1677ff",colorSuccess:"#52c41a",colorWarning:"#faad14",colorError:"#ff4d4f",colorInfo:"#1677ff",colorLink:"",colorTextBase:"",colorBgBase:"",fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n'Noto Color Emoji'",fontFamilyCode:"'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",fontSize:14,lineWidth:1,lineType:"solid",motionUnit:.1,motionBase:0,motionEaseOutCirc:"cubic-bezier(0.08, 0.82, 0.17, 1)",motionEaseInOutCirc:"cubic-bezier(0.78, 0.14, 0.15, 0.86)",motionEaseOut:"cubic-bezier(0.215, 0.61, 0.355, 1)",motionEaseInOut:"cubic-bezier(0.645, 0.045, 0.355, 1)",motionEaseOutBack:"cubic-bezier(0.12, 0.4, 0.29, 1.46)",motionEaseInBack:"cubic-bezier(0.71, -0.46, 0.88, 0.6)",motionEaseInQuint:"cubic-bezier(0.755, 0.05, 0.855, 0.06)",motionEaseOutQuint:"cubic-bezier(0.23, 1, 0.32, 1)",borderRadius:6,sizeUnit:4,sizeStep:4,sizePopupArrow:16,controlHeight:32,zIndexBase:0,zIndexPopupBase:1e3,opacityImage:1,wireframe:!1,motion:!0});var s=n(4978);const u=e=>{let t=e,n=e,r=e,o=e;return e<6&&e>=5?t=e+1:e<16&&e>=6?t=e+2:e>=16&&(t=16),e<7&&e>=5?n=4:e<8&&e>=7?n=5:e<14&&e>=8?n=6:e<16&&e>=14?n=7:e>=16&&(n=8),e<6&&e>=2?r=1:e>=6&&(r=2),e>4&&e<8?o=4:e>=8&&(o=6),{borderRadius:e,borderRadiusXS:r,borderRadiusSM:n,borderRadiusLG:t,borderRadiusOuter:o}};const d=e=>{const{controlHeight:t}=e;return{controlHeightSM:.75*t,controlHeightXS:.5*t,controlHeightLG:1.25*t}};const f=e=>{const t=function(e){const t=new Array(10).fill(null).map(((t,n)=>{const r=n-1,o=e*Math.pow(2.71828,r/5),i=n>1?Math.floor(o):Math.ceil(o);return 2*Math.floor(i/2)}));return t[1]=e,t.map((e=>{return{size:e,lineHeight:(t=e,(t+8)/t)};var t}))}(e),n=t.map((e=>e.size)),r=t.map((e=>e.lineHeight)),o=n[1],i=n[0],a=n[2],l=r[1],c=r[0],s=r[2];return{fontSizeSM:i,fontSize:o,fontSizeLG:a,fontSizeXL:n[3],fontSizeHeading1:n[6],fontSizeHeading2:n[5],fontSizeHeading3:n[4],fontSizeHeading4:n[3],fontSizeHeading5:n[2],lineHeight:l,lineHeightLG:s,lineHeightSM:c,fontHeight:Math.round(l*o),fontHeightLG:Math.round(s*a),fontHeightSM:Math.round(c*i),lineHeightHeading1:r[6],lineHeightHeading2:r[5],lineHeightHeading3:r[4],lineHeightHeading4:r[3],lineHeightHeading5:r[2]}};const p=(e,t)=>new s.q(e).setAlpha(t).toRgbString(),v=(e,t)=>new s.q(e).darken(t).toHexString(),m=e=>{const t=(0,a.cM)(e);return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[4],6:t[5],7:t[6],8:t[4],9:t[5],10:t[6]}},h=(e,t)=>{const n=e||"#fff",r=t||"#000";return{colorBgBase:n,colorTextBase:r,colorText:p(r,.88),colorTextSecondary:p(r,.65),colorTextTertiary:p(r,.45),colorTextQuaternary:p(r,.25),colorFill:p(r,.15),colorFillSecondary:p(r,.06),colorFillTertiary:p(r,.04),colorFillQuaternary:p(r,.02),colorBgLayout:v(n,4),colorBgContainer:v(n,0),colorBgElevated:v(n,0),colorBgSpotlight:p(r,.85),colorBgBlur:"transparent",colorBorder:v(n,15),colorBorderSecondary:v(n,6)}};const g=(0,o.an)((function(e){const t=Object.keys(l).map((t=>{const n=(0,a.cM)(e[t]);return new Array(10).fill(1).reduce(((e,r,o)=>(e[`${t}-${o+1}`]=n[o],e[`${t}${o+1}`]=n[o],e)),{})})).reduce(((e,t)=>e=Object.assign(Object.assign({},e),t)),{});return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},e),t),function(e,t){let{generateColorPalettes:n,generateNeutralColorPalettes:r}=t;const{colorSuccess:o,colorWarning:i,colorError:a,colorInfo:l,colorPrimary:c,colorBgBase:u,colorTextBase:d}=e,f=n(c),p=n(o),v=n(i),m=n(a),h=n(l),g=r(u,d),b=n(e.colorLink||e.colorInfo);return Object.assign(Object.assign({},g),{colorPrimaryBg:f[1],colorPrimaryBgHover:f[2],colorPrimaryBorder:f[3],colorPrimaryBorderHover:f[4],colorPrimaryHover:f[5],colorPrimary:f[6],colorPrimaryActive:f[7],colorPrimaryTextHover:f[8],colorPrimaryText:f[9],colorPrimaryTextActive:f[10],colorSuccessBg:p[1],colorSuccessBgHover:p[2],colorSuccessBorder:p[3],colorSuccessBorderHover:p[4],colorSuccessHover:p[4],colorSuccess:p[6],colorSuccessActive:p[7],colorSuccessTextHover:p[8],colorSuccessText:p[9],colorSuccessTextActive:p[10],colorErrorBg:m[1],colorErrorBgHover:m[2],colorErrorBorder:m[3],colorErrorBorderHover:m[4],colorErrorHover:m[5],colorError:m[6],colorErrorActive:m[7],colorErrorTextHover:m[8],colorErrorText:m[9],colorErrorTextActive:m[10],colorWarningBg:v[1],colorWarningBgHover:v[2],colorWarningBorder:v[3],colorWarningBorderHover:v[4],colorWarningHover:v[4],colorWarning:v[6],colorWarningActive:v[7],colorWarningTextHover:v[8],colorWarningText:v[9],colorWarningTextActive:v[10],colorInfoBg:h[1],colorInfoBgHover:h[2],colorInfoBorder:h[3],colorInfoBorderHover:h[4],colorInfoHover:h[4],colorInfo:h[6],colorInfoActive:h[7],colorInfoTextHover:h[8],colorInfoText:h[9],colorInfoTextActive:h[10],colorLinkHover:b[4],colorLink:b[6],colorLinkActive:b[7],colorBgMask:new s.q("#000").setAlpha(.45).toRgbString(),colorWhite:"#fff"})}(e,{generateColorPalettes:m,generateNeutralColorPalettes:h})),f(e.fontSize)),function(e){const{sizeUnit:t,sizeStep:n}=e;return{sizeXXL:t*(n+8),sizeXL:t*(n+4),sizeLG:t*(n+2),sizeMD:t*(n+1),sizeMS:t*n,size:t*n,sizeSM:t*(n-1),sizeXS:t*(n-2),sizeXXS:t*(n-3)}}(e)),d(e)),function(e){const{motionUnit:t,motionBase:n,borderRadius:r,lineWidth:o}=e;return Object.assign({motionDurationFast:`${(n+t).toFixed(1)}s`,motionDurationMid:`${(n+2*t).toFixed(1)}s`,motionDurationSlow:`${(n+3*t).toFixed(1)}s`,lineWidthBold:o+1},u(r))}(e))})),b={token:c,override:{override:c},hashed:!0},y=r.createContext(b);function A(e){return e>=0&&e<=255}const w=function(e,t){const{r:n,g:r,b:o,a:i}=new s.q(e).toRgb();if(i<1)return e;const{r:a,g:l,b:c}=new s.q(t).toRgb();for(let u=.01;u<=1;u+=.01){const e=Math.round((n-a*(1-u))/u),t=Math.round((r-l*(1-u))/u),i=Math.round((o-c*(1-u))/u);if(A(e)&&A(t)&&A(i))return new s.q({r:e,g:t,b:i,a:Math.round(100*u)/100}).toRgbString()}return new s.q({r:n,g:r,b:o,a:1}).toRgbString()};var S=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{delete r[e]}));const o=Object.assign(Object.assign({},n),r),i=1200,a=1600;if(!1===o.motion){const e="0s";o.motionDurationFast=e,o.motionDurationMid=e,o.motionDurationSlow=e}return Object.assign(Object.assign(Object.assign({},o),{colorFillContent:o.colorFillSecondary,colorFillContentHover:o.colorFill,colorFillAlter:o.colorFillQuaternary,colorBgContainerDisabled:o.colorFillTertiary,colorBorderBg:o.colorBgContainer,colorSplit:w(o.colorBorderSecondary,o.colorBgContainer),colorTextPlaceholder:o.colorTextQuaternary,colorTextDisabled:o.colorTextQuaternary,colorTextHeading:o.colorText,colorTextLabel:o.colorTextSecondary,colorTextDescription:o.colorTextTertiary,colorTextLightSolid:o.colorWhite,colorHighlight:o.colorError,colorBgTextHover:o.colorFillSecondary,colorBgTextActive:o.colorFill,colorIcon:o.colorTextTertiary,colorIconHover:o.colorText,colorErrorOutline:w(o.colorErrorBg,o.colorBgContainer),colorWarningOutline:w(o.colorWarningBg,o.colorBgContainer),fontSizeIcon:o.fontSizeSM,lineWidthFocus:4*o.lineWidth,lineWidth:o.lineWidth,controlOutlineWidth:2*o.lineWidth,controlInteractiveSize:o.controlHeight/2,controlItemBgHover:o.colorFillTertiary,controlItemBgActive:o.colorPrimaryBg,controlItemBgActiveHover:o.colorPrimaryBgHover,controlItemBgActiveDisabled:o.colorFill,controlTmpOutline:o.colorFillQuaternary,controlOutline:w(o.colorPrimaryBg,o.colorBgContainer),lineType:o.lineType,borderRadius:o.borderRadius,borderRadiusXS:o.borderRadiusXS,borderRadiusSM:o.borderRadiusSM,borderRadiusLG:o.borderRadiusLG,fontWeightStrong:600,opacityLoading:.65,linkDecoration:"none",linkHoverDecoration:"none",linkFocusDecoration:"none",controlPaddingHorizontal:12,controlPaddingHorizontalSM:8,paddingXXS:o.sizeXXS,paddingXS:o.sizeXS,paddingSM:o.sizeSM,padding:o.size,paddingMD:o.sizeMD,paddingLG:o.sizeLG,paddingXL:o.sizeXL,paddingContentHorizontalLG:o.sizeLG,paddingContentVerticalLG:o.sizeMS,paddingContentHorizontal:o.sizeMS,paddingContentVertical:o.sizeSM,paddingContentHorizontalSM:o.size,paddingContentVerticalSM:o.sizeXS,marginXXS:o.sizeXXS,marginXS:o.sizeXS,marginSM:o.sizeSM,margin:o.size,marginMD:o.sizeMD,marginLG:o.sizeLG,marginXL:o.sizeXL,marginXXL:o.sizeXXL,boxShadow:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowSecondary:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTertiary:"\n 0 1px 2px 0 rgba(0, 0, 0, 0.03),\n 0 1px 6px -1px rgba(0, 0, 0, 0.02),\n 0 2px 4px 0 rgba(0, 0, 0, 0.02)\n ",screenXS:480,screenXSMin:480,screenXSMax:575,screenSM:576,screenSMMin:576,screenSMMax:767,screenMD:768,screenMDMin:768,screenMDMax:991,screenLG:992,screenLGMin:992,screenLGMax:1199,screenXL:i,screenXLMin:i,screenXLMax:1599,screenXXL:a,screenXXLMin:a,boxShadowPopoverArrow:"2px 2px 5px rgba(0, 0, 0, 0.05)",boxShadowCard:`\n 0 1px 2px -2px ${new s.q("rgba(0, 0, 0, 0.16)").toRgbString()},\n 0 3px 6px 0 ${new s.q("rgba(0, 0, 0, 0.12)").toRgbString()},\n 0 5px 12px 4px ${new s.q("rgba(0, 0, 0, 0.09)").toRgbString()}\n `,boxShadowDrawerRight:"\n -6px 0 16px 0 rgba(0, 0, 0, 0.08),\n -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n -9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerLeft:"\n 6px 0 16px 0 rgba(0, 0, 0, 0.08),\n 3px 0 6px -4px rgba(0, 0, 0, 0.12),\n 9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerUp:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerDown:"\n 0 -6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 -3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 -9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTabsOverflowLeft:"inset 10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowRight:"inset -10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowTop:"inset 0 10px 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowBottom:"inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08)"}),r)}var C=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const r=n.getDerivativeToken(e),{override:o}=t,i=C(t,["override"]);let a=Object.assign(Object.assign({},r),{override:o});return a=x(a),i&&Object.entries(i).forEach((e=>{let[t,n]=e;const{theme:r}=n,o=C(n,["theme"]);let i=o;r&&(i=$(Object.assign(Object.assign({},a),o),{override:o},r)),a[t]=i})),a};function O(){const{token:e,hashed:t,theme:n,override:a,cssVar:l}=r.useContext(y),s=`${i}-${t||""}`,u=n||g,[d,f,p]=(0,o.hV)(u,[c,e],{salt:s,override:a,getComputedToken:$,formatToken:x,cssVar:l&&{prefix:l.prefix,key:l.key,unitless:k,ignore:E,preserve:M}});return[u,p,t?f:"",d,l]}},665:(e,t,n)=>{"use strict";n.d(t,{OF:()=>M});var r=n(6540),o=n(1466);n(6956),n(2533),n(8719);"undefined"==typeof Reflect?Object.keys:Reflect.ownKeys;n(8210);var i=n(2279),a=n(5905),l=n(3511),c=n(3029),s=n(2901),u=n(3954),d=n(2176),f=n(6822);function p(e,t,n){return t=(0,u.A)(t),(0,f.A)(e,(0,d.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var v=n(5501);const m=(0,s.A)((function e(){(0,c.A)(this,e)})),h="CALC_UNIT",g=new RegExp(h,"g");function b(e){return"number"==typeof e?`${e}${h}`:e}let y=function(e){function t(e){var n;return(0,c.A)(this,t),(n=p(this,t)).result="",e instanceof t?n.result=`(${e.result})`:"number"==typeof e?n.result=b(e):"string"==typeof e&&(n.result=e),n}return(0,v.A)(t,e),(0,s.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result=`${this.result} + ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} + ${b(e)}`),this.lowPriority=!0,this}},{key:"sub",value:function(e){return e instanceof t?this.result=`${this.result} - ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} - ${b(e)}`),this.lowPriority=!0,this}},{key:"mul",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} * ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} * ${e}`),this.lowPriority=!1,this}},{key:"div",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} / ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} / ${e}`),this.lowPriority=!1,this}},{key:"getResult",value:function(e){return this.lowPriority||e?`(${this.result})`:this.result}},{key:"equal",value:function(e){const{unit:t=!0}=e||{};return this.result=this.result.replace(g,t?"px":""),void 0!==this.lowPriority?`calc(${this.result})`:this.result}}])}(m),A=function(e){function t(e){var n;return(0,c.A)(this,t),(n=p(this,t)).result=0,e instanceof t?n.result=e.result:"number"==typeof e&&(n.result=e),n}return(0,v.A)(t,e),(0,s.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result+=e.result:"number"==typeof e&&(this.result+=e),this}},{key:"sub",value:function(e){return e instanceof t?this.result-=e.result:"number"==typeof e&&(this.result-=e),this}},{key:"mul",value:function(e){return e instanceof t?this.result*=e.result:"number"==typeof e&&(this.result*=e),this}},{key:"div",value:function(e){return e instanceof t?this.result/=e.result:"number"==typeof e&&(this.result/=e),this}},{key:"equal",value:function(){return this.result}}])}(m);const w=e=>{const t="css"===e?y:A;return e=>new t(e)};var S=n(336);const x=(e,t)=>{const[n,r]=(0,l.Ay)();return(0,o.IV)({theme:n,token:r,hashId:"",path:["ant-design-icons",e],nonce:()=>null==t?void 0:t.nonce},(()=>[{[`.${e}`]:Object.assign(Object.assign({},(0,a.Nk)()),{[`.${e} .${e}-icon`]:{display:"block"}})}]))},C=(e,t,n)=>{var r;return"function"==typeof n?n((0,S.h1)(t,null!==(r=t[e])&&void 0!==r?r:{})):null!=n?n:{}},k=(e,t,n,r)=>{const o=Object.assign({},t[e]);if(null==r?void 0:r.deprecatedTokens){const{deprecatedTokens:e}=r;e.forEach((e=>{let[t,n]=e;var r;((null==o?void 0:o[t])||(null==o?void 0:o[n]))&&(null!==(r=o[n])&&void 0!==r||(o[n]=null==o?void 0:o[t]))}))}const i=Object.assign(Object.assign({},n),o);return Object.keys(i).forEach((e=>{i[e]===t[e]&&delete i[e]})),i};function E(e,t,n){let c=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};const s=Array.isArray(e)?e:[e,e],[u]=s,d=s.join("-");return function(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[f,p,v,m,h]=(0,l.Ay)(),{getPrefixCls:g,iconPrefixCls:b,csp:y}=(0,r.useContext)(i.QO),A=g(),E=h?"css":"js",M=w(E),{max:$,min:O}=function(e){return"js"===e?{max:Math.max,min:Math.min}:{max:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`},min:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`}}}(E),T={theme:f,token:m,hashId:v,nonce:()=>null==y?void 0:y.nonce,clientOnly:c.clientOnly,order:c.order||-999};(0,o.IV)(Object.assign(Object.assign({},T),{clientOnly:!1,path:["Shared",A]}),(()=>[{"&":(0,a.av)(m)}])),x(b,y);const R=(0,o.IV)(Object.assign(Object.assign({},T),{path:[d,e,b]}),(()=>{if(!1===c.injectStyle)return[];const{token:r,flush:i}=(0,S.Ay)(m),l=C(u,p,n),d=`.${e}`,f=k(u,p,l,{deprecatedTokens:c.deprecatedTokens});h&&Object.keys(l).forEach((e=>{l[e]=`var(${(0,o.Ki)(e,((e,t)=>`${[t,e.replace(/([A-Z]+)([A-Z][a-z]+)/g,"$1-$2").replace(/([a-z])([A-Z])/g,"$1-$2")].filter(Boolean).join("-")}`)(u,h.prefix))})`}));const g=(0,S.h1)(r,{componentCls:d,prefixCls:e,iconCls:`.${b}`,antCls:`.${A}`,calc:M,max:$,min:O},h?l:f),y=t(g,{hashId:v,prefixCls:e,rootPrefixCls:A,iconPrefixCls:b});return i(u,f),[!1===c.resetStyle?null:(0,a.vj)(g,e,s,c.resetFont),y]}));return[R,v]}}const M=(e,t,n,i)=>{const a=E(e,t,n,i),c=((e,t,n)=>{function i(t){return`${e}${t.slice(0,1).toUpperCase()}${t.slice(1)}`}const{unitless:a={},injectStyle:c=!0}=null!=n?n:{},s={[i("zIndexPopup")]:!0};Object.keys(a).forEach((e=>{s[i(e)]=a[e]}));const u=r=>{let{rootCls:a,cssVar:c}=r;const[,u]=(0,l.Ay)();return(0,o.RC)({path:[e],prefix:c.prefix,key:null==c?void 0:c.key,unitless:Object.assign(Object.assign({},l.Is),s),ignore:l.Xe,token:u,scope:a},(()=>{const r=C(e,u,t),o=k(e,u,r,{deprecatedTokens:null==n?void 0:n.deprecatedTokens});return Object.keys(r).forEach((e=>{o[i(e)]=o[e],delete o[e]})),o})),null};return t=>{const[,,,,n]=(0,l.Ay)();return[o=>c&&n?r.createElement(r.Fragment,null,r.createElement(u,{rootCls:t,cssVar:n,component:e}),o):o,null==n?void 0:n.key]}})(Array.isArray(e)?e[0]:e,n,i);return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[,n]=a(e,t),[r,o]=c(t);return[r,n,o]}}},336:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>c,h1:()=>i});const r="undefined"!=typeof CSSINJS_STATISTIC;let o=!0;function i(){for(var e=arguments.length,t=new Array(e),n=0;n{Object.keys(e).forEach((t=>{Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:()=>e[t]})}))})),o=!0,i}const a={};function l(){}const c=e=>{let t,n=e,i=l;return r&&"undefined"!=typeof Proxy&&(t=new Set,n=new Proxy(e,{get:(e,n)=>(o&&t.add(n),e[n])}),i=(e,n)=>{var r;a[e]={global:Array.from(t),component:Object.assign(Object.assign({},null===(r=a[e])||void 0===r?void 0:r.component),n)}}),{token:n,keys:t,flush:i}}},1441:(e,t,n)=>{var r=n(8028),o=function(e){var t="",n=Object.keys(e);return n.forEach((function(o,i){var a=e[o];(function(e){return/[height|width]$/.test(e)})(o=r(o))&&"number"==typeof a&&(a+="px"),t+=!0===a?o:!1===a?"not "+o:"("+o+": "+a+")",i{"use strict";n.d(t,{Ay:()=>pe});var r=n(4467),o=n(9379),i=n(6636),a=n(2284),l=n(6942),c=n.n(l),s=n(6588),u=n(8719),d=n(6540),f=d.createContext({});var p=n(3029),v=n(2901),m=n(5501),h=n(9426);const g=function(e){(0,m.A)(n,e);var t=(0,h.A)(n);function n(){return(0,p.A)(this,n),t.apply(this,arguments)}return(0,v.A)(n,[{key:"render",value:function(){return this.props.children}}]),n}(d.Component);var b=n(1233),y="none",A="appear",w="enter",S="leave",x="none",C="prepare",k="start",E="active",M="end",$="prepared",O=n(998);function T(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit".concat(e)]="webkit".concat(t),n["Moz".concat(e)]="moz".concat(t),n["ms".concat(e)]="MS".concat(t),n["O".concat(e)]="o".concat(t.toLowerCase()),n}var R,z,P,N=(R=(0,O.A)(),z="undefined"!=typeof window?window:{},P={animationend:T("Animation","AnimationEnd"),transitionend:T("Transition","TransitionEnd")},R&&("AnimationEvent"in z||delete P.animationend.animation,"TransitionEvent"in z||delete P.transitionend.transition),P),I={};if((0,O.A)()){var L=document.createElement("div");I=L.style}var j={};function _(e){if(j[e])return j[e];var t=N[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o1&&void 0!==arguments[1]?arguments[1]:2;t();var i=(0,q.A)((function(){o<=1?r({isCanceled:function(){return i!==e.current}}):n(r,o-1)}));e.current=i},t]}(),s=(0,i.A)(c,2),u=s[0],f=s[1];var p=t?U:Y;return G((function(){if(a!==x&&a!==M){var e=p.indexOf(a),t=p[e+1],r=n(a);r===V?l(t,!0):t&&u((function(e){function n(){e.isCanceled()||l(t,!0)}!0===r?n():Promise.resolve(r).then(n)}))}}),[e,a]),d.useEffect((function(){return function(){f()}}),[]),[function(){l(C,!0)},a]};const ee=function(e){var t=e;"object"===(0,a.A)(e)&&(t=e.transitionSupport);var n=d.forwardRef((function(e,n){var a=e.visible,l=void 0===a||a,p=e.removeOnLeave,v=void 0===p||p,m=e.forceRender,h=e.children,x=e.motionName,M=e.leavedClassName,O=e.eventProps,T=function(e,n){return!(!e.motionName||!t||!1===n)}(e,d.useContext(f).motion),R=(0,d.useRef)(),z=(0,d.useRef)();var P=function(e,t,n,a){var l=a.motionEnter,c=void 0===l||l,s=a.motionAppear,u=void 0===s||s,f=a.motionLeave,p=void 0===f||f,v=a.motionDeadline,m=a.motionLeaveImmediately,h=a.onAppearPrepare,g=a.onEnterPrepare,x=a.onLeavePrepare,M=a.onAppearStart,O=a.onEnterStart,T=a.onLeaveStart,R=a.onAppearActive,z=a.onEnterActive,P=a.onLeaveActive,N=a.onAppearEnd,I=a.onEnterEnd,L=a.onLeaveEnd,j=a.onVisibleChanged,_=(0,b.A)(),H=(0,i.A)(_,2),D=H[0],B=H[1],W=(0,b.A)(y),F=(0,i.A)(W,2),X=F[0],q=F[1],Y=(0,b.A)(null),U=(0,i.A)(Y,2),ee=U[0],te=U[1],ne=(0,d.useRef)(!1),re=(0,d.useRef)(null);function oe(){return n()}var ie=(0,d.useRef)(!1);function ae(){q(y,!0),te(null,!0)}function le(e){var t=oe();if(!e||e.deadline||e.target===t){var n,r=ie.current;X===A&&r?n=null==N?void 0:N(t,e):X===w&&r?n=null==I?void 0:I(t,e):X===S&&r&&(n=null==L?void 0:L(t,e)),X!==y&&r&&!1!==n&&ae()}}var ce=K(le),se=(0,i.A)(ce,1)[0],ue=function(e){var t,n,o;switch(e){case A:return t={},(0,r.A)(t,C,h),(0,r.A)(t,k,M),(0,r.A)(t,E,R),t;case w:return n={},(0,r.A)(n,C,g),(0,r.A)(n,k,O),(0,r.A)(n,E,z),n;case S:return o={},(0,r.A)(o,C,x),(0,r.A)(o,k,T),(0,r.A)(o,E,P),o;default:return{}}},de=d.useMemo((function(){return ue(X)}),[X]),fe=J(X,!e,(function(e){if(e===C){var t=de[C];return t?t(oe()):V}var n;return me in de&&te((null===(n=de[me])||void 0===n?void 0:n.call(de,oe(),null))||null),me===E&&(se(oe()),v>0&&(clearTimeout(re.current),re.current=setTimeout((function(){le({deadline:!0})}),v))),me===$&&ae(),Q})),pe=(0,i.A)(fe,2),ve=pe[0],me=pe[1],he=Z(me);ie.current=he,G((function(){B(t);var n,r=ne.current;ne.current=!0,!r&&t&&u&&(n=A),r&&t&&c&&(n=w),(r&&!t&&p||!r&&m&&!t&&p)&&(n=S);var o=ue(n);n&&(e||o[C])?(q(n),ve()):q(y)}),[t]),(0,d.useEffect)((function(){(X===A&&!u||X===w&&!c||X===S&&!p)&&q(y)}),[u,c,p]),(0,d.useEffect)((function(){return function(){ne.current=!1,clearTimeout(re.current)}}),[]);var ge=d.useRef(!1);(0,d.useEffect)((function(){D&&(ge.current=!0),void 0!==D&&X===y&&((ge.current||D)&&(null==j||j(D)),ge.current=!0)}),[D,X]);var be=ee;return de[C]&&me===k&&(be=(0,o.A)({transition:"none"},be)),[X,me,be,null!=D?D:t]}(T,l,(function(){try{return R.current instanceof HTMLElement?R.current:(0,s.A)(z.current)}catch(e){return null}}),e),N=(0,i.A)(P,4),I=N[0],L=N[1],j=N[2],_=N[3],H=d.useRef(_);_&&(H.current=!0);var D,B=d.useCallback((function(e){R.current=e,(0,u.Xf)(n,e)}),[n]),W=(0,o.A)((0,o.A)({},O),{},{visible:l});if(h)if(I===y)D=_?h((0,o.A)({},W),B):!v&&H.current&&M?h((0,o.A)((0,o.A)({},W),{},{className:M}),B):m||!v&&!M?h((0,o.A)((0,o.A)({},W),{},{style:{display:"none"}}),B):null;else{var F,q;L===C?q="prepare":Z(L)?q="active":L===k&&(q="start");var Y=X(x,"".concat(I,"-").concat(q));D=h((0,o.A)((0,o.A)({},W),{},{className:c()(X(x,I),(F={},(0,r.A)(F,Y,Y&&q),(0,r.A)(F,x,"string"==typeof x),F)),style:j}),B)}else D=null;d.isValidElement(D)&&(0,u.f3)(D)&&(D.ref||(D=d.cloneElement(D,{ref:B})));return d.createElement(g,{ref:z},D)}));return n.displayName="CSSMotion",n}(B);var te=n(8168),ne=n(45),re=n(9417),oe="add",ie="keep",ae="remove",le="removed";function ce(e){var t;return t=e&&"object"===(0,a.A)(e)&&"key"in e?e:{key:e},(0,o.A)((0,o.A)({},t),{},{key:String(t.key)})}function se(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).map(ce)}var ue=["component","children","onVisibleChanged","onAllRemoved"],de=["status"],fe=["eventProps","visible","children","motionName","motionAppear","motionEnter","motionLeave","motionLeaveImmediately","motionDeadline","removeOnLeave","leavedClassName","onAppearPrepare","onAppearStart","onAppearActive","onAppearEnd","onEnterStart","onEnterActive","onEnterEnd","onLeaveStart","onLeaveActive","onLeaveEnd"];!function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ee,n=function(e){(0,m.A)(i,e);var n=(0,h.A)(i);function i(){var e;(0,p.A)(this,i);for(var t=arguments.length,a=new Array(t),l=0;l0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[],r=0,i=t.length,a=se(e),l=se(t);a.forEach((function(e){for(var t=!1,a=r;a1})).forEach((function(e){(n=n.filter((function(t){var n=t.key,r=t.status;return n!==e||r!==ae}))).forEach((function(t){t.key===e&&(t.status=ie)}))})),n}(r,i);return{keyEntities:a.filter((function(e){var t=r.find((function(t){var n=t.key;return e.key===n}));return!t||t.status!==le||e.status!==ae}))}}}]),i}(d.Component);(0,r.A)(n,"defaultProps",{component:"div"})}(B);const pe=ee},998:(e,t,n)=>{"use strict";function r(){return!("undefined"==typeof window||!window.document||!window.document.createElement)}n.d(t,{A:()=>r})},4808:(e,t,n)=>{"use strict";function r(e,t){if(!e)return!1;if(e.contains)return e.contains(t);for(var n=t;n;){if(n===e)return!0;n=n.parentNode}return!1}n.d(t,{A:()=>r})},5089:(e,t,n)=>{"use strict";n.d(t,{BD:()=>h,m6:()=>m});var r=n(9379),o=n(998),i=n(4808),a="data-rc-order",l="data-rc-priority",c="rc-util-key",s=new Map;function u(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).mark;return e?e.startsWith("data-")?e:"data-".concat(e):c}function d(e){return e.attachTo?e.attachTo:document.querySelector("head")||document.body}function f(e){return Array.from((s.get(e)||e).children).filter((function(e){return"STYLE"===e.tagName}))}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,o.A)())return null;var n=t.csp,r=t.prepend,i=t.priority,c=void 0===i?0:i,s=function(e){return"queue"===e?"prependQueue":e?"prepend":"append"}(r),u="prependQueue"===s,p=document.createElement("style");p.setAttribute(a,s),u&&c&&p.setAttribute(l,"".concat(c)),null!=n&&n.nonce&&(p.nonce=null==n?void 0:n.nonce),p.innerHTML=e;var v=d(t),m=v.firstChild;if(r){if(u){var h=(t.styles||f(v)).filter((function(e){if(!["prepend","prependQueue"].includes(e.getAttribute(a)))return!1;var t=Number(e.getAttribute(l)||0);return c>=t}));if(h.length)return v.insertBefore(p,h[h.length-1].nextSibling),p}v.insertBefore(p,m)}else v.appendChild(p);return p}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=d(t);return(t.styles||f(n)).find((function(n){return n.getAttribute(u(t))===e}))}function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=v(e,t);n&&d(t).removeChild(n)}function h(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=d(n),a=f(o),l=(0,r.A)((0,r.A)({},n),{},{styles:a});!function(e,t){var n=s.get(e);if(!n||!(0,i.A)(document,n)){var r=p("",t),o=r.parentNode;s.set(e,o),e.removeChild(r)}}(o,l);var c=v(t,l);if(c){var m,h,g;if(null!==(m=l.csp)&&void 0!==m&&m.nonce&&c.nonce!==(null===(h=l.csp)||void 0===h?void 0:h.nonce))c.nonce=null===(g=l.csp)||void 0===g?void 0:g.nonce;return c.innerHTML!==e&&(c.innerHTML=e),c}var b=p(e,l);return b.setAttribute(u(l),t),b}},6588:(e,t,n)=>{"use strict";n.d(t,{A:()=>a,f:()=>i});var r=n(6540),o=n(961);function i(e){return e instanceof HTMLElement||e instanceof SVGElement}function a(e){return i(e)?e:e instanceof r.Component?o.findDOMNode(e):null}},2633:(e,t,n)=>{"use strict";function r(e){var t;return null==e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}function o(e){return function(e){return r(e)instanceof ShadowRoot}(e)?r(e):null}n.d(t,{j:()=>o})},6928:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r={MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,WIN_IME:229,isTextModifyingKeyEvent:function(e){var t=e.keyCode;if(e.altKey&&!e.ctrlKey||e.metaKey||t>=r.F1&&t<=r.F12)return!1;switch(t){case r.ALT:case r.CAPS_LOCK:case r.CONTEXT_MENU:case r.CTRL:case r.DOWN:case r.END:case r.ESC:case r.HOME:case r.INSERT:case r.LEFT:case r.MAC_FF_META:case r.META:case r.NUMLOCK:case r.NUM_CENTER:case r.PAGE_DOWN:case r.PAGE_UP:case r.PAUSE:case r.PRINT_SCREEN:case r.RIGHT:case r.SHIFT:case r.UP:case r.WIN_KEY:case r.WIN_KEY_RIGHT:return!1;default:return!0}},isCharacterKey:function(e){if(e>=r.ZERO&&e<=r.NINE)return!0;if(e>=r.NUM_ZERO&&e<=r.NUM_MULTIPLY)return!0;if(e>=r.A&&e<=r.Z)return!0;if(-1!==window.navigator.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case r.SPACE:case r.QUESTION_MARK:case r.NUM_PLUS:case r.NUM_MINUS:case r.NUM_PERIOD:case r.NUM_DIVISION:case r.SEMICOLON:case r.DASH:case r.EQUALS:case r.COMMA:case r.PERIOD:case r.SLASH:case r.APOSTROPHE:case r.SINGLE_QUOTE:case r.OPEN_SQUARE_BRACKET:case r.BACKSLASH:case r.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}};const o=r},6956:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e){var t=r.useRef();t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o{"use strict";var r;n.d(t,{A:()=>s});var o=n(6636),i=n(9379),a=n(6540);var l=0;var c=(0,i.A)({},r||(r=n.t(a,2))).useId;const s=c?function(e){var t=c();return e||t}:function(e){var t=a.useState("ssr-id"),n=(0,o.A)(t,2),r=n[0],i=n[1];return a.useEffect((function(){var e=l;l+=1,i("rc_unique_".concat(e))}),[]),e||r}},981:(e,t,n)=>{"use strict";n.d(t,{A:()=>l,o:()=>a});var r=n(6540),o=(0,n(998).A)()?r.useLayoutEffect:r.useEffect,i=function(e,t){var n=r.useRef(!0);o((function(){return e(n.current)}),t),o((function(){return n.current=!1,function(){n.current=!0}}),[])},a=function(e,t){i((function(t){if(!t)return e()}),t)};const l=i},8104:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e,t,n){var o=r.useRef({});return"value"in o.current&&!n(o.current.condition,t)||(o.current.value=e(),o.current.condition=t),o.current.value}},2533:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(6636),o=n(6956),i=n(981),a=n(1233);function l(e){return void 0!==e}function c(e,t){var n=t||{},c=n.defaultValue,s=n.value,u=n.onChange,d=n.postState,f=(0,a.A)((function(){return l(s)?s:l(c)?"function"==typeof c?c():c:"function"==typeof e?e():e})),p=(0,r.A)(f,2),v=p[0],m=p[1],h=void 0!==s?s:v,g=d?d(h):h,b=(0,o.A)(u),y=(0,a.A)([h]),A=(0,r.A)(y,2),w=A[0],S=A[1];return(0,i.o)((function(){var e=w[0];v!==e&&b(v,e)}),[w]),(0,i.o)((function(){l(s)||m(s)}),[s]),[g,(0,o.A)((function(e,t){m(e,t),S([h],t)}))]}},1233:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6636),o=n(6540);function i(e){var t=o.useRef(!1),n=o.useState(e),i=(0,r.A)(n,2),a=i[0],l=i[1];return o.useEffect((function(){return t.current=!1,function(){t.current=!0}}),[]),[a,function(e,n){n&&t.current||l(e)}]}},3210:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(8210);const i=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=new Set;return function e(t,a){var l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,c=i.has(t);if((0,o.Ay)(!c,"Warning: There may be circular references"),c)return!1;if(t===a)return!0;if(n&&l>1)return!1;i.add(t);var s=l+1;if(Array.isArray(t)){if(!Array.isArray(a)||t.length!==a.length)return!1;for(var u=0;u{"use strict";n.d(t,{A:()=>o});var r=n(9379);function o(e,t){var n=(0,r.A)({},e);return Array.isArray(t)&&t.forEach((function(e){delete n[e]})),n}},5371:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=function(e){return+setTimeout(e,16)},o=function(e){return clearTimeout(e)};"undefined"!=typeof window&&"requestAnimationFrame"in window&&(r=function(e){return window.requestAnimationFrame(e)},o=function(e){return window.cancelAnimationFrame(e)});var i=0,a=new Map;function l(e){a.delete(e)}var c=function(e){var t=i+=1;return function n(o){if(0===o)l(t),e();else{var i=r((function(){n(o-1)}));a.set(t,i)}}(arguments.length>1&&void 0!==arguments[1]?arguments[1]:1),t};c.cancel=function(e){var t=a.get(e);return l(e),o(t)};const s=c},8719:(e,t,n)=>{"use strict";n.d(t,{K4:()=>l,Xf:()=>a,f3:()=>s,xK:()=>c});var r=n(2284),o=(n(6540),n(6351)),i=n(8104);function a(e,t){"function"==typeof e?e(t):"object"===(0,r.A)(e)&&e&&"current"in e&&(e.current=t)}function l(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{$e:()=>i,Ay:()=>s});var r={},o=[];function i(e,t){}function a(e,t){}function l(e,t,n){t||r[n]||(e(!1,n),r[n]=!0)}function c(e,t){l(i,e,t)}c.preMessage=function(e){o.push(e)},c.resetWarned=function(){r={}},c.noteOnce=function(e,t){l(a,e,t)};const s=c},7787:(e,t)=>{"use strict";var n,r=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),s=Symbol.for("react.context"),u=Symbol.for("react.server_context"),d=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),v=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),h=Symbol.for("react.offscreen");function g(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case i:case l:case a:case f:case p:return e;default:switch(e=e&&e.$$typeof){case u:case s:case d:case m:case v:case c:return e;default:return t}}case o:return t}}}n=Symbol.for("react.module.reference"),t.ForwardRef=d,t.isFragment=function(e){return g(e)===i},t.isMemo=function(e){return g(e)===v}},6351:(e,t,n)=>{"use strict";e.exports=n(7787)},3591:(e,t,n)=>{"use strict";n.d(t,{A:()=>C});var r=function(){if("undefined"!=typeof Map)return Map;function e(e,t){var n=-1;return e.some((function(e,r){return e[0]===t&&(n=r,!0)})),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){void 0===t&&(t=null);for(var n=0,r=this.__entries__;n0},e.prototype.connect_=function(){o&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),c?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){o&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t;l.some((function(e){return!!~n.indexOf(e)}))&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),u=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),S="undefined"!=typeof WeakMap?new WeakMap:new r,x=function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=s.getInstance(),r=new w(t,n,this);S.set(this,r)};["observe","unobserve","disconnect"].forEach((function(e){x.prototype[e]=function(){var t;return(t=S.get(this))[e].apply(t,arguments)}}));const C=void 0!==i.ResizeObserver?i.ResizeObserver:x},8028:e=>{e.exports=function(e){return e.replace(/[A-Z]/g,(function(e){return"-"+e.toLowerCase()})).toLowerCase()}},6942:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e="",t=0;t{"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);nr})},9417:(e,t,n)=>{"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,{A:()=>r})},3029:(e,t,n)=>{"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,{A:()=>r})},2901:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(8406);function o(e,t){for(var n=0;n{"use strict";n.d(t,{A:()=>a});var r=n(3954),o=n(2176),i=n(6822);function a(e){var t=(0,o.A)();return function(){var n,o=(0,r.A)(e);if(t){var a=(0,r.A)(this).constructor;n=Reflect.construct(o,arguments,a)}else n=o.apply(this,arguments);return(0,i.A)(this,n)}}},4467:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(8406);function o(e,t,n){return(t=(0,r.A)(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},3954:(e,t,n)=>{"use strict";function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}n.d(t,{A:()=>r})},5501:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3662);function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&(0,r.A)(e,t)}},2176:(e,t,n)=>{"use strict";function r(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(r=function(){return!!e})()}n.d(t,{A:()=>r})},9379:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(4467);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t{"use strict";n.d(t,{A:()=>o});var r=n(8587);function o(e,t){if(null==e)return{};var n,o,i=(0,r.A)(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(9417);function i(e,t){if(t&&("object"==(0,r.A)(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return(0,o.A)(e)}},6636:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(7800);function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,l=[],c=!0,s=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){s=!0,o=e}finally{try{if(!c&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(s)throw o}}return l}}(e,t)||(0,r.A)(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},4241:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(5526);var o=n(7800);function i(e){return function(e){if(Array.isArray(e))return(0,r.A)(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||(0,o.A)(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},8406:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(2284);function o(e){var t=function(e,t){if("object"!=(0,r.A)(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=(0,r.A)(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==(0,r.A)(t)?t:t+""}},2284:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}n.d(t,{A:()=>r})},7800:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(5526);function o(e,t){if(e){if("string"==typeof e)return(0,r.A)(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?(0,r.A)(e,t):void 0}}},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>a,x:()=>l});var r=n(6540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6256.71aff5ef.js.LICENSE.txt b/assets/js/6256.73278753.js.LICENSE.txt similarity index 100% rename from assets/js/6256.71aff5ef.js.LICENSE.txt rename to assets/js/6256.73278753.js.LICENSE.txt diff --git a/assets/js/632d0ef1.0eedb755.js b/assets/js/632d0ef1.0eedb755.js new file mode 100644 index 000000000..2f0c77a09 --- /dev/null +++ b/assets/js/632d0ef1.0eedb755.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[106],{7186:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"encoders/VTM","title":"VTM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/encoders/VTM.mdx","sourceDirName":"encoders","slug":"/encoders/VTM","permalink":"/docs/encoders/VTM","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/VTM.mdx","tags":[],"version":"current","sidebarPosition":14,"frontMatter":{"title":"VTM","sidebar_position":14},"sidebar":"tutorialSidebar","previous":{"title":"uvg266","permalink":"/docs/encoders/uvg266"},"next":{"title":"AVM","permalink":"/docs/encoders/AVM"}}');var i=t(4848),r=t(8453);const s={title:"VTM",sidebar_position:14},c="VTM",d={},a=[];function u(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"vtm",children:"VTM"})}),"\n",(0,i.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(n.p,{children:["VTM is the original ",(0,i.jsx)(n.a,{href:"/docs/video/VVC",children:"H.266"})," (better known as VVC) reference encoder, in competition with alternatives like ",(0,i.jsx)(n.a,{href:"/docs/encoders/VVenC",children:"VVenC"}),". In the modern day, it joins other MPEG reference encoders such as ",(0,i.jsx)(n.a,{href:"/docs/encoders/HM",children:"HM"})," & ",(0,i.jsx)(n.a,{href:"/docs/encoders/JM",children:"JM"})," in their reputations for being highly niche offerings that are used rarely due to their usage complexity & speed disadvantages; however, VTM may be more useful due to the current difficulty facing VVC encoding regardless of the encoding implementation one chooses to use. x264 is more efficient than JM."]})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var o=t(6540);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/632d0ef1.ef33279f.js b/assets/js/632d0ef1.ef33279f.js deleted file mode 100644 index e2b6a6849..000000000 --- a/assets/js/632d0ef1.ef33279f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[106],{1598:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=t(4848),i=t(8453);const r={title:"VTM",sidebar_position:14},s="VTM",c={id:"encoders/VTM",title:"VTM",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/encoders/VTM.mdx",sourceDirName:"encoders",slug:"/encoders/VTM",permalink:"/docs/encoders/VTM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/VTM.mdx",tags:[],version:"current",sidebarPosition:14,frontMatter:{title:"VTM",sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"uvg266",permalink:"/docs/encoders/uvg266"},next:{title:"AVM",permalink:"/docs/encoders/AVM"}},d={},a=[];function u(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"vtm",children:"VTM"})}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(n.p,{children:["VTM is the original ",(0,o.jsx)(n.a,{href:"/docs/video/VVC",children:"H.266"})," (better known as VVC) reference encoder, in competition with alternatives like ",(0,o.jsx)(n.a,{href:"/docs/encoders/VVenC",children:"VVenC"}),". In the modern day, it joins other MPEG reference encoders such as ",(0,o.jsx)(n.a,{href:"/docs/encoders/HM",children:"HM"})," & ",(0,o.jsx)(n.a,{href:"/docs/encoders/JM",children:"JM"})," in their reputations for being highly niche offerings that are used rarely due to their usage complexity & speed disadvantages; however, VTM may be more useful due to the current difficulty facing VVC encoding regardless of the encoding implementation one chooses to use. x264 is more efficient than JM."]})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var o=t(6540);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6549b2b5.a78520af.js b/assets/js/6549b2b5.a78520af.js deleted file mode 100644 index 460e3f655..000000000 --- a/assets/js/6549b2b5.a78520af.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4846],{2417:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>n,metadata:()=>r,toc:()=>c});var s=t(4848),o=t(8453);const n={title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/site-optimization",source:"@site/blog/2023-07-21-site-optimization.mdx",title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",date:"2023-07-21T00:00:00.000Z",tags:[{inline:!0,label:"image",permalink:"/blog/tags/image"},{inline:!0,label:"web",permalink:"/blog/tags/web"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"}],readingTime:9.25,hasTruncateMarker:!0,authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4",key:null,page:null}],frontMatter:{title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},l={authorsImageUrls:[void 0]},c=[{value:"Fire & Forget",id:"fire--forget",level:2},{value:"Massive Improvement",id:"massive-improvement",level:2},{value:"Lazy Loading",id:"lazy-loading",level:3},{value:"New Codecs",id:"new-codecs",level:2},{value:"Fallbacks",id:"fallbacks",level:3},{value:"Compression Efficacy",id:"compression-efficacy",level:3},{value:"Responsive Images",id:"responsive-images",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.p,{children:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics."}),"\n",(0,s.jsx)(i.admonition,{type:"caution",children:(0,s.jsxs)(i.p,{children:["These instructions are for ",(0,s.jsx)(i.em,{children:"photographic"})," images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently."]})}),"\n",(0,s.jsxs)(i.admonition,{type:"danger",children:[(0,s.jsx)(i.p,{children:"Many images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:"}),(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})," | ",(0,s.jsxs)(i.em,{children:["Linux, ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"macOS"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/thorium/releases/",children:"Windows"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"Android"})]})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://www.waterfox.net/",children:"Waterfox"})," | ",(0,s.jsxs)(i.em,{children:[(0,s.jsx)(i.a,{href:"https://flathub.org/apps/net.waterfox.waterfox",children:"Linux"}),", ",(0,s.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"macOS"}),", ",(0,s.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"Windows"})]})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})," | ",(0,s.jsxs)(i.em,{children:[(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Linux"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Windows"})]})]}),"\n"]})]}),"\n",(0,s.jsx)(i.h2,{id:"fire--forget",children:"Fire & Forget"}),"\n",(0,s.jsxs)(i.p,{children:["First, we'll illustrate what ",(0,s.jsx)(i.em,{children:"not"})," to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.em,{children:"exported straight from Darktable at JPEG q90, with no scaling"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"bloated_jpeg",src:t(8456).A+"",width:"5470",height:"3656"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"2.2 MB"})}),"\n",(0,s.jsx)(i.h2,{id:"massive-improvement",children:"Massive Improvement"}),"\n",(0,s.jsx)(i.p,{children:"The easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway."}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.img,{alt:"box-size-mac",src:t(4861).A+"",width:"2940",height:"1840"}),"\n",(0,s.jsx)(i.em,{children:"Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here."})]}),"\n",(0,s.jsxs)(i.p,{children:["The width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with ",(0,s.jsx)(i.code,{children:"cjpegli"}),", looks like this:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jpeg",src:t(2599).A+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:["Obviously, there's lost fidelity compared to the original, but considering this is ",(0,s.jsx)(i.em,{children:"so much smaller"}),", it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of ",(0,s.jsx)(i.code,{children:"cjpegli"}),", although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size."]}),"\n",(0,s.jsxs)(i.p,{children:["2.2 MB -> ",(0,s.jsx)(i.strong,{children:"233 kB"})]}),"\n",(0,s.jsx)(i.h3,{id:"lazy-loading",children:"Lazy Loading"}),"\n",(0,s.jsxs)(i.p,{children:["A bonus tip is to add the ",(0,s.jsx)(i.code,{children:'loading="lazy"'})," attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n alt text\n \n'})}),"\n",(0,s.jsx)(i.h2,{id:"new-codecs",children:"New Codecs"}),"\n",(0,s.jsxs)(i.p,{children:["If you desire further improvement, it may be time to consider using a newer codec like ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/AVIF",children:"AVIF"})," or ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/JXL",children:"JPEG-XL"}),". These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider ",(0,s.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"})," or ",(0,s.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering ",(0,s.jsx)(i.em,{children:"lossy"})," compression for ",(0,s.jsx)(i.em,{children:"photographic"})," images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now."]}),"\n",(0,s.jsx)(i.h3,{id:"fallbacks",children:"Fallbacks"}),"\n",(0,s.jsx)(i.p,{children:"AVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n \n \n \n alt text\n \n'})}),"\n",(0,s.jsx)(i.p,{children:"Here is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most."}),"\n",(0,s.jsx)(i.h3,{id:"compression-efficacy",children:"Compression Efficacy"}),"\n",(0,s.jsxs)(i.p,{children:["Let's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with ",(0,s.jsx)(i.code,{children:"cjpegli"})," (which scores ~",(0,s.jsx)(i.code,{children:"83.01"})," with the ",(0,s.jsx)(i.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," visual fidelity metric)."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jxl",src:t(5500).A+""})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"137.0 kB"})," ",(0,s.jsxs)(i.em,{children:["JPEG-XL image, encoded with ",(0,s.jsx)(i.code,{children:"cjxl lossless.png out.jxl -d 1.49 -e 9"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.04"})]})," ",(0,s.jsx)(i.em,{children:"3.06s user time"})]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_avif",src:t(6826).A+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"124.8 kB"})," ",(0,s.jsxs)(i.em,{children:["AVIF image, encoded with ",(0,s.jsx)(i.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.03"})]})," ",(0,s.jsx)(i.em,{children:"7.54s user time"})]}),"\n",(0,s.jsxs)(i.p,{children:["JXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the ",(0,s.jsx)(i.code,{children:"ssimulacra2"})," program decodes JPEG & JXL. Either way, the scores are fairly close."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jxl_jpeg-recomp",src:t(8831).A+""})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"189.4 kB"})," ",(0,s.jsxs)(i.em,{children:["JPEG-XL image from JPEG, encoded with ",(0,s.jsx)(i.code,{children:"cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11"}),". Score: ~",(0,s.jsx)(i.code,{children:"84.92"})," (???)"]})," ",(0,s.jsx)(i.em,{children:"0.67s user time"})]}),"\n",(0,s.jsxs)(i.p,{children:["The final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with ",(0,s.jsx)(i.code,{children:"cjpegli"})," encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine)."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jpeg_xyb",src:t(6737).A+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"208.3 kB"})," ",(0,s.jsxs)(i.em,{children:["XYB JPEG, encoded with ",(0,s.jsx)(i.code,{children:"cjpegli lossless.png out.jpg --xyb -d 1.155"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.04"})]})," ",(0,s.jsx)(i.em,{children:"0.10s user time"})]}),"\n",(0,s.jsx)(i.p,{children:"In this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode."}),"\n",(0,s.jsx)(i.h2,{id:"responsive-images",children:"Responsive Images"}),"\n",(0,s.jsxs)(i.p,{children:["Displaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the ",(0,s.jsx)(i.a,{href:"https://ausi.github.io/respimagelint/",children:"Responsive Image Linter"})," that can help us figure out which image sizes we should be using."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"responsive_image_linter",src:t(3357).A+"",width:"2308",height:"670"})}),"\n",(0,s.jsx)(i.p,{children:"In our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n \n \n alt text\n\n'})}),"\n",(0,s.jsx)(i.p,{children:"It is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"srcset"})," = the images available to your browser to serve, & their respective widths"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"sizes"})," = the conditions given to the browser explaining under what conditions should it serve which image"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"(min-width: XXXpx) YYYpx"})," = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels * display scaling."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"calc(100vw - 24px)"})," = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have ",(0,s.jsx)(i.code,{children:"(min-width: 997px) calc(75vw - 257px)"}),". This means given the viewport is at least 997px wide, calculate 0.75 * the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified."]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{type:"image/jxl",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jxl 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jxl 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jxl 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jxl 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jxl 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),(0,s.jsx)("source",{type:"image/avif",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.avif 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.avif 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.avif 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.avif 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.avif 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),(0,s.jsx)("img",{loading:"lazy",width:"1699",alt:"alt text",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jpg 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jpg 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jpg 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jpg 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jpg 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)",src:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/_DSC8466-smaller.jpg"})]}),"\n",(0,s.jsxs)(i.p,{children:["That's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their ",(0,s.jsx)(i.a,{href:"https://autocompressor.net/blog/reduce-image-load",children:"Reduce Your Page's Image Load"})," blog post when writing this entry. I have ",(0,s.jsx)(i.a,{href:"https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI",children:"confirmed"})," with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0."]})]})}function d(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8831:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-recomp-f3af6d54a8c1c62cda0c2d3ba048e1fc.jxl"},6737:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-xyb-0372077e225cf7b460ec9238bb2a65f9.jpg"},6826:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-452ed8f5a33da727be398450e7e580a3.avif"},2599:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-48eaf650a417558ea976bf40eee82f67.jpg"},5500:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-492a0639fb771671738062a57b2015a2.jxl"},8456:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-d51a7e87bed86d101412ba728ebc6be2.jpg"},4861:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/box-size-mac-f49e702b0cb4a531f65283ad604d4b4c.avif"},3357:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/responsive_image_linter-178eb56c12557c53a2b129dd75925fe9.avif"},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var s=t(6540);const o={},n=s.createContext(o);function a(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6549b2b5.f1203cf0.js b/assets/js/6549b2b5.f1203cf0.js new file mode 100644 index 000000000..81868a67e --- /dev/null +++ b/assets/js/6549b2b5.f1203cf0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4846],{2417:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var s=t(3107),o=t(4848),n=t(8453);const a={title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},r=void 0,l={authorsImageUrls:[void 0]},c=[{value:"Fire & Forget",id:"fire--forget",level:2},{value:"Massive Improvement",id:"massive-improvement",level:2},{value:"Lazy Loading",id:"lazy-loading",level:3},{value:"New Codecs",id:"new-codecs",level:2},{value:"Fallbacks",id:"fallbacks",level:3},{value:"Compression Efficacy",id:"compression-efficacy",level:3},{value:"Responsive Images",id:"responsive-images",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.p,{children:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics."}),"\n",(0,o.jsx)(i.admonition,{type:"caution",children:(0,o.jsxs)(i.p,{children:["These instructions are for ",(0,o.jsx)(i.em,{children:"photographic"})," images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently."]})}),"\n",(0,o.jsxs)(i.admonition,{type:"danger",children:[(0,o.jsx)(i.p,{children:"Many images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:"}),(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})," | ",(0,o.jsxs)(i.em,{children:["Linux, ",(0,o.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"macOS"}),", ",(0,o.jsx)(i.a,{href:"https://github.com/Alex313031/thorium/releases/",children:"Windows"}),", ",(0,o.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"Android"})]})]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.a,{href:"https://www.waterfox.net/",children:"Waterfox"})," | ",(0,o.jsxs)(i.em,{children:[(0,o.jsx)(i.a,{href:"https://flathub.org/apps/net.waterfox.waterfox",children:"Linux"}),", ",(0,o.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"macOS"}),", ",(0,o.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"Windows"})]})]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})," | ",(0,o.jsxs)(i.em,{children:[(0,o.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Linux"}),", ",(0,o.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Windows"})]})]}),"\n"]})]}),"\n",(0,o.jsx)(i.h2,{id:"fire--forget",children:"Fire & Forget"}),"\n",(0,o.jsxs)(i.p,{children:["First, we'll illustrate what ",(0,o.jsx)(i.em,{children:"not"})," to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:"]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.em,{children:"exported straight from Darktable at JPEG q90, with no scaling"})}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"bloated_jpeg",src:t(4901).A+"",width:"5470",height:"3656"})}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.strong,{children:"2.2 MB"})}),"\n",(0,o.jsx)(i.h2,{id:"massive-improvement",children:"Massive Improvement"}),"\n",(0,o.jsx)(i.p,{children:"The easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway."}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"box-size-mac",src:t(6666).A+"",width:"2940",height:"1840"}),"\n",(0,o.jsx)(i.em,{children:"Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here."})]}),"\n",(0,o.jsxs)(i.p,{children:["The width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with ",(0,o.jsx)(i.code,{children:"cjpegli"}),", looks like this:"]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"smaller_jpeg",src:t(5390).A+"",width:"1699",height:"1136"})}),"\n",(0,o.jsxs)(i.p,{children:["Obviously, there's lost fidelity compared to the original, but considering this is ",(0,o.jsx)(i.em,{children:"so much smaller"}),", it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of ",(0,o.jsx)(i.code,{children:"cjpegli"}),", although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size."]}),"\n",(0,o.jsxs)(i.p,{children:["2.2 MB -> ",(0,o.jsx)(i.strong,{children:"233 kB"})]}),"\n",(0,o.jsx)(i.h3,{id:"lazy-loading",children:"Lazy Loading"}),"\n",(0,o.jsxs)(i.p,{children:["A bonus tip is to add the ",(0,o.jsx)(i.code,{children:'loading="lazy"'})," attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:"]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-html",children:'\n alt text\n \n'})}),"\n",(0,o.jsx)(i.h2,{id:"new-codecs",children:"New Codecs"}),"\n",(0,o.jsxs)(i.p,{children:["If you desire further improvement, it may be time to consider using a newer codec like ",(0,o.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/AVIF",children:"AVIF"})," or ",(0,o.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/JXL",children:"JPEG-XL"}),". These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider ",(0,o.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"})," or ",(0,o.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering ",(0,o.jsx)(i.em,{children:"lossy"})," compression for ",(0,o.jsx)(i.em,{children:"photographic"})," images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now."]}),"\n",(0,o.jsx)(i.h3,{id:"fallbacks",children:"Fallbacks"}),"\n",(0,o.jsx)(i.p,{children:"AVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-html",children:'\n \n \n \n alt text\n \n'})}),"\n",(0,o.jsx)(i.p,{children:"Here is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most."}),"\n",(0,o.jsx)(i.h3,{id:"compression-efficacy",children:"Compression Efficacy"}),"\n",(0,o.jsxs)(i.p,{children:["Let's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with ",(0,o.jsx)(i.code,{children:"cjpegli"})," (which scores ~",(0,o.jsx)(i.code,{children:"83.01"})," with the ",(0,o.jsx)(i.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," visual fidelity metric)."]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"smaller_jxl",src:t(4405).A+""})}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.strong,{children:"137.0 kB"})," ",(0,o.jsxs)(i.em,{children:["JPEG-XL image, encoded with ",(0,o.jsx)(i.code,{children:"cjxl lossless.png out.jxl -d 1.49 -e 9"}),". Score: ~",(0,o.jsx)(i.code,{children:"83.04"})]})," ",(0,o.jsx)(i.em,{children:"3.06s user time"})]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"smaller_avif",src:t(5437).A+"",width:"1699",height:"1136"})}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.strong,{children:"124.8 kB"})," ",(0,o.jsxs)(i.em,{children:["AVIF image, encoded with ",(0,o.jsx)(i.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif"}),". Score: ~",(0,o.jsx)(i.code,{children:"83.03"})]})," ",(0,o.jsx)(i.em,{children:"7.54s user time"})]}),"\n",(0,o.jsxs)(i.p,{children:["JXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the ",(0,o.jsx)(i.code,{children:"ssimulacra2"})," program decodes JPEG & JXL. Either way, the scores are fairly close."]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"smaller_jxl_jpeg-recomp",src:t(3988).A+""})}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.strong,{children:"189.4 kB"})," ",(0,o.jsxs)(i.em,{children:["JPEG-XL image from JPEG, encoded with ",(0,o.jsx)(i.code,{children:"cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11"}),". Score: ~",(0,o.jsx)(i.code,{children:"84.92"})," (???)"]})," ",(0,o.jsx)(i.em,{children:"0.67s user time"})]}),"\n",(0,o.jsxs)(i.p,{children:["The final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with ",(0,o.jsx)(i.code,{children:"cjpegli"})," encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine)."]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"smaller_jpeg_xyb",src:t(7280).A+"",width:"1699",height:"1136"})}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.strong,{children:"208.3 kB"})," ",(0,o.jsxs)(i.em,{children:["XYB JPEG, encoded with ",(0,o.jsx)(i.code,{children:"cjpegli lossless.png out.jpg --xyb -d 1.155"}),". Score: ~",(0,o.jsx)(i.code,{children:"83.04"})]})," ",(0,o.jsx)(i.em,{children:"0.10s user time"})]}),"\n",(0,o.jsx)(i.p,{children:"In this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode."}),"\n",(0,o.jsx)(i.h2,{id:"responsive-images",children:"Responsive Images"}),"\n",(0,o.jsxs)(i.p,{children:["Displaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the ",(0,o.jsx)(i.a,{href:"https://ausi.github.io/respimagelint/",children:"Responsive Image Linter"})," that can help us figure out which image sizes we should be using."]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"responsive_image_linter",src:t(3548).A+"",width:"2308",height:"670"})}),"\n",(0,o.jsx)(i.p,{children:"In our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-html",children:'\n \n \n alt text\n\n'})}),"\n",(0,o.jsx)(i.p,{children:"It is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"srcset"})," = the images available to your browser to serve, & their respective widths"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"sizes"})," = the conditions given to the browser explaining under what conditions should it serve which image"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"(min-width: XXXpx) YYYpx"})," = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels * display scaling."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"calc(100vw - 24px)"})," = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have ",(0,o.jsx)(i.code,{children:"(min-width: 997px) calc(75vw - 257px)"}),". This means given the viewport is at least 997px wide, calculate 0.75 * the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified."]}),"\n"]}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{type:"image/jxl",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jxl 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jxl 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jxl 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jxl 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jxl 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),(0,o.jsx)("source",{type:"image/avif",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.avif 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.avif 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.avif 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.avif 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.avif 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),(0,o.jsx)("img",{loading:"lazy",width:"1699",alt:"alt text",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jpg 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jpg 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jpg 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jpg 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jpg 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)",src:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/_DSC8466-smaller.jpg"})]}),"\n",(0,o.jsxs)(i.p,{children:["That's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their ",(0,o.jsx)(i.a,{href:"https://autocompressor.net/blog/reduce-image-load",children:"Reduce Your Page's Image Load"})," blog post when writing this entry. I have ",(0,o.jsx)(i.a,{href:"https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI",children:"confirmed"})," with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0."]})]})}function d(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},3988:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-recomp-f3af6d54a8c1c62cda0c2d3ba048e1fc.jxl"},7280:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-xyb-0372077e225cf7b460ec9238bb2a65f9.jpg"},5437:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-452ed8f5a33da727be398450e7e580a3.avif"},5390:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-48eaf650a417558ea976bf40eee82f67.jpg"},4405:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-492a0639fb771671738062a57b2015a2.jxl"},4901:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-d51a7e87bed86d101412ba728ebc6be2.jpg"},6666:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/box-size-mac-f49e702b0cb4a531f65283ad604d4b4c.avif"},3548:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/responsive_image_linter-178eb56c12557c53a2b129dd75925fe9.avif"},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var s=t(6540);const o={},n=s.createContext(o);function a(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(n.Provider,{value:i},e.children)}},3107:e=>{e.exports=JSON.parse('{"permalink":"/blog/site-optimization","source":"@site/blog/2023-07-21-site-optimization.mdx","title":"Reducing Image Load Online","description":"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.","date":"2023-07-21T00:00:00.000Z","tags":[{"inline":true,"label":"image","permalink":"/blog/tags/image"},{"inline":true,"label":"web","permalink":"/blog/tags/web"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"}],"readingTime":9.25,"hasTruncateMarker":true,"authors":[{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Reducing Image Load Online","description":"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.","slug":"site-optimization","authors":[{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"}],"tags":["image","web","compression"],"image":"/img/_DSC8466-smaller.jpg","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies"}}')}}]); \ No newline at end of file diff --git a/assets/js/65524f4d.62b7f26f.js b/assets/js/65524f4d.62b7f26f.js new file mode 100644 index 000000000..0309fa315 --- /dev/null +++ b/assets/js/65524f4d.62b7f26f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6891],{319:(i,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"filtering/antialiasing","title":"Antialiasing","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/filtering/antialiasing.mdx","sourceDirName":"filtering","slug":"/filtering/antialiasing","permalink":"/docs/filtering/antialiasing","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/antialiasing.mdx","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"Antialiasing","sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Dehalo","permalink":"/docs/filtering/dehalo"},"next":{"title":"Deband","permalink":"/docs/filtering/deband"}}');var o=t(4848),a=t(8453);const s={title:"Antialiasing",sidebar_position:10},r="Antialiasing",c={},l=[];function d(i){const e={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,a.R)(),...i.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"antialiasing",children:"Antialiasing"})}),"\n",(0,o.jsx)(e.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(e.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(e.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(i={}){const{wrapper:e}={...(0,a.R)(),...i.components};return e?(0,o.jsx)(e,{...i,children:(0,o.jsx)(d,{...i})}):d(i)}},8453:(i,e,t)=>{t.d(e,{R:()=>s,x:()=>r});var n=t(6540);const o={},a=n.createContext(o);function s(i){const e=n.useContext(a);return n.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function r(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(o):i.components||o:s(i.components),n.createElement(a.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/assets/js/65524f4d.892c1f47.js b/assets/js/65524f4d.892c1f47.js deleted file mode 100644 index 5478aaeab..000000000 --- a/assets/js/65524f4d.892c1f47.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6891],{2030:(i,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var n=t(4848),o=t(8453);const a={title:"Antialiasing",sidebar_position:10},s="Antialiasing",r={id:"filtering/antialiasing",title:"Antialiasing",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/antialiasing.mdx",sourceDirName:"filtering",slug:"/filtering/antialiasing",permalink:"/docs/filtering/antialiasing",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/antialiasing.mdx",tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"Antialiasing",sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"Dehalo",permalink:"/docs/filtering/dehalo"},next:{title:"Deband",permalink:"/docs/filtering/deband"}},c={},l=[];function d(i){const e={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...i.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"antialiasing",children:"Antialiasing"})}),"\n",(0,n.jsx)(e.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(e.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(e.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(i={}){const{wrapper:e}={...(0,o.R)(),...i.components};return e?(0,n.jsx)(e,{...i,children:(0,n.jsx)(d,{...i})}):d(i)}},8453:(i,e,t)=>{t.d(e,{R:()=>s,x:()=>r});var n=t(6540);const o={},a=n.createContext(o);function s(i){const e=n.useContext(a);return n.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function r(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(o):i.components||o:s(i.components),n.createElement(a.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/assets/js/68dcf780.91c3ce2d.js b/assets/js/68dcf780.91c3ce2d.js deleted file mode 100644 index dbb147266..000000000 --- a/assets/js/68dcf780.91c3ce2d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1315],{1538:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>a});var n=t(4848),o=t(8453);const r={title:"Decombing",sidebar_position:6},c="Decombing",s={id:"filtering/decombing",title:"Decombing",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/decombing.mdx",sourceDirName:"filtering",slug:"/filtering/decombing",permalink:"/docs/filtering/decombing",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/decombing.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Decombing",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Deinterlace",permalink:"/docs/filtering/deinterlace"},next:{title:"Stabilizing",permalink:"/docs/filtering/stabilizing"}},d={},a=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"decombing",children:"Decombing"})}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>c,x:()=>s});var n=t(6540);const o={},r=n.createContext(o);function c(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/68dcf780.a29fdadd.js b/assets/js/68dcf780.a29fdadd.js new file mode 100644 index 000000000..5d5898a3e --- /dev/null +++ b/assets/js/68dcf780.a29fdadd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1315],{5956:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"filtering/decombing","title":"Decombing","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/filtering/decombing.mdx","sourceDirName":"filtering","slug":"/filtering/decombing","permalink":"/docs/filtering/decombing","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/decombing.mdx","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"Decombing","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"Deinterlace","permalink":"/docs/filtering/deinterlace"},"next":{"title":"Stabilizing","permalink":"/docs/filtering/stabilizing"}}');var o=i(4848),r=i(8453);const s={title:"Decombing",sidebar_position:6},c="Decombing",a={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"decombing",children:"Decombing"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>c});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6bf0f114.ae960720.js b/assets/js/6bf0f114.ae960720.js deleted file mode 100644 index d492dc70d..000000000 --- a/assets/js/6bf0f114.ae960720.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[881],{779:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>n,metadata:()=>r,toc:()=>c});var s=t(4848),o=t(8453);const n={title:"ZIP",sidebar_position:1},a="ZIP",r={id:"data/zip",title:"ZIP",description:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.",source:"@site/docs/data/zip.mdx",sourceDirName:"data",slug:"/data/zip",permalink:"/docs/data/zip",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zip.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"ZIP",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"ECM",permalink:"/docs/video/ECM"},next:{title:"gzip",permalink:"/docs/data/gzip"}},d={},c=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"History",id:"history",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Linux & macOS",id:"linux--macos",level:4},{value:"Windows",id:"windows",level:4},{value:"Conclusion",id:"conclusion",level:2}];function l(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"zip",children:"ZIP"})}),"\n",(0,s.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,s.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,s.jsxs)(i.p,{children:["ZIP is an archive file format that supports lossless data compression. A ZIP file may contain one or more files or directories that may have been compressed using any one of a number of different algorithms present in the ZIP specification. The most common algorithm used in ZIP is DEFLATE, which is also used in ",(0,s.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," & ",(0,s.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"Deflate acts as a combination of LZ77 lossless coding & Huffman coding, where it can first use LZ77 to find patterns in the data & reduce redundancy. This is followed by using Huffman coding to assign smaller bit values to patterns found more frequently by LZ77."}),"\n",(0,s.jsx)(i.p,{children:"Additionally, files in a ZIP archive are compressed individually so it is possible to extract existing files or add new ones without applying compression or decompression to the entire archive."}),"\n",(0,s.jsxs)(i.p,{children:['ZIP is noteworthy for its nearly universal compatibility. "Traditional ZIP" (compression method 8 in the ZIP specification) limits the size of compressed archives to 4 GB, though most ZIP compressors use Deflate64(tm) (compression level 9 in the ZIP specification) to bypass this limitation. ZIP is competitive with ',(0,s.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," and has been succeeded many times by formats & algorithms such as ",(0,s.jsx)(i.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/brotli",children:"brotli"})," (to a degree), and ",(0,s.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,s.jsx)(i.p,{children:'DEFLATE is an LZ77-based compressor that finds repeated sequences of bytes in the input data and replaces them with shorter references to previous occurrences. It also uses Huffman coding to encode the symbols with variable-length codes based on how frequently they occur. DEFLATE has two modes for each block of compressed data: These are specified as either "static" or "dynamic" Huffman compressed blocks. In static mode, the Huffman codes are fixed and predefined. In dynamic mode, the Huffman codes are generated dynamically & transmitted along with the compressed data.'}),"\n",(0,s.jsx)(i.p,{children:"ZIP files have a specific structure that consists of four main file header components: local file headers, central directory file headers, end of central directory record, and data descriptors. The local file headers store information about each compressed file, such as its name, size, CRC-32 checksum, compression method, and optional extra fields. The central directory file headers store similar information as the local file headers, but also include the offset of each local file header in the ZIP file. The end of central directory record marks the end of the ZIP file and contains information about the number and size of the central directory file headers. The data descriptors are optional and store additional information about the compressed data, such as its CRC-32 checksum, uncompressed size, & compressed size."}),"\n",(0,s.jsxs)(i.p,{children:["ZIP files can also support other compression methods, such as Deflate64(tm), BZIP2, LZMA, & ",(0,s.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),". These methods are not widely supported by most ZIP utilities and may cause compatibility issues. ZIP files can also contain uncompressed data. The format also supports encryption to protect the data from unauthorized access. There are two types of encryption supported by ZIP: traditional ZipCrypto encryption and strong encryption. ZipCrypto encryption is considered insecure, while stronger encryption in ZIP uses more resilient algorithms albiet spread across a number of standards. Because of this, strong encryption is not standardized and may cause compatibility issues."]}),"\n",(0,s.jsx)(i.p,{children:"ZIP files can reduce the size of files and folders by more efficiently representing redundant data. They can also combine multiple files and folders into a single archive that can be easily transferred or stored. You will not find a more popular implementation than ZIP for general data compression purposes like these. ZIP files can also preserve the metadata of the original files, such as their names, paths, dates, and attributes. However, ZIP files also have some limitations and concerns. For example, traditional ZIP files (that aren't ZIP64) have a maximum size of 4 gigabytes for each compressed file and 65,535 entries for each archive. Most ZIP implementations do not support symbolic links or hard links within the archive."}),"\n",(0,s.jsxs)(i.p,{children:['Additionally, ZIP can be encoded in a number of different ways. Apple has a default "Compress" option in Finder that compresses selected files into a ZIP file, and many Linux desktops offer GUI functionality for creating ZIP files easily as well. It is common to compress to ZIP on Windows using the 7-zip data compression & decompression utility (not to be confused with the ',(0,s.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip compression format"}),", though the two are related)."]}),"\n",(0,s.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,s.jsx)(i.p,{children:"The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation, PKZIP, was shareware."}),"\n",(0,s.jsxs)(i.p,{children:["A ",(0,s.jsx)(i.a,{href:"http://www.digitalpreservation.gov/formats/fdd/fdd000361.shtml",children:"restricted ZIP format"})," exists and is used in other filetypes such as Java .jar archives, a slew of Microsoft Office file formats, Office Document Format files (.odt, .ods, .odp), and EPUB files for e-readers."]}),"\n",(0,s.jsxs)(i.p,{children:['In around 1990, Info-ZIP came onto the scene. "Info-ZIP\'s purpose is to provide free, portable, high-quality versions of the Zip and UnZip compressor-archiver utilities that are compatible with the DOS-based PKZIP by PKWARE, Inc." (',(0,s.jsx)(i.a,{href:"https://infozip.sourceforge.net/",children:"https://infozip.sourceforge.net/"}),"). They did this successfully, leading to increased adoption of the ZIP format."]}),"\n",(0,s.jsxs)(i.p,{children:["In the early 1990s the ",(0,s.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix ",(0,s.jsx)(i.code,{children:"compress"})," utility, which used the (at the time) patented LZW compression algorithm which threatened its free use. Though some specific implementations of Deflate were patented by Phil Katz, the format was not, so a Deflate implementation that did not infringe on any patents was written."]}),"\n",(0,s.jsxs)(i.p,{children:["Unlike ",(0,s.jsx)(i.code,{children:".tar"}),", ",(0,s.jsx)(i.code,{children:".zip"})," has a central directory at the end, which provides a list of the contents. That and the separate compression provides random access to the individual entries in a ",(0,s.jsx)(i.code,{children:".zip"})," file. A ",(0,s.jsx)(i.code,{children:".tar"})," file would have to be decompressed and scanned from start to end in order to build a directory."]}),"\n",(0,s.jsxs)(i.p,{children:["The popular ",(0,s.jsx)(i.code,{children:"tar"})," utility, which creates an archive of files, has an option to compress directly to the ",(0,s.jsx)(i.code,{children:".tar.gz"})," format and is a very popular use caze for gzip. Since the compression of a ",(0,s.jsx)(i.code,{children:".tar"})," can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. ",(0,s.jsx)(i.code,{children:".tar.gz"})," is the most common archive format in use on Unix due to its very high portability, but there are better compression methods available. Some of these include ",(0,s.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/brotli",children:"brotli"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"}),", & ",(0,s.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["In this case, the benefit of ZIP is that because it compresses files separately and builds a central directory at the end of the archive which provides a list of the contents, ZIP provides random access to the individual entries in a ",(0,s.jsx)(i.code,{children:".zip"})," file. A ",(0,s.jsx)(i.code,{children:".tar"})," file would have to be decompressed and scanned from start to end in order to build a directory."]}),"\n",(0,s.jsx)(i.h2,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsx)(i.h4,{id:"linux--macos",children:"Linux & macOS"}),"\n",(0,s.jsxs)(i.p,{children:['To encode to a ZIP file most efficiently on Linux or macOS, it is worth using the 7-zip implementation of DEFLATE for ZIP compression. The 7zip website\'s homepage claims: "For ZIP and GZIP formats, 7-Zip provides a compression ratio that is 2-10 % better than the ratio provided by PKZip and WinZip." You can use the highly flexible 7-zip CLI utility through binaries available on ',(0,s.jsx)(i.a,{href:"https://www.7-zip.org/download.html",children:"7-zip's Download page"}),". Here are some direct download links: ",(0,s.jsx)(i.a,{href:"https://www.7-zip.org/a/7z2301-linux-x64.tar.xz",children:"Linux x86_64"})," | ",(0,s.jsx)(i.a,{href:"https://www.7-zip.org/a/7z2301-mac.tar.xz",children:"macOS Universal"})]}),"\n",(0,s.jsxs)(i.p,{children:["Once you've downloaded the utility, remember whether you are choosing to use the ",(0,s.jsx)(i.code,{children:"7zz"})," binary or the static ",(0,s.jsx)(i.code,{children:"7zzs"})," binary. Commands run using ",(0,s.jsx)(i.code,{children:"7zz"})," should run using ",(0,s.jsx)(i.code,{children:"7zzs"})," as well, so please replace ",(0,s.jsx)(i.code,{children:"7zz"})," in our examples as appropriate if you choose not to use it. Additionally, please copy your choice of binary to your ",(0,s.jsx)(i.code,{children:"/usr/local/bin"})," if you want to be able to use it everywhere."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"To encode a ZIP file at the lowest effort setting using one thread:"}),"\n"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:'7zz a -bso0 -tzip -mmt1 -mx1 "Output.zip" "Input"\n'})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"To encode a ZIP file at the highest effort setting using eight threads:"}),"\n"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:'7zz a -bso0 -tzip -mmt8 -mx9 "Output.zip" "Input"\n'})}),"\n",(0,s.jsx)(i.h4,{id:"windows",children:"Windows"}),"\n",(0,s.jsx)(i.p,{children:"To be filled."}),"\n",(0,s.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,s.jsx)(i.p,{children:"The only real benefit of using ZIP over more modern formats currently is compatibility. It may be viable when compared to 7z & XZ due to a reduction in complexity that improves encode & decode speed, but Zstandard is incredibly performant in both of these areas and generally outperforms ZIP. When it comes to content delivery on the Web, Brotli has been adopted across all modern web browsers and offers a better alternative to older compression technologies used on the Web that resemble ZIP."})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var s=t(6540);const o={},n=s.createContext(o);function a(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6bf0f114.b3af70b8.js b/assets/js/6bf0f114.b3af70b8.js new file mode 100644 index 000000000..b486a309e --- /dev/null +++ b/assets/js/6bf0f114.b3af70b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[881],{1149:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"data/zip","title":"ZIP","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","source":"@site/docs/data/zip.mdx","sourceDirName":"data","slug":"/data/zip","permalink":"/docs/data/zip","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zip.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"ZIP","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"ECM","permalink":"/docs/video/ECM"},"next":{"title":"gzip","permalink":"/docs/data/gzip"}}');var o=t(4848),a=t(8453);const n={title:"ZIP",sidebar_position:1},r="ZIP",d={},c=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"History",id:"history",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Linux & macOS",id:"linux--macos",level:4},{value:"Windows",id:"windows",level:4},{value:"Conclusion",id:"conclusion",level:2}];function l(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"zip",children:"ZIP"})}),"\n",(0,o.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,o.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,o.jsxs)(i.p,{children:["ZIP is an archive file format that supports lossless data compression. A ZIP file may contain one or more files or directories that may have been compressed using any one of a number of different algorithms present in the ZIP specification. The most common algorithm used in ZIP is DEFLATE, which is also used in ",(0,o.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," & ",(0,o.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"}),"."]}),"\n",(0,o.jsx)(i.p,{children:"Deflate acts as a combination of LZ77 lossless coding & Huffman coding, where it can first use LZ77 to find patterns in the data & reduce redundancy. This is followed by using Huffman coding to assign smaller bit values to patterns found more frequently by LZ77."}),"\n",(0,o.jsx)(i.p,{children:"Additionally, files in a ZIP archive are compressed individually so it is possible to extract existing files or add new ones without applying compression or decompression to the entire archive."}),"\n",(0,o.jsxs)(i.p,{children:['ZIP is noteworthy for its nearly universal compatibility. "Traditional ZIP" (compression method 8 in the ZIP specification) limits the size of compressed archives to 4 GB, though most ZIP compressors use Deflate64(tm) (compression level 9 in the ZIP specification) to bypass this limitation. ZIP is competitive with ',(0,o.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," and has been succeeded many times by formats & algorithms such as ",(0,o.jsx)(i.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,o.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),", ",(0,o.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"}),", ",(0,o.jsx)(i.a,{href:"/docs/data/brotli",children:"brotli"})," (to a degree), and ",(0,o.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),"."]}),"\n",(0,o.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,o.jsx)(i.p,{children:'DEFLATE is an LZ77-based compressor that finds repeated sequences of bytes in the input data and replaces them with shorter references to previous occurrences. It also uses Huffman coding to encode the symbols with variable-length codes based on how frequently they occur. DEFLATE has two modes for each block of compressed data: These are specified as either "static" or "dynamic" Huffman compressed blocks. In static mode, the Huffman codes are fixed and predefined. In dynamic mode, the Huffman codes are generated dynamically & transmitted along with the compressed data.'}),"\n",(0,o.jsx)(i.p,{children:"ZIP files have a specific structure that consists of four main file header components: local file headers, central directory file headers, end of central directory record, and data descriptors. The local file headers store information about each compressed file, such as its name, size, CRC-32 checksum, compression method, and optional extra fields. The central directory file headers store similar information as the local file headers, but also include the offset of each local file header in the ZIP file. The end of central directory record marks the end of the ZIP file and contains information about the number and size of the central directory file headers. The data descriptors are optional and store additional information about the compressed data, such as its CRC-32 checksum, uncompressed size, & compressed size."}),"\n",(0,o.jsxs)(i.p,{children:["ZIP files can also support other compression methods, such as Deflate64(tm), BZIP2, LZMA, & ",(0,o.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),". These methods are not widely supported by most ZIP utilities and may cause compatibility issues. ZIP files can also contain uncompressed data. The format also supports encryption to protect the data from unauthorized access. There are two types of encryption supported by ZIP: traditional ZipCrypto encryption and strong encryption. ZipCrypto encryption is considered insecure, while stronger encryption in ZIP uses more resilient algorithms albiet spread across a number of standards. Because of this, strong encryption is not standardized and may cause compatibility issues."]}),"\n",(0,o.jsx)(i.p,{children:"ZIP files can reduce the size of files and folders by more efficiently representing redundant data. They can also combine multiple files and folders into a single archive that can be easily transferred or stored. You will not find a more popular implementation than ZIP for general data compression purposes like these. ZIP files can also preserve the metadata of the original files, such as their names, paths, dates, and attributes. However, ZIP files also have some limitations and concerns. For example, traditional ZIP files (that aren't ZIP64) have a maximum size of 4 gigabytes for each compressed file and 65,535 entries for each archive. Most ZIP implementations do not support symbolic links or hard links within the archive."}),"\n",(0,o.jsxs)(i.p,{children:['Additionally, ZIP can be encoded in a number of different ways. Apple has a default "Compress" option in Finder that compresses selected files into a ZIP file, and many Linux desktops offer GUI functionality for creating ZIP files easily as well. It is common to compress to ZIP on Windows using the 7-zip data compression & decompression utility (not to be confused with the ',(0,o.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip compression format"}),", though the two are related)."]}),"\n",(0,o.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,o.jsx)(i.p,{children:"The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation, PKZIP, was shareware."}),"\n",(0,o.jsxs)(i.p,{children:["A ",(0,o.jsx)(i.a,{href:"http://www.digitalpreservation.gov/formats/fdd/fdd000361.shtml",children:"restricted ZIP format"})," exists and is used in other filetypes such as Java .jar archives, a slew of Microsoft Office file formats, Office Document Format files (.odt, .ods, .odp), and EPUB files for e-readers."]}),"\n",(0,o.jsxs)(i.p,{children:['In around 1990, Info-ZIP came onto the scene. "Info-ZIP\'s purpose is to provide free, portable, high-quality versions of the Zip and UnZip compressor-archiver utilities that are compatible with the DOS-based PKZIP by PKWARE, Inc." (',(0,o.jsx)(i.a,{href:"https://infozip.sourceforge.net/",children:"https://infozip.sourceforge.net/"}),"). They did this successfully, leading to increased adoption of the ZIP format."]}),"\n",(0,o.jsxs)(i.p,{children:["In the early 1990s the ",(0,o.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix ",(0,o.jsx)(i.code,{children:"compress"})," utility, which used the (at the time) patented LZW compression algorithm which threatened its free use. Though some specific implementations of Deflate were patented by Phil Katz, the format was not, so a Deflate implementation that did not infringe on any patents was written."]}),"\n",(0,o.jsxs)(i.p,{children:["Unlike ",(0,o.jsx)(i.code,{children:".tar"}),", ",(0,o.jsx)(i.code,{children:".zip"})," has a central directory at the end, which provides a list of the contents. That and the separate compression provides random access to the individual entries in a ",(0,o.jsx)(i.code,{children:".zip"})," file. A ",(0,o.jsx)(i.code,{children:".tar"})," file would have to be decompressed and scanned from start to end in order to build a directory."]}),"\n",(0,o.jsxs)(i.p,{children:["The popular ",(0,o.jsx)(i.code,{children:"tar"})," utility, which creates an archive of files, has an option to compress directly to the ",(0,o.jsx)(i.code,{children:".tar.gz"})," format and is a very popular use caze for gzip. Since the compression of a ",(0,o.jsx)(i.code,{children:".tar"})," can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. ",(0,o.jsx)(i.code,{children:".tar.gz"})," is the most common archive format in use on Unix due to its very high portability, but there are better compression methods available. Some of these include ",(0,o.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),", ",(0,o.jsx)(i.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,o.jsx)(i.a,{href:"/docs/data/brotli",children:"brotli"}),", ",(0,o.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"}),", & ",(0,o.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),"."]}),"\n",(0,o.jsxs)(i.p,{children:["In this case, the benefit of ZIP is that because it compresses files separately and builds a central directory at the end of the archive which provides a list of the contents, ZIP provides random access to the individual entries in a ",(0,o.jsx)(i.code,{children:".zip"})," file. A ",(0,o.jsx)(i.code,{children:".tar"})," file would have to be decompressed and scanned from start to end in order to build a directory."]}),"\n",(0,o.jsx)(i.h2,{id:"encoding",children:"Encoding"}),"\n",(0,o.jsx)(i.h4,{id:"linux--macos",children:"Linux & macOS"}),"\n",(0,o.jsxs)(i.p,{children:['To encode to a ZIP file most efficiently on Linux or macOS, it is worth using the 7-zip implementation of DEFLATE for ZIP compression. The 7zip website\'s homepage claims: "For ZIP and GZIP formats, 7-Zip provides a compression ratio that is 2-10 % better than the ratio provided by PKZip and WinZip." You can use the highly flexible 7-zip CLI utility through binaries available on ',(0,o.jsx)(i.a,{href:"https://www.7-zip.org/download.html",children:"7-zip's Download page"}),". Here are some direct download links: ",(0,o.jsx)(i.a,{href:"https://www.7-zip.org/a/7z2301-linux-x64.tar.xz",children:"Linux x86_64"})," | ",(0,o.jsx)(i.a,{href:"https://www.7-zip.org/a/7z2301-mac.tar.xz",children:"macOS Universal"})]}),"\n",(0,o.jsxs)(i.p,{children:["Once you've downloaded the utility, remember whether you are choosing to use the ",(0,o.jsx)(i.code,{children:"7zz"})," binary or the static ",(0,o.jsx)(i.code,{children:"7zzs"})," binary. Commands run using ",(0,o.jsx)(i.code,{children:"7zz"})," should run using ",(0,o.jsx)(i.code,{children:"7zzs"})," as well, so please replace ",(0,o.jsx)(i.code,{children:"7zz"})," in our examples as appropriate if you choose not to use it. Additionally, please copy your choice of binary to your ",(0,o.jsx)(i.code,{children:"/usr/local/bin"})," if you want to be able to use it everywhere."]}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"To encode a ZIP file at the lowest effort setting using one thread:"}),"\n"]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:'7zz a -bso0 -tzip -mmt1 -mx1 "Output.zip" "Input"\n'})}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"To encode a ZIP file at the highest effort setting using eight threads:"}),"\n"]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:'7zz a -bso0 -tzip -mmt8 -mx9 "Output.zip" "Input"\n'})}),"\n",(0,o.jsx)(i.h4,{id:"windows",children:"Windows"}),"\n",(0,o.jsx)(i.p,{children:"To be filled."}),"\n",(0,o.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,o.jsx)(i.p,{children:"The only real benefit of using ZIP over more modern formats currently is compatibility. It may be viable when compared to 7z & XZ due to a reduction in complexity that improves encode & decode speed, but Zstandard is incredibly performant in both of these areas and generally outperforms ZIP. When it comes to content delivery on the Web, Brotli has been adopted across all modern web browsers and offers a better alternative to older compression technologies used on the Web that resemble ZIP."})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>n,x:()=>r});var s=t(6540);const o={},a=s.createContext(o);function n(e){const i=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:n(e.components),s.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6c179ac5.d6e485fd.js b/assets/js/6c179ac5.d6e485fd.js new file mode 100644 index 000000000..feabdfb01 --- /dev/null +++ b/assets/js/6c179ac5.d6e485fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4072],{9569:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"video/Theora","title":"Theora","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/Theora.mdx","sourceDirName":"video","slug":"/video/Theora","permalink":"/docs/video/Theora","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/Theora.mdx","tags":[],"version":"current","sidebarPosition":9,"frontMatter":{"title":"Theora","sidebar_position":9},"sidebar":"tutorialSidebar","previous":{"title":"VC-1","permalink":"/docs/video/VC-1"},"next":{"title":"FFV1","permalink":"/docs/video/FFV1"}}');var t=i(4848),r=i(8453);const s={title:"Theora",sidebar_position:9},d="Theora",c={},a=[{value:"Encoding",id:"encoding",level:2}];function h(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"theora",children:"Theora"})}),"\n",(0,t.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(o.p,{children:["Theora is a legacy video codec first released in 2004. It is derived from VP3, part of the same family of codecs that formed ",(0,t.jsx)(o.a,{href:"/docs/video/VP8",children:"VP8"}),", ",(0,t.jsx)(o.a,{href:"/docs/video/VP9",children:"VP9"})," and ",(0,t.jsx)(o.a,{href:"/docs/video/AV1",children:"AV1"}),"."]}),"\n",(0,t.jsx)(o.h2,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsxs)(o.p,{children:["Theora is frequently contained within a ogg (",(0,t.jsx)(o.code,{children:".ogg"})," or ",(0,t.jsx)(o.code,{children:".ogv"}),") container with ",(0,t.jsx)(o.a,{href:"/docs/audio/Vorbis",children:"vorbis"})," audio."]}),"\n",(0,t.jsx)(o.p,{children:"To be filled."})]})}function l(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,o,i)=>{i.d(o,{R:()=>s,x:()=>d});var n=i(6540);const t={},r=n.createContext(t);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6c179ac5.ef042d18.js b/assets/js/6c179ac5.ef042d18.js deleted file mode 100644 index f2a1ac4a7..000000000 --- a/assets/js/6c179ac5.ef042d18.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4072],{9964:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>a});var n=i(4848),t=i(8453);const r={title:"Theora",sidebar_position:9},d="Theora",s={id:"video/Theora",title:"Theora",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/Theora.mdx",sourceDirName:"video",slug:"/video/Theora",permalink:"/docs/video/Theora",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/Theora.mdx",tags:[],version:"current",sidebarPosition:9,frontMatter:{title:"Theora",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"VC-1",permalink:"/docs/video/VC-1"},next:{title:"FFV1",permalink:"/docs/video/FFV1"}},c={},a=[{value:"Encoding",id:"encoding",level:2}];function h(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"theora",children:"Theora"})}),"\n",(0,n.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(o.p,{children:["Theora is a legacy video codec first released in 2004. It is derived from VP3, part of the same family of codecs that formed ",(0,n.jsx)(o.a,{href:"/docs/video/VP8",children:"VP8"}),", ",(0,n.jsx)(o.a,{href:"/docs/video/VP9",children:"VP9"})," and ",(0,n.jsx)(o.a,{href:"/docs/video/AV1",children:"AV1"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"encoding",children:"Encoding"}),"\n",(0,n.jsxs)(o.p,{children:["Theora is frequently contained within a ogg (",(0,n.jsx)(o.code,{children:".ogg"})," or ",(0,n.jsx)(o.code,{children:".ogv"}),") container with ",(0,n.jsx)(o.a,{href:"/docs/audio/Vorbis",children:"vorbis"})," audio."]}),"\n",(0,n.jsx)(o.p,{children:"To be filled."})]})}function l(e={}){const{wrapper:o}={...(0,t.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,o,i)=>{i.d(o,{R:()=>d,x:()=>s});var n=i(6540);const t={},r=n.createContext(t);function d(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6d85920a.576f4705.js b/assets/js/6d85920a.576f4705.js deleted file mode 100644 index 071bc3767..000000000 --- a/assets/js/6d85920a.576f4705.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7800],{3911:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var n=t(4848),o=t(8453);const s={title:"Terminology",sidebar_position:2},r="Terminology",a={id:"introduction/terminology",title:"Terminology",description:"When learning about encoding technology, it is important to understand the vast terminology that is often used to describe concepts that are often not very complex to understand.",source:"@site/docs/introduction/terminology.mdx",sourceDirName:"introduction",slug:"/introduction/terminology",permalink:"/docs/introduction/terminology",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/terminology.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Terminology",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Prologue",permalink:"/docs/introduction/prologue"},next:{title:"Lossless Compression",permalink:"/docs/introduction/lossless"}},d={},c=[{value:"Bitstream",id:"bitstream",level:2},{value:"Lossy / Lossless",id:"lossy--lossless",level:2},{value:"Elementary stream",id:"elementary-stream",level:2},{value:"Muxing",id:"muxing",level:2},{value:"Codec",id:"codec",level:2},{value:"Filter",id:"filter",level:2},{value:"Muxer/Demuxer",id:"muxerdemuxer",level:2},{value:"Bitstream filter",id:"bitstream-filter",level:2},{value:"Container",id:"container",level:2},{value:"MP4 / M4V",id:"mp4--m4v",level:4},{value:"MOV",id:"mov",level:4},{value:"MKV / MKA / MKS / MK3D",id:"mkv--mka--mks--mk3d",level:4},{value:"WebM",id:"webm",level:4},{value:"Transcoding",id:"transcoding",level:2},{value:"RDO",id:"rdo",level:2},{value:"Perceputal / Psychovisual / Psychoacoustic",id:"perceputal--psychovisual--psychoacoustic",level:2},{value:"Discrete Cosine Transform (DCT)",id:"discrete-cosine-transform-dct",level:2}];function l(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"terminology",children:"Terminology"})}),"\n",(0,n.jsx)(i.p,{children:"When learning about encoding technology, it is important to understand the vast terminology that is often used to describe concepts that are often not very complex to understand."}),"\n",(0,n.jsx)(i.h2,{id:"bitstream",children:"Bitstream"}),"\n",(0,n.jsxs)(i.p,{children:["A ",(0,n.jsx)(i.em,{children:"bitstream"})," or ",(0,n.jsx)(i.em,{children:"bit stream"})," is a media file, the kind that is played in a media player. It consists of a ",(0,n.jsx)(i.a,{href:"#container",children:"container"})," wrapping multiple ",(0,n.jsx)(i.a,{href:"#elementary-stream",children:"elementary streams"})]}),"\n",(0,n.jsx)(i.h2,{id:"lossy--lossless",children:"Lossy / Lossless"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.em,{children:"Lossy"})," encoding throws out some of the detail to achieve a smaller size. Often, this is an acceptable trade-off, but if you need a perfect recreation of the data, you need ",(0,n.jsx)(i.em,{children:"lossless"})," encoding."]}),"\n",(0,n.jsx)(i.h2,{id:"elementary-stream",children:"Elementary stream"}),"\n",(0,n.jsxs)(i.p,{children:["An elementary stream is an audio, video, or subtitle track. Basically, it's the compressed data you want to ",(0,n.jsx)(i.a,{href:"#muxing",children:"mux"})," into the container."]}),"\n",(0,n.jsx)(i.h2,{id:"muxing",children:"Muxing"}),"\n",(0,n.jsx)(i.p,{children:"Putting elementary streams into a container, which preserves them without making any changes to the data."}),"\n",(0,n.jsx)(i.h2,{id:"codec",children:"Codec"}),"\n",(0,n.jsxs)(i.p,{children:["A codec (",(0,n.jsx)(i.strong,{children:"co"}),"der/",(0,n.jsx)(i.strong,{children:"dec"}),"oder) is the piece of code that actually encodes the data you put in. It takes as input and produces as output an elementary stream. More information is provided ",(0,n.jsx)(i.a,{href:"/docs/introduction/prologue#what-is-a-codec",children:"in the prologue"}),' under "What is a Codec".']}),"\n",(0,n.jsx)(i.h2,{id:"filter",children:"Filter"}),"\n",(0,n.jsx)(i.p,{children:"A filter is a piece of code you can apply to the data to make something about it different, for instance sharpening, removing artifacts, shakiness, denoising, scaling, overlay, etc."}),"\n",(0,n.jsx)(i.h2,{id:"muxerdemuxer",children:"Muxer/Demuxer"}),"\n",(0,n.jsxs)(i.p,{children:["The pieces of code that ",(0,n.jsx)(i.a,{href:"#muxing",children:"mux"})," or do the reverse, getting elementary streams from the container."]}),"\n",(0,n.jsx)(i.h2,{id:"bitstream-filter",children:"Bitstream filter"}),"\n",(0,n.jsxs)(i.p,{children:["A bitstream filter is a filter that is directly applied to the ",(0,n.jsx)(i.a,{href:"#bitstream",children:"bitstream"})," in order to change something about the container, for instance, convert frame types, or corrupt some packets."]}),"\n",(0,n.jsx)(i.h2,{id:"container",children:"Container"}),"\n",(0,n.jsxs)(i.p,{children:["A container is a format for putting one or more elementary streams into one file, which is then called a ",(0,n.jsx)(i.a,{href:"#bitstream",children:"bitstream"}),"."]}),"\n",(0,n.jsx)(i.p,{children:'A video container is a digital file format that holds video and audio data, as well as additional information such as subtitles, metadata, and chapter markers. It acts as a "wrapper" that packages all these elements into a single file that can be played on various devices and software platforms. Think of it like a container you might use to transport goods - the video and audio data are like the items being transported, while the container itself provides a structure and organization for the contents.'}),"\n",(0,n.jsx)(i.p,{children:"Some kinds of containers:"}),"\n",(0,n.jsx)(i.h4,{id:"mp4--m4v",children:"MP4 / M4V"}),"\n",(0,n.jsxs)(i.p,{children:["This is likely the most common container you've encountered, & has near universal compatibility. Has a limited maximum amount of streams. The supported video codecs are ",(0,n.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,n.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,n.jsx)(i.a,{href:"/docs/video/VVC",children:"H.266"}),", DivX, Xvid, ",(0,n.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"})," (Unofficial, hacky), and ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," (Unofficial, hacky). For audio codecs it's many of the various flavors of ",(0,n.jsx)(i.a,{href:"/docs/audio/AAC",children:"AAC"}),", ",(0,n.jsx)(i.a,{href:"/docs/audio/MP3",children:"MP3"}),", ",(0,n.jsx)(i.a,{href:"/docs/audio/FLAC",children:"FLAC"})," (Unofficial), ",(0,n.jsx)(i.a,{href:"/docs/audio/Opus",children:"Opus"})," (Unofficial, hacky). For subtitles only MPEG-4 Timed Text (TTXT) is supported."]}),"\n",(0,n.jsx)(i.p,{children:"The best tool to work with this container is MP4Box, but FFmpeg also works."}),"\n",(0,n.jsx)(i.h4,{id:"mov",children:"MOV"}),"\n",(0,n.jsx)(i.p,{children:"Similar to MP4, but less supported. Made with Apple Quicktime in mind, supports ProRes."}),"\n",(0,n.jsx)(i.h4,{id:"mkv--mka--mks--mk3d",children:"MKV / MKA / MKS / MK3D"}),"\n",(0,n.jsx)(i.p,{children:"Also known as Matroska, allows an unlimited amount of video/audio/subtitle streams and any codec that probably still exists in Area 51, you can put literally anything in there and it won't even care, MPEG-2/DivX/H.266/Theora/Thor/RealVideo/MJPEG/AVS3/AMR-WB, you name it. All around best container for working with if you have the choice."}),"\n",(0,n.jsx)(i.h4,{id:"webm",children:"WebM"}),"\n",(0,n.jsxs)(i.p,{children:["A container made with web streaming in mind. WebM is a stripped-down subset of MKV that only allows free & open source codecs such as VP8, VP9 or AV1 for video alongside Vorbis or Opus for audio. It is a common misconception that ",(0,n.jsx)(i.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," tracks always work natively in browsers when within a WebM container; in practice, WebMs containing WebVTT subtitles ",(0,n.jsx)(i.em,{children:"will usually not"})," play back the subtitles in browsers. WebVTT subtitles can be utilized with the ",(0,n.jsx)(i.code,{children:""})," element instead, meaning they exist outside the WebM container itself. More info in the ",(0,n.jsx)(i.a,{href:"https://developer.mozilla.org/en-US/docs/Web/Media/Audio_and_video_delivery/Adding_captions_and_subtitles_to_HTML5_video",children:"Mozilla Web Docs"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"transcoding",children:"Transcoding"}),"\n",(0,n.jsxs)(i.p,{children:["Taking an elementary stream & converting it to another format, lossless or lossy, using an encoder of some kind. For example, if I convert a lossless ",(0,n.jsx)(i.a,{href:"/docs/video/FFV1",children:"FFV1"})," video to a lossy AV1 video using an encoder like ",(0,n.jsx)(i.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", I have ",(0,n.jsx)(i.em,{children:"transcoded"})," this lossless video to AV1. Transcoding doesn't have anything to do with the container."]}),"\n",(0,n.jsx)(i.h2,{id:"rdo",children:"RDO"}),"\n",(0,n.jsxs)(i.p,{children:["RDO, or Rate-Distortion Optimization, is a technique used to find the best trade-off between the bit rate & the quality of lossily encoded content. RDO can be metric-based, optimizing to score well on metrics like ",(0,n.jsx)(i.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," or ",(0,n.jsx)(i.a,{href:"/docs/metrics/SSIM",children:"SSIM"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"perceputal--psychovisual--psychoacoustic",children:"Perceputal / Psychovisual / Psychoacoustic"}),"\n",(0,n.jsxs)(i.p,{children:['"Psychovisual quality" (for videos), "Psychoacoustic quality" (for audio), or "perceptual quality" is a term used to describe the perception of quality of distorted media by the human senses. The goal of any multimedia codec is to minimize data while maintaining perceived quality, and optimizing around human perception theoretically yields the best performance within any limited set of coding techniques (like when using an older codec). Our model of human perception continues to evolve, which makes modelling perceptual quality very difficult. Presently, the metrics ',(0,n.jsx)(i.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," (Images/Video) & ",(0,n.jsx)(i.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"})," (Video) are considered the most accurate to our human visual system."]}),"\n",(0,n.jsx)(i.h2,{id:"discrete-cosine-transform-dct",children:"Discrete Cosine Transform (DCT)"}),"\n",(0,n.jsx)(i.p,{children:"The Discrete Cosine Transform is a mathematical transformation that can transform discrete data into the frequency domain. This discrete data could be pixels in an image/video compression block or data points recorded temporally representing an audio recording. This algorithm is a particularly good choice for image, video, music, & speech compression because it has high energy compaction relative to our understanding of fidelity in media. High energy compaction means the DCT is able to represent a signal with a small number of significant coefficients."})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var n=t(6540);const o={},s=n.createContext(o);function r(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6d85920a.6e752d07.js b/assets/js/6d85920a.6e752d07.js new file mode 100644 index 000000000..68e32e99b --- /dev/null +++ b/assets/js/6d85920a.6e752d07.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7800],{529:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"introduction/terminology","title":"Terminology","description":"When learning about encoding technology, it is important to understand the vast terminology that is often used to describe concepts that are often not very complex to understand.","source":"@site/docs/introduction/terminology.mdx","sourceDirName":"introduction","slug":"/introduction/terminology","permalink":"/docs/introduction/terminology","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/terminology.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Terminology","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Prologue","permalink":"/docs/introduction/prologue"},"next":{"title":"Lossless Compression","permalink":"/docs/introduction/lossless"}}');var o=t(4848),s=t(8453);const r={title:"Terminology",sidebar_position:2},a="Terminology",d={},c=[{value:"Bitstream",id:"bitstream",level:2},{value:"Lossy / Lossless",id:"lossy--lossless",level:2},{value:"Elementary stream",id:"elementary-stream",level:2},{value:"Muxing",id:"muxing",level:2},{value:"Codec",id:"codec",level:2},{value:"Filter",id:"filter",level:2},{value:"Muxer/Demuxer",id:"muxerdemuxer",level:2},{value:"Bitstream filter",id:"bitstream-filter",level:2},{value:"Container",id:"container",level:2},{value:"MP4 / M4V",id:"mp4--m4v",level:4},{value:"MOV",id:"mov",level:4},{value:"MKV / MKA / MKS / MK3D",id:"mkv--mka--mks--mk3d",level:4},{value:"WebM",id:"webm",level:4},{value:"Transcoding",id:"transcoding",level:2},{value:"RDO",id:"rdo",level:2},{value:"Perceputal / Psychovisual / Psychoacoustic",id:"perceputal--psychovisual--psychoacoustic",level:2},{value:"Discrete Cosine Transform (DCT)",id:"discrete-cosine-transform-dct",level:2}];function l(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"terminology",children:"Terminology"})}),"\n",(0,o.jsx)(i.p,{children:"When learning about encoding technology, it is important to understand the vast terminology that is often used to describe concepts that are often not very complex to understand."}),"\n",(0,o.jsx)(i.h2,{id:"bitstream",children:"Bitstream"}),"\n",(0,o.jsxs)(i.p,{children:["A ",(0,o.jsx)(i.em,{children:"bitstream"})," or ",(0,o.jsx)(i.em,{children:"bit stream"})," is a media file, the kind that is played in a media player. It consists of a ",(0,o.jsx)(i.a,{href:"#container",children:"container"})," wrapping multiple ",(0,o.jsx)(i.a,{href:"#elementary-stream",children:"elementary streams"})]}),"\n",(0,o.jsx)(i.h2,{id:"lossy--lossless",children:"Lossy / Lossless"}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.em,{children:"Lossy"})," encoding throws out some of the detail to achieve a smaller size. Often, this is an acceptable trade-off, but if you need a perfect recreation of the data, you need ",(0,o.jsx)(i.em,{children:"lossless"})," encoding."]}),"\n",(0,o.jsx)(i.h2,{id:"elementary-stream",children:"Elementary stream"}),"\n",(0,o.jsxs)(i.p,{children:["An elementary stream is an audio, video, or subtitle track. Basically, it's the compressed data you want to ",(0,o.jsx)(i.a,{href:"#muxing",children:"mux"})," into the container."]}),"\n",(0,o.jsx)(i.h2,{id:"muxing",children:"Muxing"}),"\n",(0,o.jsx)(i.p,{children:"Putting elementary streams into a container, which preserves them without making any changes to the data."}),"\n",(0,o.jsx)(i.h2,{id:"codec",children:"Codec"}),"\n",(0,o.jsxs)(i.p,{children:["A codec (",(0,o.jsx)(i.strong,{children:"co"}),"der/",(0,o.jsx)(i.strong,{children:"dec"}),"oder) is the piece of code that actually encodes the data you put in. It takes as input and produces as output an elementary stream. More information is provided ",(0,o.jsx)(i.a,{href:"/docs/introduction/prologue#what-is-a-codec",children:"in the prologue"}),' under "What is a Codec".']}),"\n",(0,o.jsx)(i.h2,{id:"filter",children:"Filter"}),"\n",(0,o.jsx)(i.p,{children:"A filter is a piece of code you can apply to the data to make something about it different, for instance sharpening, removing artifacts, shakiness, denoising, scaling, overlay, etc."}),"\n",(0,o.jsx)(i.h2,{id:"muxerdemuxer",children:"Muxer/Demuxer"}),"\n",(0,o.jsxs)(i.p,{children:["The pieces of code that ",(0,o.jsx)(i.a,{href:"#muxing",children:"mux"})," or do the reverse, getting elementary streams from the container."]}),"\n",(0,o.jsx)(i.h2,{id:"bitstream-filter",children:"Bitstream filter"}),"\n",(0,o.jsxs)(i.p,{children:["A bitstream filter is a filter that is directly applied to the ",(0,o.jsx)(i.a,{href:"#bitstream",children:"bitstream"})," in order to change something about the container, for instance, convert frame types, or corrupt some packets."]}),"\n",(0,o.jsx)(i.h2,{id:"container",children:"Container"}),"\n",(0,o.jsxs)(i.p,{children:["A container is a format for putting one or more elementary streams into one file, which is then called a ",(0,o.jsx)(i.a,{href:"#bitstream",children:"bitstream"}),"."]}),"\n",(0,o.jsx)(i.p,{children:'A video container is a digital file format that holds video and audio data, as well as additional information such as subtitles, metadata, and chapter markers. It acts as a "wrapper" that packages all these elements into a single file that can be played on various devices and software platforms. Think of it like a container you might use to transport goods - the video and audio data are like the items being transported, while the container itself provides a structure and organization for the contents.'}),"\n",(0,o.jsx)(i.p,{children:"Some kinds of containers:"}),"\n",(0,o.jsx)(i.h4,{id:"mp4--m4v",children:"MP4 / M4V"}),"\n",(0,o.jsxs)(i.p,{children:["This is likely the most common container you've encountered, & has near universal compatibility. Has a limited maximum amount of streams. The supported video codecs are ",(0,o.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,o.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,o.jsx)(i.a,{href:"/docs/video/VVC",children:"H.266"}),", DivX, Xvid, ",(0,o.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"})," (Unofficial, hacky), and ",(0,o.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," (Unofficial, hacky). For audio codecs it's many of the various flavors of ",(0,o.jsx)(i.a,{href:"/docs/audio/AAC",children:"AAC"}),", ",(0,o.jsx)(i.a,{href:"/docs/audio/MP3",children:"MP3"}),", ",(0,o.jsx)(i.a,{href:"/docs/audio/FLAC",children:"FLAC"})," (Unofficial), ",(0,o.jsx)(i.a,{href:"/docs/audio/Opus",children:"Opus"})," (Unofficial, hacky). For subtitles only MPEG-4 Timed Text (TTXT) is supported."]}),"\n",(0,o.jsx)(i.p,{children:"The best tool to work with this container is MP4Box, but FFmpeg also works."}),"\n",(0,o.jsx)(i.h4,{id:"mov",children:"MOV"}),"\n",(0,o.jsx)(i.p,{children:"Similar to MP4, but less supported. Made with Apple Quicktime in mind, supports ProRes."}),"\n",(0,o.jsx)(i.h4,{id:"mkv--mka--mks--mk3d",children:"MKV / MKA / MKS / MK3D"}),"\n",(0,o.jsx)(i.p,{children:"Also known as Matroska, allows an unlimited amount of video/audio/subtitle streams and any codec that probably still exists in Area 51, you can put literally anything in there and it won't even care, MPEG-2/DivX/H.266/Theora/Thor/RealVideo/MJPEG/AVS3/AMR-WB, you name it. All around best container for working with if you have the choice."}),"\n",(0,o.jsx)(i.h4,{id:"webm",children:"WebM"}),"\n",(0,o.jsxs)(i.p,{children:["A container made with web streaming in mind. WebM is a stripped-down subset of MKV that only allows free & open source codecs such as VP8, VP9 or AV1 for video alongside Vorbis or Opus for audio. It is a common misconception that ",(0,o.jsx)(i.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," tracks always work natively in browsers when within a WebM container; in practice, WebMs containing WebVTT subtitles ",(0,o.jsx)(i.em,{children:"will usually not"})," play back the subtitles in browsers. WebVTT subtitles can be utilized with the ",(0,o.jsx)(i.code,{children:""})," element instead, meaning they exist outside the WebM container itself. More info in the ",(0,o.jsx)(i.a,{href:"https://developer.mozilla.org/en-US/docs/Web/Media/Audio_and_video_delivery/Adding_captions_and_subtitles_to_HTML5_video",children:"Mozilla Web Docs"}),"."]}),"\n",(0,o.jsx)(i.h2,{id:"transcoding",children:"Transcoding"}),"\n",(0,o.jsxs)(i.p,{children:["Taking an elementary stream & converting it to another format, lossless or lossy, using an encoder of some kind. For example, if I convert a lossless ",(0,o.jsx)(i.a,{href:"/docs/video/FFV1",children:"FFV1"})," video to a lossy AV1 video using an encoder like ",(0,o.jsx)(i.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", I have ",(0,o.jsx)(i.em,{children:"transcoded"})," this lossless video to AV1. Transcoding doesn't have anything to do with the container."]}),"\n",(0,o.jsx)(i.h2,{id:"rdo",children:"RDO"}),"\n",(0,o.jsxs)(i.p,{children:["RDO, or Rate-Distortion Optimization, is a technique used to find the best trade-off between the bit rate & the quality of lossily encoded content. RDO can be metric-based, optimizing to score well on metrics like ",(0,o.jsx)(i.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," or ",(0,o.jsx)(i.a,{href:"/docs/metrics/SSIM",children:"SSIM"}),"."]}),"\n",(0,o.jsx)(i.h2,{id:"perceputal--psychovisual--psychoacoustic",children:"Perceputal / Psychovisual / Psychoacoustic"}),"\n",(0,o.jsxs)(i.p,{children:['"Psychovisual quality" (for videos), "Psychoacoustic quality" (for audio), or "perceptual quality" is a term used to describe the perception of quality of distorted media by the human senses. The goal of any multimedia codec is to minimize data while maintaining perceived quality, and optimizing around human perception theoretically yields the best performance within any limited set of coding techniques (like when using an older codec). Our model of human perception continues to evolve, which makes modelling perceptual quality very difficult. Presently, the metrics ',(0,o.jsx)(i.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," (Images/Video) & ",(0,o.jsx)(i.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"})," (Video) are considered the most accurate to our human visual system."]}),"\n",(0,o.jsx)(i.h2,{id:"discrete-cosine-transform-dct",children:"Discrete Cosine Transform (DCT)"}),"\n",(0,o.jsx)(i.p,{children:"The Discrete Cosine Transform is a mathematical transformation that can transform discrete data into the frequency domain. This discrete data could be pixels in an image/video compression block or data points recorded temporally representing an audio recording. This algorithm is a particularly good choice for image, video, music, & speech compression because it has high energy compaction relative to our understanding of fidelity in media. High energy compaction means the DCT is able to represent a signal with a small number of significant coefficients."})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var n=t(6540);const o={},s=n.createContext(o);function r(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70006292.b08b43f4.js b/assets/js/70006292.b08b43f4.js deleted file mode 100644 index cfae42a56..000000000 --- a/assets/js/70006292.b08b43f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9987],{1359:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=n(4848),o=n(8453);const i={title:"x266",sidebar_position:3},c="x266",s={id:"encoders/x266",title:"x266",description:"x266 is an upcoming software encoder for the H.266 / VVC codec. Very little is currently known about the encoder other than the fact it is still being developed by MulticoreWare",source:"@site/docs/encoders/x266.mdx",sourceDirName:"encoders",slug:"/encoders/x266",permalink:"/docs/encoders/x266",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x266.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"x266",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"x265",permalink:"/docs/encoders/x265"},next:{title:"aomenc",permalink:"/docs/encoders/aomenc"}},a={},d=[];function l(e){const t={a:"a",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"x266",children:"x266"})}),"\n",(0,r.jsxs)(t.p,{children:["x266 is an upcoming software encoder for the ",(0,r.jsx)(t.a,{href:"/docs/video/VVC",children:"H.266 / VVC"})," codec. Very little is currently known about the encoder other than the fact it is still being developed by ",(0,r.jsx)(t.a,{href:"https://multicorewareinc.com",children:"MulticoreWare"}),"\nand it's dedicated FAQ page after the ",(0,r.jsx)(t.a,{href:"https://multicorewareinc.com/faq-webinar/x266-faq.html",children:"31st January 2023 Webinar FAQ"}),"."]}),"\n",(0,r.jsx)(t.p,{children:'According to their FAQ, H2 2023 is their "very rough and approximate" ETA for a v1.0 public release, but so far there have been no updates as of 29th March, 2024.'})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>s});var r=n(6540);const o={},i=r.createContext(o);function c(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70006292.c60b7b8c.js b/assets/js/70006292.c60b7b8c.js new file mode 100644 index 000000000..4e0d3dfad --- /dev/null +++ b/assets/js/70006292.c60b7b8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9987],{6887:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>c,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"encoders/x266","title":"x266","description":"x266 is an upcoming software encoder for the H.266 / VVC codec. Very little is currently known about the encoder other than the fact it is still being developed by MulticoreWare","source":"@site/docs/encoders/x266.mdx","sourceDirName":"encoders","slug":"/encoders/x266","permalink":"/docs/encoders/x266","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x266.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"x266","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"x265","permalink":"/docs/encoders/x265"},"next":{"title":"aomenc","permalink":"/docs/encoders/aomenc"}}');var o=n(4848),i=n(8453);const c={title:"x266",sidebar_position:3},s="x266",a={},d=[];function l(e){const t={a:"a",h1:"h1",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"x266",children:"x266"})}),"\n",(0,o.jsxs)(t.p,{children:["x266 is an upcoming software encoder for the ",(0,o.jsx)(t.a,{href:"/docs/video/VVC",children:"H.266 / VVC"})," codec. Very little is currently known about the encoder other than the fact it is still being developed by ",(0,o.jsx)(t.a,{href:"https://multicorewareinc.com",children:"MulticoreWare"}),"\nand it's dedicated FAQ page after the ",(0,o.jsx)(t.a,{href:"https://multicorewareinc.com/faq-webinar/x266-faq.html",children:"31st January 2023 Webinar FAQ"}),"."]}),"\n",(0,o.jsx)(t.p,{children:'According to their FAQ, H2 2023 is their "very rough and approximate" ETA for a v1.0 public release, but so far there have been no updates as of 14th October, 2024.'})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>s});var r=n(6540);const o={},i=r.createContext(o);function c(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70de1c07.0b62591d.js b/assets/js/70de1c07.0b62591d.js deleted file mode 100644 index d20ea18e5..000000000 --- a/assets/js/70de1c07.0b62591d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[544],{1165:(e,t,s)=>{s.d(t,{Ck:()=>h,kS:()=>d});var i=s(4848),o=s(8453),n=s(6540),a=s(4016),r=s(3517),c=s(3343),l=s(3864),u=s(8633),m=s(363);const h=({imageData:e,pixelsAbove:t,pixelsBelow:s})=>{const n={div:"div",...(0,o.R)()},l=({currentSlide:e,direction:t,slideCount:s,...o})=>"left"===t?(0,i.jsx)(u.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,i.jsx)(m.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!t||t<0)&&(t=0),(!s||s<0)&&(s=0),(0,i.jsxs)(a.A,{justify:"space-between",vertical:!0,children:[(0,i.jsx)(n.div,{style:{height:`${t}px`}}),(0,i.jsx)(r.A,{arrows:!0,prevArrow:(0,i.jsx)(l,{direction:"left"}),nextArrow:(0,i.jsx)(l,{direction:"right"}),children:e.map((e=>(0,i.jsx)(c.A,{src:e.src},e.src)))}),(0,i.jsx)(n.div,{style:{height:`${s}px`}})]})},d=({tabMap:e,pixelsAbove:t,pixelsBelow:s})=>{const r={div:"div",...(0,o.R)()},[c,u]=(0,n.useState)(Object.keys(e)[0]);return(!t||t<0)&&(t=0),(!s||s<0)&&(s=0),(0,i.jsxs)(a.A,{justify:"space-between",vertical:!0,children:[(0,i.jsx)(r.div,{style:{height:`${t}px`}}),(0,i.jsx)(l.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:c,onTabChange:e=>{u(e)},children:e[c].component}),(0,i.jsx)(r.div,{style:{height:`${s}px`}})]})}},850:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var i=s(4848),o=s(8453),n=s(1165);const a={title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},r="Introduction",c={permalink:"/blog/svt-av1-deep-dive",source:"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",date:"2023-12-30T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"},{inline:!0,label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:22.78,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043",key:null,page:null}],frontMatter:{title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",permalink:"/blog/svt-av1-second-deep-dive"},nextItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"}},l={authorsImageUrls:[void 0]},u=[{value:"Samples",id:"samples",level:2},{value:"Presets comparisons (-1 -> 13)",id:"presets-comparisons--1---13",level:2},{value:"TLDR",id:"tldr",level:3},{value:"Tunes comparisons",id:"tunes-comparisons",level:2},{value:"TLDR",id:"tldr-1",level:3},{value:"Parameters comparisons",id:"parameters-comparisons",level:2},{value:"--tile-rows 1 --tile-columns 1 vs default --tile-rows 0 --tile-columns 0",id:"--tile-rows-1---tile-columns-1-vs-default---tile-rows-0---tile-columns-0",level:3},{value:"--aq-mode 0 vs default --aq-mode 2",id:"--aq-mode-0-vs-default---aq-mode-2",level:3},{value:"--aq-mode 1 vs default --aq-mode 2",id:"--aq-mode-1-vs-default---aq-mode-2",level:3},{value:"--enable-cdef 0 vs default --enable-cdef 1",id:"--enable-cdef-0-vs-default---enable-cdef-1",level:3},{value:"--enable-dg 0 vs default --enable-dg 1",id:"--enable-dg-0-vs-default---enable-dg-1",level:3},{value:"--enable-dlf 0 vs default --enable-dlf 1",id:"--enable-dlf-0-vs-default---enable-dlf-1",level:3},{value:"--fast-decode 1 vs default --fast-decode 0",id:"--fast-decode-1-vs-default---fast-decode-0",level:3},{value:"--irefresh-type 1 vs default --irefresh-type 2",id:"--irefresh-type-1-vs-default---irefresh-type-2",level:3},{value:"--lookahead 0 vs default --lookahead -1 (auto)",id:"--lookahead-0-vs-default---lookahead--1-auto",level:3},{value:"--lookahead 60 vs default --lookahead -1 (auto)",id:"--lookahead-60-vs-default---lookahead--1-auto",level:3},{value:"--lookahead 120 (max) vs default --lookahead -1 (auto)",id:"--lookahead-120-max-vs-default---lookahead--1-auto",level:3},{value:"--enable-overlays 1 vs default --enable-overlays 0",id:"--enable-overlays-1-vs-default---enable-overlays-0",level:3},{value:"--enable-qm 1 vs default --enable-qm 0",id:"--enable-qm-1-vs-default---enable-qm-0",level:3},{value:"--enable-qm 1 --qm-min 0 vs --enable-qm 1",id:"--enable-qm-1---qm-min-0-vs---enable-qm-1",level:3},{value:"--enable-restoration 0 vs default --enable-restoration 1",id:"--enable-restoration-0-vs-default---enable-restoration-1",level:3},{value:"--scm 0 vs default --scm 2 (content adaptive)",id:"--scm-0-vs-default---scm-2-content-adaptive",level:3},{value:"--scm 1 vs default --scm 2 (content adaptive)",id:"--scm-1-vs-default---scm-2-content-adaptive",level:3},{value:"--enable-tf 0 vs default --enable-tf 1",id:"--enable-tf-0-vs-default---enable-tf-1",level:3},{value:"--enable-tpl-la 0 vs default --enable-tpl-la 1",id:"--enable-tpl-la-0-vs-default---enable-tpl-la-1",level:3},{value:"superres:",id:"superres",level:3},{value:"Early TLDR on parameters results:",id:"early-tldr-on-parameters-results",level:3},{value:"Conclusion",id:"conclusion",level:2}];function m(e){const t={a:"a",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips."}),"\n",(0,i.jsxs)(t.p,{children:["The resources available will range from ",(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"graphs"})})," to ",(0,i.jsx)(t.del,{children:(0,i.jsx)(t.strong,{children:"image comparisons"})})," (WIP). The ",(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,i.jsx)(t.strong,{children:"latter"})," are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons."]}),"\n",(0,i.jsxs)(t.p,{children:["The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with ",(0,i.jsx)(t.code,{children:"x264 --qp 0"})," for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp ",(0,i.jsx)(t.em,{children:"directly"}),", meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the ",(0,i.jsx)(t.a,{href:"https://github.com/dnjulek/vapoursynth-ssimulacra2",children:"Zig implementation"})," and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the ",(0,i.jsx)(t.code,{children:"Metric / BPP"})," graphs may represent the closest we have to real efficiency."]}),"\n",(0,i.jsx)(t.p,{children:"The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy."}),"\n",(0,i.jsxs)(t.p,{children:["SvtAv1EncApp was compiled directly from the ",(0,i.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0",children:"v1.8.0 source code"})," using the provided ",(0,i.jsx)(t.code,{children:"Build/linux/build.sh"})," script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting."]}),"\n",(0,i.jsxs)(t.p,{children:["This testing was conducted within the ",(0,i.jsx)(t.a,{href:"https://discord.gg/83dRFDFDp7",children:"AV1 Weeb Edition"})," Discord server, which is focused on encoding animated content in AV1."]}),"\n",(0,i.jsx)(t.h2,{id:"samples",children:"Samples"}),"\n",(0,i.jsx)(t.p,{children:"The samples are as follows:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["11s ",(0,i.jsx)(t.code,{children:"Blame!"})," clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set."]}),"\n",(0,i.jsxs)(t.li,{children:["13s ",(0,i.jsx)(t.code,{children:"Blue Lock"})," clip which sports rapid camera movements and rotations + high-contrast elements."]}),"\n",(0,i.jsxs)(t.li,{children:["15s ",(0,i.jsx)(t.code,{children:"Fate/Grand Order: Babylonia"})," relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data."]}),"\n",(0,i.jsxs)(t.li,{children:["22s ",(0,i.jsx)(t.code,{children:"Jigokuraku (Hell's Paradise)"})," flashback clip with huge static grain in a very dark scenery and some action."]}),"\n",(0,i.jsxs)(t.li,{children:["14s ",(0,i.jsx)(t.code,{children:"Kaguya-sama"})," opening sequence with lots of effects and fast change of scenery.\nThe resolution of every clip is 1080p, except for the first one which is 1920x804."]}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.strong,{children:["All clips have been encoded in a wide quality range, from ",(0,i.jsx)(t.code,{children:"--crf 8"})," to ",(0,i.jsx)(t.code,{children:"--crf 43"}),"."]})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Without further ado, let's start with the first comparisons!"}),"\n",(0,i.jsx)(t.h2,{id:"presets-comparisons--1---13",children:"Presets comparisons (-1 -> 13)"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsxs)(t.strong,{children:["In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest ",(0,i.jsx)(t.code,{children:"--preset -1"})," to the fastest ",(0,i.jsx)(t.code,{children:"--preset 13"}),"."]}),"\n",(0,i.jsx)(t.em,{children:"Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why."})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--preset X"})," is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--tune 1"}),": tune PSNR"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--aq-mode 2"}),": variance deltaq"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--enable-qm 0"}),": quantisation matrices disabled"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--irefresh-type 2"}),": closed GOP"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--enable-tf 1"}),": temporal filtering enabled\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled..."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"First of all, here are the efficiency graphs:"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_blame.webp",alt:"Blame!.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_bluelock.webp",alt:"BlueLock.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_fate.webp",alt:"Fate.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_jigokuraku.webp",alt:"Jigokuraku.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_kaguya.webp",alt:"Kaguya.h264 Efficiency Graph"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsx)(t.p,{children:"This could be too much information."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now the same graphs but focusing on the "high quality" range (CRF8 -> 23):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_blame.webp",alt:"blame High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_bluelock.webp",alt:"bluelock High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_fate.webp",alt:"fate High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_jigokuraku.webp",alt:"jigokuraku High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_kaguya.webp",alt:"kaguya High Quality Efficiency Graph"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Same again but without presets 9 to 13 for better clarity:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now for the "low quality" range (CRF28 -> 43):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Same but without presets 9 to 13 for better clarity:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Let's now see speed comparisons between all presets:"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp",alt:"speed_overall"})}),"\n",(0,i.jsxs)(t.p,{children:["As we can see, preset -1 is so abysmally slow it makes the graph unusable\n(BTW, notice the ",(0,i.jsx)(t.code,{children:"1e6"})," in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Here is what it looks like with a logarithmic scale:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)"})}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Here are speeds graphs for preset 1 to 6 with a linear scale:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.p,{children:["One interpretation we can have is that ",(0,i.jsx)(t.strong,{children:"presets 2 to 4"})," have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but ",(0,i.jsx)(t.strong,{children:"preset 2"})," is ",(0,i.jsx)(t.strong,{children:"2x slower than preset 4"}),". The quality gap between ",(0,i.jsx)(t.strong,{children:"preset 2"})," and ",(0,i.jsx)(t.strong,{children:"preset 1"})," is even narrower but the speed penalty is also ~2x."]}),"\n",(0,i.jsxs)(t.p,{children:["That makes it hard to recommend ",(0,i.jsx)(t.strong,{children:"preset 1"}),", while ",(0,i.jsx)(t.strong,{children:"preset 3"})," is in a strange middle ground between ",(0,i.jsx)(t.strong,{children:"2"})," and ",(0,i.jsx)(t.strong,{children:"4"})," where it makes little sense to choose it over those two: it's better to choose ",(0,i.jsx)(t.strong,{children:"preset 2"})," for the higher efficiency at 1.5x slower speeds, or ",(0,i.jsx)(t.strong,{children:"preset 4"})," for the 1.33 to 1.5x higher speeds. At least the option exists."]}),"\n",(0,i.jsxs)(t.p,{children:["A similar observation can be made between ",(0,i.jsx)(t.strong,{children:"preset 5"})," and ",(0,i.jsx)(t.strong,{children:"6"}),". They can be so close in scores in many samples (especially at HQ) while also being close in speeds that ",(0,i.jsx)(t.strong,{children:"preset 5"})," becomes rather obsolete most of the time."]}),"\n",(0,i.jsx)(t.h3,{id:"tldr",children:"TLDR"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go."})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 4"})})," only loses at maximum ",(0,i.jsx)(t.strong,{children:"2"})," SSIMU2 ",(0,i.jsx)(t.strong,{children:"points"})," compared to ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset -1"})})," while being 50-60x faster. Though to be fair, the speed loss from ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 4"})})," to ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 0"})}),' is "only" 5-10x for a maximum SSIMU2 difference close to ',(0,i.jsx)(t.strong,{children:"1.5 point"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["From CRF43 to CRF28, the difference between ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 4"})})," and ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset -1"})})," can be as much as ",(0,i.jsx)(t.strong,{children:"5"})," SSIMU2 ",(0,i.jsx)(t.strong,{children:"points"}),", so lower presets become more attractive."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"tunes-comparisons",children:"Tunes comparisons"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.strong,{children:["In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default ",(0,i.jsx)(t.code,{children:"--tune 1"})," (PSNR) to the other two tunes: ",(0,i.jsx)(t.code,{children:"--tune 0"})," (VQ) and ",(0,i.jsx)(t.code,{children:"--tune 2"})," (SSIM)."]})}),"\n",(0,i.jsxs)(t.p,{children:["Except for the tunes, ",(0,i.jsx)(t.code,{children:"--preset 4"})," is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Let's compare the efficiency of every tunes:"})}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now let\'s focus on the "high quality" range (CRF8 -> 23):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'And the "low quality" range (CRF28 -> 43):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"And here is the speed difference:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Graphs comparing the tunes individually between each others will be made available soon."}),"\n",(0,i.jsx)(t.li,{children:"The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"tldr-1",children:"TLDR"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsxs)(t.strong,{children:["SSIMU2 favors ",(0,i.jsx)(t.strong,{children:"tune 1 and 2"})," above ",(0,i.jsx)(t.strong,{children:"tune 0"}),". At high quality, ",(0,i.jsx)(t.strong,{children:"tune 1 and 2"})," are matched, while at low quality ",(0,i.jsx)(t.strong,{children:"tune 2"})," takes the edge. ",(0,i.jsx)(t.strong,{children:"Tune 0"})," is sometimes a match for the other two on certain clips and other times fare pretty badly."]}),"\n",(0,i.jsxs)(t.strong,{children:["For some reason, ",(0,i.jsx)(t.strong,{children:"tune 0"})," is quite a bit faster now, compared to 1 and 2 which are basically the same."]})]}),"\n",(0,i.jsxs)(t.p,{children:["Keep in mind that I have observed multiple times in the past that ",(0,i.jsx)(t.strong,{children:"tune 0"})," kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay ",(0,i.jsx)(t.em,{children:"tuned"})," for these subjective comparisons."]}),"\n",(0,i.jsx)(t.h2,{id:"parameters-comparisons",children:"Parameters comparisons"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"In the following graphs, you may find comparisons between many SVT-AV1 parameters."}),"\n",(0,i.jsx)(t.em,{children:"Additional graphs focusing on the high and low qualities will be made available later down the line"})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--preset 4"})," is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above."]}),"\n",(0,i.jsxs)(t.h3,{id:"--tile-rows-1---tile-columns-1-vs-default---tile-rows-0---tile-columns-0",children:[(0,i.jsx)(t.code,{children:"--tile-rows 1 --tile-columns 1"})," vs default ",(0,i.jsx)(t.code,{children:"--tile-rows 0 --tile-columns 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"tiles"})," here are both slightly harmful and slower."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--aq-mode-0-vs-default---aq-mode-2",children:[(0,i.jsx)(t.code,{children:"--aq-mode 0"})," vs default ",(0,i.jsx)(t.code,{children:"--aq-mode 2"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Except for the Jigokuraku clip, ",(0,i.jsx)(t.strong,{children:"aq-mode 0"})," is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--aq-mode-1-vs-default---aq-mode-2",children:[(0,i.jsx)(t.code,{children:"--aq-mode 1"})," vs default ",(0,i.jsx)(t.code,{children:"--aq-mode 2"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"aq-mode 1"})," fares closer to ",(0,i.jsx)(t.strong,{children:"aq-mode 2"})," than ",(0,i.jsx)(t.strong,{children:"aq-mode 0"})," did, both in quality and speed, but is still overall inferior according to SSIMU2"]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-cdef-0-vs-default---enable-cdef-1",children:[(0,i.jsx)(t.code,{children:"--enable-cdef 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-cdef 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF ",(0,i.jsx)(t.em,{children:"can"})," be beneficial for the line-art."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-dg-0-vs-default---enable-dg-1",children:[(0,i.jsx)(t.code,{children:"--enable-dg 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-dg 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Dynamic GoP control"})," yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \"safe\" to keep the setting disabled at all times or not."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-dlf-0-vs-default---enable-dlf-1",children:[(0,i.jsx)(t.code,{children:"--enable-dlf 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-dlf 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Deblocking loop filter"})," can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--fast-decode-1-vs-default---fast-decode-0",children:[(0,i.jsx)(t.code,{children:"--fast-decode 1"})," vs default ",(0,i.jsx)(t.code,{children:"--fast-decode 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"fast-decode 1"})," is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--irefresh-type-1-vs-default---irefresh-type-2",children:[(0,i.jsx)(t.code,{children:"--irefresh-type 1"})," vs default ",(0,i.jsx)(t.code,{children:"--irefresh-type 2"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Finally something interesting to analyse!"}),"\n"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," is either a match or beneficial compared to ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"})," at high CRF levels."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," either wins or lose to ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"})," at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set ",(0,i.jsx)(t.strong,{children:"irefresh-type"})," to ",(0,i.jsx)(t.strong,{children:"1"}),' at "high quality" as it might be harmful depending on the content.']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," is always slower compared to ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"}),", so I might argue it is more safe to leave ",(0,i.jsx)(t.strong,{children:"irefresh-type"}),' default at "high quality" than not.']}),"\n",(0,i.jsxs)(t.li,{children:["According to the content type of those clips, it appears that ",(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," may benefit ",(0,i.jsx)(t.em,{children:"extremely grainy"})," content while default ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"})," is better suited for ",(0,i.jsx)(t.em,{children:"cleanish"})," content. This needs to be confirmed with ",(0,i.jsx)(t.em,{children:"moar"})," testing though."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--lookahead-0-vs-default---lookahead--1-auto",children:[(0,i.jsx)(t.code,{children:"--lookahead 0"})," vs default ",(0,i.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.h3,{id:"--lookahead-60-vs-default---lookahead--1-auto",children:[(0,i.jsx)(t.code,{children:"--lookahead 60"})," vs default ",(0,i.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.h3,{id:"--lookahead-120-max-vs-default---lookahead--1-auto",children:[(0,i.jsx)(t.code,{children:"--lookahead 120"})," (max) vs default ",(0,i.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"lookahead"})," seems to behave strangely when set..."]}),"\n"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"lookahead 0"})," shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"lookahead 60"})," is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"lookahead 120"})," is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences."]}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide."}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-overlays-1-vs-default---enable-overlays-0",children:[(0,i.jsx)(t.code,{children:"--enable-overlays 1"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-overlays 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"overlays"})," do not seem to either improve efficiency or performance."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-qm-1-vs-default---enable-qm-0",children:[(0,i.jsx)(t.code,{children:"--enable-qm 1"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-qm 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Enabling ",(0,i.jsx)(t.strong,{children:"quantization matrices"}),' alone increase efficiency at "high quality" with no real speed impact.']}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-qm-1---qm-min-0-vs---enable-qm-1",children:[(0,i.jsx)(t.code,{children:"--enable-qm 1 --qm-min 0"})," vs ",(0,i.jsx)(t.code,{children:"--enable-qm 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_blame.webp",alt:"SVT4_qm1_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_bluelock.webp",alt:"SVT4_qm1_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_fate.webp",alt:"SVT4_qm1_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_jigokuraku.webp",alt:"SVT4_qm1_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_kaguya.webp",alt:"SVT4_qm1_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_blame.webp",alt:"SVT4_qm1_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_bluelock.webp",alt:"SVT4_qm1_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_fate.webp",alt:"SVT4_qm1_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_jigokuraku.webp",alt:"SVT4_qm1_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_kaguya.webp",alt:"SVT4_qm1_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Setting ",(0,i.jsx)(t.strong,{children:"qm-min"})," to ",(0,i.jsx)(t.strong,{children:"0"})," on top of enabling ",(0,i.jsx)(t.strong,{children:"quantization matrices"})," can be beneficial in some clips at no added compute time."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"I will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content."}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-restoration-0-vs-default---enable-restoration-1",children:[(0,i.jsx)(t.code,{children:"--enable-restoration 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-restoration 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the ",(0,i.jsx)(t.strong,{children:"loop restoration filter"})," isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--scm-0-vs-default---scm-2-content-adaptive",children:[(0,i.jsx)(t.code,{children:"--scm 0"})," vs default ",(0,i.jsx)(t.code,{children:"--scm 2"})," (content adaptive)"]}),"\n",(0,i.jsx)(t.p,{children:"In all the clips, the results are bit-perfect and there is no notable performance difference."}),"\n",(0,i.jsxs)(t.h3,{id:"--scm-1-vs-default---scm-2-content-adaptive",children:[(0,i.jsx)(t.code,{children:"--scm 1"})," vs default ",(0,i.jsx)(t.code,{children:"--scm 2"})," (content adaptive)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Interestingly enough, ",(0,i.jsx)(t.strong,{children:"screen content tools"})," seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-tf-0-vs-default---enable-tf-1",children:[(0,i.jsx)(t.code,{children:"--enable-tf 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-tf 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Disabled ",(0,i.jsx)(t.strong,{children:"temporal filtering"})," ",(0,i.jsx)(t.em,{children:"can"}),' sometimes improve efficiency slightly at "high quality", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.']}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-tpl-la-0-vs-default---enable-tpl-la-1",children:[(0,i.jsx)(t.code,{children:"--enable-tpl-la 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-tpl-la 1"})]}),"\n",(0,i.jsx)(t.p,{children:"In all the clips, the results are bit-perfect and there is no notable performance difference."}),"\n",(0,i.jsxs)(t.h3,{id:"superres",children:[(0,i.jsx)(t.code,{children:"superres"}),":"]}),"\n",(0,i.jsx)(t.p,{children:"Kinda lazy to make, share and comment so much graphs for something that can be told in two lines..."}),"\n",(0,i.jsx)(t.p,{children:"All superres variants are freaking useless as they:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"do not improve efficiency"}),"\n",(0,i.jsx)(t.li,{children:"decrease encoding speeds"}),"\n",(0,i.jsx)(t.li,{children:"decrease decoding speeds when either bitrate or quality normalized."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"early-tldr-on-parameters-results",children:(0,i.jsx)(t.strong,{children:"Early TLDR on parameters results:"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.em,{children:(0,i.jsxs)(t.strong,{children:["For a previous test with SVT-AV1 1.7.0 I did all parameters tests with ",(0,i.jsx)(t.code,{children:"--preset 6 --tune 2"}),", now I did them with ",(0,i.jsx)(t.code,{children:"--preset 4 --tune 1"}),". Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line."]})})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Here is a quick run down of how each parameter affect encoding:"})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--tile-rows --tile-columns"})," should never be used (except for decreasing decode complexity)"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--aq-mode 2"})," is the most efficient / fastest"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-cdef 0"})," ",(0,i.jsx)(t.em,{children:"might"})," improve performance at almost no efficiency loss ",(0,i.jsx)(t.em,{children:"(needs more thorough testing)"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-dg"})," and ",(0,i.jsx)(t.code,{children:"--enable-dlf"})," barely do anything"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--fast-decode 1"})," decreases efficiency, improves encoding times, and the decoding gains still need to be determined."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--irefresh-type"})," should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--lookahead"})," should be kept default"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-overlays 1"})," does not improve efficiency, slight speed regression as well"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-qm 1 --qm-min 0"})," should be set for increased efficiency especially at low CRF values at no perf cost"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-restoration"})," barely does anything but disabling yields better performance ",(0,i.jsx)(t.em,{children:"(needs visual confirmation)"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--scm 1"})," screen content tools can improve efficiency with a big performance trade-off ",(0,i.jsx)(t.em,{children:"(needs more thorough testing)"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-tf 0"})," is a mixed bag efficiency wise but improves performance"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"superres & resize"})," please don't."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(t.p,{children:"The extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking."}),"\n",(0,i.jsx)(t.p,{children:"The default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength."}),"\n",(0,i.jsx)(t.p,{children:"Further testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!"}),"\n"]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}}}]); \ No newline at end of file diff --git a/assets/js/70de1c07.4df884f7.js b/assets/js/70de1c07.4df884f7.js new file mode 100644 index 000000000..a340980de --- /dev/null +++ b/assets/js/70de1c07.4df884f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[544],{1165:(e,t,s)=>{s.d(t,{Ck:()=>h,kS:()=>d});var i=s(4848),o=s(8453),n=s(6540),a=s(4016),r=s(3517),c=s(3343),l=s(3864),u=s(8633),m=s(363);const h=({imageData:e,pixelsAbove:t,pixelsBelow:s})=>{const n={div:"div",...(0,o.R)()},l=({currentSlide:e,direction:t,slideCount:s,...o})=>"left"===t?(0,i.jsx)(u.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,i.jsx)(m.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!t||t<0)&&(t=0),(!s||s<0)&&(s=0),(0,i.jsxs)(a.A,{justify:"space-between",vertical:!0,children:[(0,i.jsx)(n.div,{style:{height:`${t}px`}}),(0,i.jsx)(r.A,{arrows:!0,prevArrow:(0,i.jsx)(l,{direction:"left"}),nextArrow:(0,i.jsx)(l,{direction:"right"}),children:e.map((e=>(0,i.jsx)(c.A,{src:e.src},e.src)))}),(0,i.jsx)(n.div,{style:{height:`${s}px`}})]})},d=({tabMap:e,pixelsAbove:t,pixelsBelow:s})=>{const r={div:"div",...(0,o.R)()},[c,u]=(0,n.useState)(Object.keys(e)[0]);return(!t||t<0)&&(t=0),(!s||s<0)&&(s=0),(0,i.jsxs)(a.A,{justify:"space-between",vertical:!0,children:[(0,i.jsx)(r.div,{style:{height:`${t}px`}}),(0,i.jsx)(l.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:c,onTabChange:e=>{u(e)},children:e[c].component}),(0,i.jsx)(r.div,{style:{height:`${s}px`}})]})}},850:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var i=s(5255),o=s(4848),n=s(8453),a=s(1165);const r={title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},c="Introduction",l={authorsImageUrls:[void 0]},u=[{value:"Samples",id:"samples",level:2},{value:"Presets comparisons (-1 -> 13)",id:"presets-comparisons--1---13",level:2},{value:"TLDR",id:"tldr",level:3},{value:"Tunes comparisons",id:"tunes-comparisons",level:2},{value:"TLDR",id:"tldr-1",level:3},{value:"Parameters comparisons",id:"parameters-comparisons",level:2},{value:"--tile-rows 1 --tile-columns 1 vs default --tile-rows 0 --tile-columns 0",id:"--tile-rows-1---tile-columns-1-vs-default---tile-rows-0---tile-columns-0",level:3},{value:"--aq-mode 0 vs default --aq-mode 2",id:"--aq-mode-0-vs-default---aq-mode-2",level:3},{value:"--aq-mode 1 vs default --aq-mode 2",id:"--aq-mode-1-vs-default---aq-mode-2",level:3},{value:"--enable-cdef 0 vs default --enable-cdef 1",id:"--enable-cdef-0-vs-default---enable-cdef-1",level:3},{value:"--enable-dg 0 vs default --enable-dg 1",id:"--enable-dg-0-vs-default---enable-dg-1",level:3},{value:"--enable-dlf 0 vs default --enable-dlf 1",id:"--enable-dlf-0-vs-default---enable-dlf-1",level:3},{value:"--fast-decode 1 vs default --fast-decode 0",id:"--fast-decode-1-vs-default---fast-decode-0",level:3},{value:"--irefresh-type 1 vs default --irefresh-type 2",id:"--irefresh-type-1-vs-default---irefresh-type-2",level:3},{value:"--lookahead 0 vs default --lookahead -1 (auto)",id:"--lookahead-0-vs-default---lookahead--1-auto",level:3},{value:"--lookahead 60 vs default --lookahead -1 (auto)",id:"--lookahead-60-vs-default---lookahead--1-auto",level:3},{value:"--lookahead 120 (max) vs default --lookahead -1 (auto)",id:"--lookahead-120-max-vs-default---lookahead--1-auto",level:3},{value:"--enable-overlays 1 vs default --enable-overlays 0",id:"--enable-overlays-1-vs-default---enable-overlays-0",level:3},{value:"--enable-qm 1 vs default --enable-qm 0",id:"--enable-qm-1-vs-default---enable-qm-0",level:3},{value:"--enable-qm 1 --qm-min 0 vs --enable-qm 1",id:"--enable-qm-1---qm-min-0-vs---enable-qm-1",level:3},{value:"--enable-restoration 0 vs default --enable-restoration 1",id:"--enable-restoration-0-vs-default---enable-restoration-1",level:3},{value:"--scm 0 vs default --scm 2 (content adaptive)",id:"--scm-0-vs-default---scm-2-content-adaptive",level:3},{value:"--scm 1 vs default --scm 2 (content adaptive)",id:"--scm-1-vs-default---scm-2-content-adaptive",level:3},{value:"--enable-tf 0 vs default --enable-tf 1",id:"--enable-tf-0-vs-default---enable-tf-1",level:3},{value:"--enable-tpl-la 0 vs default --enable-tpl-la 1",id:"--enable-tpl-la-0-vs-default---enable-tpl-la-1",level:3},{value:"superres:",id:"superres",level:3},{value:"Early TLDR on parameters results:",id:"early-tldr-on-parameters-results",level:3},{value:"Conclusion",id:"conclusion",level:2}];function m(e){const t={a:"a",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips."}),"\n",(0,o.jsxs)(t.p,{children:["The resources available will range from ",(0,o.jsx)(t.em,{children:(0,o.jsx)(t.strong,{children:"graphs"})})," to ",(0,o.jsx)(t.del,{children:(0,o.jsx)(t.strong,{children:"image comparisons"})})," (WIP). The ",(0,o.jsx)(t.em,{children:(0,o.jsx)(t.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,o.jsx)(t.strong,{children:"latter"})," are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons."]}),"\n",(0,o.jsxs)(t.p,{children:["The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with ",(0,o.jsx)(t.code,{children:"x264 --qp 0"})," for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp ",(0,o.jsx)(t.em,{children:"directly"}),", meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the ",(0,o.jsx)(t.a,{href:"https://github.com/dnjulek/vapoursynth-ssimulacra2",children:"Zig implementation"})," and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the ",(0,o.jsx)(t.code,{children:"Metric / BPP"})," graphs may represent the closest we have to real efficiency."]}),"\n",(0,o.jsx)(t.p,{children:"The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy."}),"\n",(0,o.jsxs)(t.p,{children:["SvtAv1EncApp was compiled directly from the ",(0,o.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0",children:"v1.8.0 source code"})," using the provided ",(0,o.jsx)(t.code,{children:"Build/linux/build.sh"})," script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting."]}),"\n",(0,o.jsxs)(t.p,{children:["This testing was conducted within the ",(0,o.jsx)(t.a,{href:"https://discord.gg/83dRFDFDp7",children:"AV1 Weeb Edition"})," Discord server, which is focused on encoding animated content in AV1."]}),"\n",(0,o.jsx)(t.h2,{id:"samples",children:"Samples"}),"\n",(0,o.jsx)(t.p,{children:"The samples are as follows:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["11s ",(0,o.jsx)(t.code,{children:"Blame!"})," clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set."]}),"\n",(0,o.jsxs)(t.li,{children:["13s ",(0,o.jsx)(t.code,{children:"Blue Lock"})," clip which sports rapid camera movements and rotations + high-contrast elements."]}),"\n",(0,o.jsxs)(t.li,{children:["15s ",(0,o.jsx)(t.code,{children:"Fate/Grand Order: Babylonia"})," relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data."]}),"\n",(0,o.jsxs)(t.li,{children:["22s ",(0,o.jsx)(t.code,{children:"Jigokuraku (Hell's Paradise)"})," flashback clip with huge static grain in a very dark scenery and some action."]}),"\n",(0,o.jsxs)(t.li,{children:["14s ",(0,o.jsx)(t.code,{children:"Kaguya-sama"})," opening sequence with lots of effects and fast change of scenery.\nThe resolution of every clip is 1080p, except for the first one which is 1920x804."]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:(0,o.jsxs)(t.strong,{children:["All clips have been encoded in a wide quality range, from ",(0,o.jsx)(t.code,{children:"--crf 8"})," to ",(0,o.jsx)(t.code,{children:"--crf 43"}),"."]})}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Without further ado, let's start with the first comparisons!"}),"\n",(0,o.jsx)(t.h2,{id:"presets-comparisons--1---13",children:"Presets comparisons (-1 -> 13)"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsxs)(t.strong,{children:["In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest ",(0,o.jsx)(t.code,{children:"--preset -1"})," to the fastest ",(0,o.jsx)(t.code,{children:"--preset 13"}),"."]}),"\n",(0,o.jsx)(t.em,{children:"Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why."})]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"--preset X"})," is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"--tune 1"}),": tune PSNR"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"--aq-mode 2"}),": variance deltaq"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"--enable-qm 0"}),": quantisation matrices disabled"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"--irefresh-type 2"}),": closed GOP"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"--enable-tf 1"}),": temporal filtering enabled\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled..."]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsx)(t.p,{children:"First of all, here are the efficiency graphs:"}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_blame.webp",alt:"Blame!.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_bluelock.webp",alt:"BlueLock.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_fate.webp",alt:"Fate.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_jigokuraku.webp",alt:"Jigokuraku.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_kaguya.webp",alt:"Kaguya.h264 Efficiency Graph"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsx)(t.p,{children:"This could be too much information."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:'Now the same graphs but focusing on the "high quality" range (CRF8 -> 23):'}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_blame.webp",alt:"blame High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_bluelock.webp",alt:"bluelock High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_fate.webp",alt:"fate High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_jigokuraku.webp",alt:"jigokuraku High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_kaguya.webp",alt:"kaguya High Quality Efficiency Graph"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Same again but without presets 9 to 13 for better clarity:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:'Now for the "low quality" range (CRF28 -> 43):'}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Same but without presets 9 to 13 for better clarity:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.strong,{children:"Let's now see speed comparisons between all presets:"})}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp",alt:"speed_overall"})}),"\n",(0,o.jsxs)(t.p,{children:["As we can see, preset -1 is so abysmally slow it makes the graph unusable\n(BTW, notice the ",(0,o.jsx)(t.code,{children:"1e6"})," in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Here is what it looks like with a logarithmic scale:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.strong,{children:"Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)"})}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Here are speeds graphs for preset 1 to 6 with a linear scale:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.p,{children:["One interpretation we can have is that ",(0,o.jsx)(t.strong,{children:"presets 2 to 4"})," have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but ",(0,o.jsx)(t.strong,{children:"preset 2"})," is ",(0,o.jsx)(t.strong,{children:"2x slower than preset 4"}),". The quality gap between ",(0,o.jsx)(t.strong,{children:"preset 2"})," and ",(0,o.jsx)(t.strong,{children:"preset 1"})," is even narrower but the speed penalty is also ~2x."]}),"\n",(0,o.jsxs)(t.p,{children:["That makes it hard to recommend ",(0,o.jsx)(t.strong,{children:"preset 1"}),", while ",(0,o.jsx)(t.strong,{children:"preset 3"})," is in a strange middle ground between ",(0,o.jsx)(t.strong,{children:"2"})," and ",(0,o.jsx)(t.strong,{children:"4"})," where it makes little sense to choose it over those two: it's better to choose ",(0,o.jsx)(t.strong,{children:"preset 2"})," for the higher efficiency at 1.5x slower speeds, or ",(0,o.jsx)(t.strong,{children:"preset 4"})," for the 1.33 to 1.5x higher speeds. At least the option exists."]}),"\n",(0,o.jsxs)(t.p,{children:["A similar observation can be made between ",(0,o.jsx)(t.strong,{children:"preset 5"})," and ",(0,o.jsx)(t.strong,{children:"6"}),". They can be so close in scores in many samples (especially at HQ) while also being close in speeds that ",(0,o.jsx)(t.strong,{children:"preset 5"})," becomes rather obsolete most of the time."]}),"\n",(0,o.jsx)(t.h3,{id:"tldr",children:"TLDR"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go."})}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:["For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), ",(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.strong,{children:"preset 4"})})," only loses at maximum ",(0,o.jsx)(t.strong,{children:"2"})," SSIMU2 ",(0,o.jsx)(t.strong,{children:"points"})," compared to ",(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.strong,{children:"preset -1"})})," while being 50-60x faster. Though to be fair, the speed loss from ",(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.strong,{children:"preset 4"})})," to ",(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.strong,{children:"preset 0"})}),' is "only" 5-10x for a maximum SSIMU2 difference close to ',(0,o.jsx)(t.strong,{children:"1.5 point"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:["From CRF43 to CRF28, the difference between ",(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.strong,{children:"preset 4"})})," and ",(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.strong,{children:"preset -1"})})," can be as much as ",(0,o.jsx)(t.strong,{children:"5"})," SSIMU2 ",(0,o.jsx)(t.strong,{children:"points"}),", so lower presets become more attractive."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"tunes-comparisons",children:"Tunes comparisons"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsxs)(t.strong,{children:["In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default ",(0,o.jsx)(t.code,{children:"--tune 1"})," (PSNR) to the other two tunes: ",(0,o.jsx)(t.code,{children:"--tune 0"})," (VQ) and ",(0,o.jsx)(t.code,{children:"--tune 2"})," (SSIM)."]})}),"\n",(0,o.jsxs)(t.p,{children:["Except for the tunes, ",(0,o.jsx)(t.code,{children:"--preset 4"})," is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above."]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.strong,{children:"Let's compare the efficiency of every tunes:"})}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:'Now let\'s focus on the "high quality" range (CRF8 -> 23):'}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:'And the "low quality" range (CRF28 -> 43):'}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"And here is the speed difference:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Graphs comparing the tunes individually between each others will be made available soon."}),"\n",(0,o.jsx)(t.li,{children:"The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that."}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"tldr-1",children:"TLDR"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsxs)(t.strong,{children:["SSIMU2 favors ",(0,o.jsx)(t.strong,{children:"tune 1 and 2"})," above ",(0,o.jsx)(t.strong,{children:"tune 0"}),". At high quality, ",(0,o.jsx)(t.strong,{children:"tune 1 and 2"})," are matched, while at low quality ",(0,o.jsx)(t.strong,{children:"tune 2"})," takes the edge. ",(0,o.jsx)(t.strong,{children:"Tune 0"})," is sometimes a match for the other two on certain clips and other times fare pretty badly."]}),"\n",(0,o.jsxs)(t.strong,{children:["For some reason, ",(0,o.jsx)(t.strong,{children:"tune 0"})," is quite a bit faster now, compared to 1 and 2 which are basically the same."]})]}),"\n",(0,o.jsxs)(t.p,{children:["Keep in mind that I have observed multiple times in the past that ",(0,o.jsx)(t.strong,{children:"tune 0"})," kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay ",(0,o.jsx)(t.em,{children:"tuned"})," for these subjective comparisons."]}),"\n",(0,o.jsx)(t.h2,{id:"parameters-comparisons",children:"Parameters comparisons"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"In the following graphs, you may find comparisons between many SVT-AV1 parameters."}),"\n",(0,o.jsx)(t.em,{children:"Additional graphs focusing on the high and low qualities will be made available later down the line"})]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"--preset 4"})," is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above."]}),"\n",(0,o.jsxs)(t.h3,{id:"--tile-rows-1---tile-columns-1-vs-default---tile-rows-0---tile-columns-0",children:[(0,o.jsx)(t.code,{children:"--tile-rows 1 --tile-columns 1"})," vs default ",(0,o.jsx)(t.code,{children:"--tile-rows 0 --tile-columns 0"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"tiles"})," here are both slightly harmful and slower."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--aq-mode-0-vs-default---aq-mode-2",children:[(0,o.jsx)(t.code,{children:"--aq-mode 0"})," vs default ",(0,o.jsx)(t.code,{children:"--aq-mode 2"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Except for the Jigokuraku clip, ",(0,o.jsx)(t.strong,{children:"aq-mode 0"})," is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--aq-mode-1-vs-default---aq-mode-2",children:[(0,o.jsx)(t.code,{children:"--aq-mode 1"})," vs default ",(0,o.jsx)(t.code,{children:"--aq-mode 2"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"aq-mode 1"})," fares closer to ",(0,o.jsx)(t.strong,{children:"aq-mode 2"})," than ",(0,o.jsx)(t.strong,{children:"aq-mode 0"})," did, both in quality and speed, but is still overall inferior according to SSIMU2"]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--enable-cdef-0-vs-default---enable-cdef-1",children:[(0,o.jsx)(t.code,{children:"--enable-cdef 0"})," vs default ",(0,o.jsx)(t.code,{children:"--enable-cdef 1"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF ",(0,o.jsx)(t.em,{children:"can"})," be beneficial for the line-art."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--enable-dg-0-vs-default---enable-dg-1",children:[(0,o.jsx)(t.code,{children:"--enable-dg 0"})," vs default ",(0,o.jsx)(t.code,{children:"--enable-dg 1"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Dynamic GoP control"})," yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \"safe\" to keep the setting disabled at all times or not."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--enable-dlf-0-vs-default---enable-dlf-1",children:[(0,o.jsx)(t.code,{children:"--enable-dlf 0"})," vs default ",(0,o.jsx)(t.code,{children:"--enable-dlf 1"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Deblocking loop filter"})," can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--fast-decode-1-vs-default---fast-decode-0",children:[(0,o.jsx)(t.code,{children:"--fast-decode 1"})," vs default ",(0,o.jsx)(t.code,{children:"--fast-decode 0"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"fast-decode 1"})," is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--irefresh-type-1-vs-default---irefresh-type-2",children:[(0,o.jsx)(t.code,{children:"--irefresh-type 1"})," vs default ",(0,o.jsx)(t.code,{children:"--irefresh-type 2"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"Finally something interesting to analyse!"}),"\n"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"irefresh-type 1"})," is either a match or beneficial compared to ",(0,o.jsx)(t.strong,{children:"irefresh-type 2"})," at high CRF levels."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"irefresh-type 1"})," either wins or lose to ",(0,o.jsx)(t.strong,{children:"irefresh-type 2"})," at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set ",(0,o.jsx)(t.strong,{children:"irefresh-type"})," to ",(0,o.jsx)(t.strong,{children:"1"}),' at "high quality" as it might be harmful depending on the content.']}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"irefresh-type 1"})," is always slower compared to ",(0,o.jsx)(t.strong,{children:"irefresh-type 2"}),", so I might argue it is more safe to leave ",(0,o.jsx)(t.strong,{children:"irefresh-type"}),' default at "high quality" than not.']}),"\n",(0,o.jsxs)(t.li,{children:["According to the content type of those clips, it appears that ",(0,o.jsx)(t.strong,{children:"irefresh-type 1"})," may benefit ",(0,o.jsx)(t.em,{children:"extremely grainy"})," content while default ",(0,o.jsx)(t.strong,{children:"irefresh-type 2"})," is better suited for ",(0,o.jsx)(t.em,{children:"cleanish"})," content. This needs to be confirmed with ",(0,o.jsx)(t.em,{children:"moar"})," testing though."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--lookahead-0-vs-default---lookahead--1-auto",children:[(0,o.jsx)(t.code,{children:"--lookahead 0"})," vs default ",(0,o.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.h3,{id:"--lookahead-60-vs-default---lookahead--1-auto",children:[(0,o.jsx)(t.code,{children:"--lookahead 60"})," vs default ",(0,o.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.h3,{id:"--lookahead-120-max-vs-default---lookahead--1-auto",children:[(0,o.jsx)(t.code,{children:"--lookahead 120"})," (max) vs default ",(0,o.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"lookahead"})," seems to behave strangely when set..."]}),"\n"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"lookahead 0"})," shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"lookahead 60"})," is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"lookahead 120"})," is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences."]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide."}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--enable-overlays-1-vs-default---enable-overlays-0",children:[(0,o.jsx)(t.code,{children:"--enable-overlays 1"})," vs default ",(0,o.jsx)(t.code,{children:"--enable-overlays 0"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"overlays"})," do not seem to either improve efficiency or performance."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--enable-qm-1-vs-default---enable-qm-0",children:[(0,o.jsx)(t.code,{children:"--enable-qm 1"})," vs default ",(0,o.jsx)(t.code,{children:"--enable-qm 0"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Enabling ",(0,o.jsx)(t.strong,{children:"quantization matrices"}),' alone increase efficiency at "high quality" with no real speed impact.']}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--enable-qm-1---qm-min-0-vs---enable-qm-1",children:[(0,o.jsx)(t.code,{children:"--enable-qm 1 --qm-min 0"})," vs ",(0,o.jsx)(t.code,{children:"--enable-qm 1"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_blame.webp",alt:"SVT4_qm1_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_bluelock.webp",alt:"SVT4_qm1_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_fate.webp",alt:"SVT4_qm1_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_jigokuraku.webp",alt:"SVT4_qm1_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_kaguya.webp",alt:"SVT4_qm1_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_blame.webp",alt:"SVT4_qm1_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_bluelock.webp",alt:"SVT4_qm1_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_fate.webp",alt:"SVT4_qm1_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_jigokuraku.webp",alt:"SVT4_qm1_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_kaguya.webp",alt:"SVT4_qm1_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Setting ",(0,o.jsx)(t.strong,{children:"qm-min"})," to ",(0,o.jsx)(t.strong,{children:"0"})," on top of enabling ",(0,o.jsx)(t.strong,{children:"quantization matrices"})," can be beneficial in some clips at no added compute time."]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"I will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content."}),"\n",(0,o.jsxs)(t.h3,{id:"--enable-restoration-0-vs-default---enable-restoration-1",children:[(0,o.jsx)(t.code,{children:"--enable-restoration 0"})," vs default ",(0,o.jsx)(t.code,{children:"--enable-restoration 1"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the ",(0,o.jsx)(t.strong,{children:"loop restoration filter"})," isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--scm-0-vs-default---scm-2-content-adaptive",children:[(0,o.jsx)(t.code,{children:"--scm 0"})," vs default ",(0,o.jsx)(t.code,{children:"--scm 2"})," (content adaptive)"]}),"\n",(0,o.jsx)(t.p,{children:"In all the clips, the results are bit-perfect and there is no notable performance difference."}),"\n",(0,o.jsxs)(t.h3,{id:"--scm-1-vs-default---scm-2-content-adaptive",children:[(0,o.jsx)(t.code,{children:"--scm 1"})," vs default ",(0,o.jsx)(t.code,{children:"--scm 2"})," (content adaptive)"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Interestingly enough, ",(0,o.jsx)(t.strong,{children:"screen content tools"})," seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this."]}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--enable-tf-0-vs-default---enable-tf-1",children:[(0,o.jsx)(t.code,{children:"--enable-tf 0"})," vs default ",(0,o.jsx)(t.code,{children:"--enable-tf 1"})]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,o.jsx)(a.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}],pixelsAbove:0,pixelsBelow:24}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Disabled ",(0,o.jsx)(t.strong,{children:"temporal filtering"})," ",(0,o.jsx)(t.em,{children:"can"}),' sometimes improve efficiency slightly at "high quality", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.']}),"\n"]}),"\n",(0,o.jsxs)(t.h3,{id:"--enable-tpl-la-0-vs-default---enable-tpl-la-1",children:[(0,o.jsx)(t.code,{children:"--enable-tpl-la 0"})," vs default ",(0,o.jsx)(t.code,{children:"--enable-tpl-la 1"})]}),"\n",(0,o.jsx)(t.p,{children:"In all the clips, the results are bit-perfect and there is no notable performance difference."}),"\n",(0,o.jsxs)(t.h3,{id:"superres",children:[(0,o.jsx)(t.code,{children:"superres"}),":"]}),"\n",(0,o.jsx)(t.p,{children:"Kinda lazy to make, share and comment so much graphs for something that can be told in two lines..."}),"\n",(0,o.jsx)(t.p,{children:"All superres variants are freaking useless as they:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"do not improve efficiency"}),"\n",(0,o.jsx)(t.li,{children:"decrease encoding speeds"}),"\n",(0,o.jsx)(t.li,{children:"decrease decoding speeds when either bitrate or quality normalized."}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"early-tldr-on-parameters-results",children:(0,o.jsx)(t.strong,{children:"Early TLDR on parameters results:"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.em,{children:(0,o.jsxs)(t.strong,{children:["For a previous test with SVT-AV1 1.7.0 I did all parameters tests with ",(0,o.jsx)(t.code,{children:"--preset 6 --tune 2"}),", now I did them with ",(0,o.jsx)(t.code,{children:"--preset 4 --tune 1"}),". Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line."]})})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Here is a quick run down of how each parameter affect encoding:"})}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--tile-rows --tile-columns"})," should never be used (except for decreasing decode complexity)"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--aq-mode 2"})," is the most efficient / fastest"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--enable-cdef 0"})," ",(0,o.jsx)(t.em,{children:"might"})," improve performance at almost no efficiency loss ",(0,o.jsx)(t.em,{children:"(needs more thorough testing)"})]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--enable-dg"})," and ",(0,o.jsx)(t.code,{children:"--enable-dlf"})," barely do anything"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--fast-decode 1"})," decreases efficiency, improves encoding times, and the decoding gains still need to be determined."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--irefresh-type"})," should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--lookahead"})," should be kept default"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--enable-overlays 1"})," does not improve efficiency, slight speed regression as well"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--enable-qm 1 --qm-min 0"})," should be set for increased efficiency especially at low CRF values at no perf cost"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--enable-restoration"})," barely does anything but disabling yields better performance ",(0,o.jsx)(t.em,{children:"(needs visual confirmation)"})]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--scm 1"})," screen content tools can improve efficiency with a big performance trade-off ",(0,o.jsx)(t.em,{children:"(needs more thorough testing)"})]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"--enable-tf 0"})," is a mixed bag efficiency wise but improves performance"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"superres & resize"})," please don't."]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,o.jsx)(t.p,{children:"The extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking."}),"\n",(0,o.jsx)(t.p,{children:"The default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength."}),"\n",(0,o.jsx)(t.p,{children:"Further testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!"}),"\n"]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(m,{...e})}):m(e)}},5255:e=>{e.exports=JSON.parse('{"permalink":"/blog/svt-av1-deep-dive","source":"@site/blog/2023-12-30-svt-av1-deep-dive.mdx","title":"Encoding Animation with SVT-AV1: A Deep Dive","description":"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?","date":"2023-12-30T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"},{"inline":true,"label":"benchmarks","permalink":"/blog/tags/benchmarks"}],"readingTime":22.78,"hasTruncateMarker":true,"authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Encoding Animation with SVT-AV1: A Deep Dive","description":"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?","slug":"svt-av1-deep-dive","authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043"}],"tags":["video","compression","benchmarks"],"image":"/img/svt-1.8.0-testing-blog-image.webp","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","permalink":"/blog/svt-av1-second-deep-dive"},"nextItem":{"title":"Embedding the Un-Embeddable","permalink":"/blog/embedding-the-un-embeddable"}}')}}]); \ No newline at end of file diff --git a/assets/js/7385c97b.052a7324.js b/assets/js/7385c97b.052a7324.js deleted file mode 100644 index 3026f83f4..000000000 --- a/assets/js/7385c97b.052a7324.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8415],{5322:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=s(4848),t=s(8453);const o={title:"AVIF",sidebar_position:6},r="AVIF",a={id:"images/AVIF",title:"AVIF",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/images/AVIF.mdx",sourceDirName:"images",slug:"/images/AVIF",permalink:"/docs/images/AVIF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/AVIF.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"AVIF",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"JPEG 2000",permalink:"/docs/images/JPEG2000"},next:{title:"JPEG XL",permalink:"/docs/images/JXL"}},l={},c=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Advantages",id:"advantages",level:3},{value:"Limitations",id:"limitations",level:3},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Details:s}=i;return s||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"avif",children:"AVIF"})}),"\n",(0,n.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(i.p,{children:["AVIF, which stands for AV1 Image File Format, is a newer image codec that is based on the ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," video codec. AVIF supersedes ",(0,n.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", & uses the same HEIF container as HEIC. AVIF is designed to have a better featureset & better general lossy compression than older image codecs, including ",(0,n.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"}),", HEIC, & ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),". AVIF is often compared to ",(0,n.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),", though in practice, the two have very different strengths."]}),"\n",(0,n.jsx)(i.p,{children:"There are two AVIF profiles available for encoding: Baseline & Advanced, which are based on AV1's Main & High profiles respectively. The AVIF Baseline profile supports up to 8,192*4,352 resolution specified by the requirement of using AV1 Level 5.1 or lower. Using tiling, it is possible to increase the maximum resolution of the AVIF Baseline profile to 65536*65536, although this hurts coding efficiency as visual anomalies may be encountered along the edges of the tile boundaries. AVIF is also limited to 10 bit color precision in its Baseline profile."}),"\n",(0,n.jsx)(i.p,{children:"In the AVIF Advanced profile, the maximum image dimensions extend to 16,384*8,704. Tiling may be used in the Advanced profile to create larger images, but the same limitations regarding visual artifacts apply. The AVIF Advanced profile extends the allowed AV1 Level to 6.0 or lower, & the highest bit depth offered by this profile is 12 BPC. It is worth noting that while it is currently a near certainty that AVIF implementations will support both the Baseline & Advanced profiles, this may not always be the case. This is a problem that affects HEIC currently, & is a known potential weakness of video-based image codecs."}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"Poorly"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"8 BPC, 10 BPC, 12 BPC"})]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"No"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Compatible Browsers"})," (full support)"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.google.com/chrome/",children:"Google Chrome"})," 85+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.apple.com/safari/",children:"Safari"})," 16.4+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.mozilla.org/en-US/firefox/new/",children:"Firefox"})," 113+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.opera.com/",children:"Opera"})," 71+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://apps.gnome.org/app/org.gnome.Epiphany/",children:"GNOME Web"})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsx)(i.h3,{id:"advantages",children:"Advantages"}),"\n",(0,n.jsx)(i.p,{children:"AVIF is known for its extremely strong lossy compression performance for non-photographic images as well as photographic images in the low to medium fidelity range. AVIF is consistently better than JPEG visually, except for with complex images that contain a lot of highly entropic data like random noise."}),"\n",(0,n.jsx)(i.p,{children:"AVIF compatibility has grown rapidly since its adoption in Google Chrome in 2020. For a relatively new image format, its level of penetration has been stellar, especially in the browser market. At this point in time, it would be a safe bet to ship AVIF images for your site given they compress better than JPEG & have older formats provided as fallbacks."}),"\n",(0,n.jsx)(i.p,{children:"AVIF's wider featureset enables new experiences through images, including HDR. AVIF also presents astonishing animation prowess, as it is capable of using AV1's inter-frame coding techniques which make it easily the best animated image format for most use cases where it is compatible."}),"\n",(0,n.jsx)(i.h3,{id:"limitations",children:"Limitations"}),"\n",(0,n.jsx)(i.p,{children:"AVIF encoding implementations are difficult to use, and images require much longer encoding times for what can be considered competitive quality. Making encoding more difficult, AVIF's use of intra-frame coding techniques that share data between blocks reduces parallelization capability & worsens generation loss. Theoretically, this improves coding efficiency, though. Via the AVIF Encoding section of the aomenc page:"}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"AVIF Encoding with aomenc through avifenc"}),(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders."}),(0,n.jsx)("p",{children:"A sample command for encoding AVIF looks like this:"}),(0,n.jsx)("pre",{children:(0,n.jsx)("code",{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),(0,n.jsx)("p",{children:"Where:"}),(0,n.jsxs)("ul",{children:[(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-c aom"})," is the encoder"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't paralellize perfectly. Test using a speed benchmark to verify which value works best for you."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8 bit source image."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,n.jsx)(i.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]})]})]})]}),"\n",(0,n.jsx)(i.p,{children:"Additionally, AVIF tends to be underwhelming at high fidelity with photographic images. Compared to older codecs it usually outperforms the competition, but since medium to high fidelity tends to be the target for a lot of modern web delivery, it is disappointing to see AVIF not performing as well here."}),"\n",(0,n.jsx)(i.p,{children:"AVIF also does not have progressive decode. This is a common weakness of video-based image codecs. While there is a hacky way to do progressive AVIF by encoding a low fidelity frame & then a high fidelity frame in an animated AVIF at a high framerate so the low fidelity frame is loaded & plays first, this is far from ideal for the average user & adds to an already burdensome encoding process. Additionally, this has issues with Firefox, which only recently got support for animated AVIF."}),"\n",(0,n.jsx)(i.p,{children:"Finally, AVIF's lossless mode is incredibly underwhelming, often producing larger files than PNG. When compressing losslessly, avoid AVIF entirely."}),"\n",(0,n.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(i.p,{children:"While AVIF is certainly promising, its shortcomings"})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var n=s(6540);const t={},o=n.createContext(t);function r(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7385c97b.9ee263a4.js b/assets/js/7385c97b.9ee263a4.js new file mode 100644 index 000000000..df2b8d0e8 --- /dev/null +++ b/assets/js/7385c97b.9ee263a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8415],{5795:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"images/AVIF","title":"AVIF","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/images/AVIF.mdx","sourceDirName":"images","slug":"/images/AVIF","permalink":"/docs/images/AVIF","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/AVIF.mdx","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"AVIF","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"JPEG 2000","permalink":"/docs/images/JPEG2000"},"next":{"title":"JPEG XL","permalink":"/docs/images/JXL"}}');var t=s(4848),o=s(8453);const r={title:"AVIF",sidebar_position:6},a="AVIF",l={},c=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Advantages",id:"advantages",level:3},{value:"Limitations",id:"limitations",level:3},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Details:s}=i;return s||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"avif",children:"AVIF"})}),"\n",(0,t.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsxs)(i.p,{children:["AVIF, which stands for AV1 Image File Format, is a newer image codec that is based on the ",(0,t.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," video codec. AVIF supersedes ",(0,t.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", & uses the same HEIF container as HEIC. AVIF is designed to have a better featureset & better general lossy compression than older image codecs, including ",(0,t.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"}),", HEIC, & ",(0,t.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),". AVIF is often compared to ",(0,t.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),", though in practice, the two have very different strengths."]}),"\n",(0,t.jsx)(i.p,{children:"There are two AVIF profiles available for encoding: Baseline & Advanced, which are based on AV1's Main & High profiles respectively. The AVIF Baseline profile supports up to 8,192*4,352 resolution specified by the requirement of using AV1 Level 5.1 or lower. Using tiling, it is possible to increase the maximum resolution of the AVIF Baseline profile to 65536*65536, although this hurts coding efficiency as visual anomalies may be encountered along the edges of the tile boundaries. AVIF is also limited to 10 bit color precision in its Baseline profile."}),"\n",(0,t.jsx)(i.p,{children:"In the AVIF Advanced profile, the maximum image dimensions extend to 16,384*8,704. Tiling may be used in the Advanced profile to create larger images, but the same limitations regarding visual artifacts apply. The AVIF Advanced profile extends the allowed AV1 Level to 6.0 or lower, & the highest bit depth offered by this profile is 12 BPC. It is worth noting that while it is currently a near certainty that AVIF implementations will support both the Baseline & Advanced profiles, this may not always be the case. This is a problem that affects HEIC currently, & is a known potential weakness of video-based image codecs."}),"\n",(0,t.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,t.jsxs)(i.p,{children:["Lossless? ",(0,t.jsx)(i.em,{children:"Poorly"})]}),"\n",(0,t.jsxs)(i.p,{children:["Lossy? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,t.jsx)(i.em,{children:"8 BPC, 10 BPC, 12 BPC"})]}),"\n",(0,t.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Animation? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Transparency? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Progressive Decode? ",(0,t.jsx)(i.em,{children:"No"})]}),"\n",(0,t.jsxs)(i.p,{children:["Royalty Free? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"Compatible Browsers"})," (full support)"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://www.google.com/chrome/",children:"Google Chrome"})," 85+"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://www.apple.com/safari/",children:"Safari"})," 16.4+"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://www.mozilla.org/en-US/firefox/new/",children:"Firefox"})," 113+"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://www.opera.com/",children:"Opera"})," 71+"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.a,{href:"https://apps.gnome.org/app/org.gnome.Epiphany/",children:"GNOME Web"})}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,t.jsx)(i.h3,{id:"advantages",children:"Advantages"}),"\n",(0,t.jsx)(i.p,{children:"AVIF is known for its extremely strong lossy compression performance for non-photographic images as well as photographic images in the low to medium fidelity range. AVIF is consistently better than JPEG visually, except for with complex images that contain a lot of highly entropic data like random noise."}),"\n",(0,t.jsx)(i.p,{children:"AVIF compatibility has grown rapidly since its adoption in Google Chrome in 2020. For a relatively new image format, its level of penetration has been stellar, especially in the browser market. At this point in time, it would be a safe bet to ship AVIF images for your site given they compress better than JPEG & have older formats provided as fallbacks."}),"\n",(0,t.jsx)(i.p,{children:"AVIF's wider featureset enables new experiences through images, including HDR. AVIF also presents astonishing animation prowess, as it is capable of using AV1's inter-frame coding techniques which make it easily the best animated image format for most use cases where it is compatible."}),"\n",(0,t.jsx)(i.h3,{id:"limitations",children:"Limitations"}),"\n",(0,t.jsx)(i.p,{children:"AVIF encoding implementations are difficult to use, and images require much longer encoding times for what can be considered competitive quality. Making encoding more difficult, AVIF's use of intra-frame coding techniques that share data between blocks reduces parallelization capability & worsens generation loss. Theoretically, this improves coding efficiency, though. Via the AVIF Encoding section of the aomenc page:"}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"AVIF Encoding with aomenc through avifenc"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders."}),(0,t.jsx)("p",{children:"A sample command for encoding AVIF looks like this:"}),(0,t.jsx)("pre",{children:(0,t.jsx)("code",{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),(0,t.jsx)("p",{children:"Where:"}),(0,t.jsxs)("ul",{children:[(0,t.jsxs)("li",{children:[(0,t.jsx)(i.code,{children:"-c aom"})," is the encoder"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)(i.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),(0,t.jsxs)("li",{children:[(0,t.jsx)(i.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't paralellize perfectly. Test using a speed benchmark to verify which value works best for you."]}),(0,t.jsxs)("li",{children:[(0,t.jsx)(i.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8 bit source image."]}),(0,t.jsxs)("li",{children:[(0,t.jsx)(i.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),(0,t.jsxs)("li",{children:[(0,t.jsx)(i.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,t.jsx)(i.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),(0,t.jsxs)("li",{children:[(0,t.jsx)(i.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]})]})]})]}),"\n",(0,t.jsx)(i.p,{children:"Additionally, AVIF tends to be underwhelming at high fidelity with photographic images. Compared to older codecs it usually outperforms the competition, but since medium to high fidelity tends to be the target for a lot of modern web delivery, it is disappointing to see AVIF not performing as well here."}),"\n",(0,t.jsx)(i.p,{children:"AVIF also does not have progressive decode. This is a common weakness of video-based image codecs. While there is a hacky way to do progressive AVIF by encoding a low fidelity frame & then a high fidelity frame in an animated AVIF at a high framerate so the low fidelity frame is loaded & plays first, this is far from ideal for the average user & adds to an already burdensome encoding process. Additionally, this has issues with Firefox, which only recently got support for animated AVIF."}),"\n",(0,t.jsx)(i.p,{children:"Finally, AVIF's lossless mode is incredibly underwhelming, often producing larger files than PNG. When compressing losslessly, avoid AVIF entirely."}),"\n",(0,t.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,t.jsx)(i.p,{children:"While AVIF is certainly promising, its shortcomings"})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var n=s(6540);const t={},o=n.createContext(t);function r(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/75936cdf.b36d710c.js b/assets/js/75936cdf.b36d710c.js deleted file mode 100644 index 29719bfde..000000000 --- a/assets/js/75936cdf.b36d710c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7564],{9613:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var t=i(4848),o=i(8453);const r={title:"Graining",sidebar_position:12},s="Graining",a={id:"filtering/graining",title:"Graining",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/graining.mdx",sourceDirName:"filtering",slug:"/filtering/graining",permalink:"/docs/filtering/graining",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/graining.mdx",tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"Graining",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Deband",permalink:"/docs/filtering/deband"},next:{title:"Intro",permalink:"/docs/colorimetry/intro"}},c={},d=[];function u(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"graining",children:"Graining"})}),"\n",(0,t.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>a});var t=i(6540);const o={},r=t.createContext(o);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/75936cdf.f2d00a0a.js b/assets/js/75936cdf.f2d00a0a.js new file mode 100644 index 000000000..87df56460 --- /dev/null +++ b/assets/js/75936cdf.f2d00a0a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7564],{4703:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"filtering/graining","title":"Graining","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/filtering/graining.mdx","sourceDirName":"filtering","slug":"/filtering/graining","permalink":"/docs/filtering/graining","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/graining.mdx","tags":[],"version":"current","sidebarPosition":12,"frontMatter":{"title":"Graining","sidebar_position":12},"sidebar":"tutorialSidebar","previous":{"title":"Deband","permalink":"/docs/filtering/deband"},"next":{"title":"Intro","permalink":"/docs/colorimetry/intro"}}');var o=i(4848),r=i(8453);const s={title:"Graining",sidebar_position:12},a="Graining",c={},d=[];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"graining",children:"Graining"})}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>a});var t=i(6540);const o={},r=t.createContext(o);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/76096a15.2d7f04b6.js b/assets/js/76096a15.2d7f04b6.js deleted file mode 100644 index 048dab312..000000000 --- a/assets/js/76096a15.2d7f04b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8924],{8560:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var i=s(4848),n=s(8453);const r={title:"SRT"},o="SRT",l={id:"subtitles/SRT",title:"SRT",description:"SubRip Text (SRT) is a text format for subtitles, described as 'the most basic of all subtitle formats'. SRT files are plain text with the extension .srt.",source:"@site/docs/subtitles/SRT.mdx",sourceDirName:"subtitles",slug:"/subtitles/SRT",permalink:"/docs/subtitles/SRT",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/SRT.mdx",tags:[],version:"current",frontMatter:{title:"SRT"},sidebar:"tutorialSidebar",previous:{title:"Mediacodec",permalink:"/docs/encoders_hw/mediacodec"},next:{title:"SubStation Alpha",permalink:"/docs/subtitles/SSA"}},c={},d=[{value:"Format",id:"format",level:2},{value:"Unoffical features",id:"unoffical-features",level:3},{value:"Example",id:"example",level:2}];function a(e){const t={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"srt",children:"SRT"})}),"\n",(0,i.jsxs)(t.p,{children:["SubRip Text (SRT) is a text format for subtitles, described as 'the most basic of all subtitle formats'. SRT files are plain text with the extension ",(0,i.jsx)(t.code,{children:".srt"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"format",children:"Format"}),"\n",(0,i.jsxs)(t.p,{children:["Subtitles are placed into sequentially ordered groups, called cues, with a starting and ending timestamp, encoded ",(0,i.jsx)(t.code,{children:"hours:minutes:seconds,milliseconds"}),". Note the seperator for the millisecond value is a comma. The starting and ending value are seperated by ",(0,i.jsx)(t.code,{children:"--\x3e"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"unoffical-features",children:"Unoffical features"}),"\n",(0,i.jsx)(t.p,{children:"Some basic HTML tags are supported by some viewers, such as:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bold"})," ",(0,i.jsx)(t.strong,{children:"bold"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"italics"})," ",(0,i.jsx)(t.em,{children:"italics"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:""})," underlined"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:'Blue'})," colored text."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Note these will be displayed verbatim on viewers that don't support these features."}),"\n",(0,i.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"1\n00:00:00,000 --\x3e 00:01:00,000\nThis subtitle will be visible for the first minute of the stream\n\n2\n00:01:00,000 --\x3e 00:01:30,000\nand this one for thirty seconds after that.\n"})})]})}function u(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>l});var i=s(6540);const n={},r=i.createContext(n);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/76096a15.f48bc36b.js b/assets/js/76096a15.f48bc36b.js new file mode 100644 index 000000000..8f7786de7 --- /dev/null +++ b/assets/js/76096a15.f48bc36b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8924],{3065:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"subtitles/SRT","title":"SRT","description":"SubRip Text (SRT) is a text format for subtitles, described as \'the most basic of all subtitle formats\'. SRT files are plain text with the extension .srt.","source":"@site/docs/subtitles/SRT.mdx","sourceDirName":"subtitles","slug":"/subtitles/SRT","permalink":"/docs/subtitles/SRT","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/SRT.mdx","tags":[],"version":"current","frontMatter":{"title":"SRT"},"sidebar":"tutorialSidebar","previous":{"title":"Mediacodec","permalink":"/docs/encoders_hw/mediacodec"},"next":{"title":"SubStation Alpha","permalink":"/docs/subtitles/SSA"}}');var n=s(4848),r=s(8453);const l={title:"SRT"},o="SRT",c={},a=[{value:"Format",id:"format",level:2},{value:"Unoffical features",id:"unoffical-features",level:3},{value:"Example",id:"example",level:2}];function d(e){const t={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"srt",children:"SRT"})}),"\n",(0,n.jsxs)(t.p,{children:["SubRip Text (SRT) is a text format for subtitles, described as 'the most basic of all subtitle formats'. SRT files are plain text with the extension ",(0,n.jsx)(t.code,{children:".srt"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"format",children:"Format"}),"\n",(0,n.jsxs)(t.p,{children:["Subtitles are placed into sequentially ordered groups, called cues, with a starting and ending timestamp, encoded ",(0,n.jsx)(t.code,{children:"hours:minutes:seconds,milliseconds"}),". Note the seperator for the millisecond value is a comma. The starting and ending value are seperated by ",(0,n.jsx)(t.code,{children:"--\x3e"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"unoffical-features",children:"Unoffical features"}),"\n",(0,n.jsx)(t.p,{children:"Some basic HTML tags are supported by some viewers, such as:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"bold"})," ",(0,n.jsx)(t.strong,{children:"bold"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"italics"})," ",(0,n.jsx)(t.em,{children:"italics"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:""})," underlined"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:'Blue'})," colored text."]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Note these will be displayed verbatim on viewers that don't support these features."}),"\n",(0,n.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"1\n00:00:00,000 --\x3e 00:01:00,000\nThis subtitle will be visible for the first minute of the stream\n\n2\n00:01:00,000 --\x3e 00:01:30,000\nand this one for thirty seconds after that.\n"})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>l,x:()=>o});var i=s(6540);const n={},r=i.createContext(n);function l(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7d09a242.ce991e50.js b/assets/js/7d09a242.ce991e50.js deleted file mode 100644 index 33bbf1753..000000000 --- a/assets/js/7d09a242.ce991e50.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6692],{1586:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>h});var s=i(4848),t=i(8453),a=i(1470),r=i(9365);const l={title:"aomenc",sidebar_position:4,keywords:["AV1","encoding","video encoding","AOM AV1"]},o="aomenc",c={id:"encoders/aomenc",title:"aomenc",description:"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.",source:"@site/docs/encoders/aomenc.mdx",sourceDirName:"encoders",slug:"/encoders/aomenc",permalink:"/docs/encoders/aomenc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aomenc.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"aomenc",sidebar_position:4,keywords:["AV1","encoding","video encoding","AOM AV1"]},sidebar:"tutorialSidebar",previous:{title:"x266",permalink:"/docs/encoders/x266"},next:{title:"SVT-AV1-PSY",permalink:"/docs/encoders/SVT-AV1-PSY"}},d={},h=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"AV1 Encoding",id:"av1-encoding",level:3},{value:"AVIF Encoding",id:"avif-encoding",level:3},{value:"Recommendations",id:"recommendations",level:2},{value:"Community Forks",id:"community-forks",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"aomenc",children:"aomenc"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://aomedia.googlesource.com/aom/",children:"aomenc"}),", AOM-AV1, or just ",(0,s.jsx)(n.strong,{children:"libaom"})," is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1."]}),"\n",(0,s.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc is available in FFmpeg via ",(0,s.jsx)(n.code,{children:"libaom-av1"}),", check if you have it by running ",(0,s.jsx)(n.code,{children:"ffmpeg -h encoder=libaom-av1"}),". You can input non-FFmpeg standard aomenc parameters via ",(0,s.jsx)(n.code,{children:"-aom-params"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,s.jsx)(n.p,{children:"aomenc supports the following color spaces:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Format"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,s.jsx)(n.th,{children:"Supported Bit Depth(s)"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GRAY8"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GRAY10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GRAY12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"12-bit"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsxs)(r.A,{value:"unixlike",label:"Linux & macOS",default:!0,children:[(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Clone the mainline aom repo:"}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the aom repo"',children:"git clone https://aomedia.googlesource.com/aom\ncd aom && mkdir aom_build && cd aom_build\n"})}),(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["Configure compilation. The following flags are set to ensure the ",(0,s.jsx)(n.code,{children:"aomenc"})," binary is build for optimal performance:"]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Set CMake flags"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\n'})}),(0,s.jsxs)(n.ol,{start:"3",children:["\n",(0,s.jsx)(n.li,{children:"Compile:"}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Compile"',children:"make -j$(nproc)\n"})}),(0,s.jsxs)(n.ol,{start:"4",children:["\n",(0,s.jsx)(n.li,{children:"Install to your system. This may require elevated privileges:"}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Install"',children:"make install\n"})})]}),(0,s.jsxs)(r.A,{value:"wind",label:"Windows",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"MSYS2"})," is the best option for building in Windows, as it provides a Unix-like environment for compilation."]}),(0,s.jsxs)(n.ol,{start:"0",children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,s.jsx)(n.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Start the UCRT64 console & install the required dependencies:"}),"\n"]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pacman -S cmake git perl yasm nasm python3 doxygen mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel\n"})}),(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsx)(n.li,{children:"Clone the mainline aom repo:"}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the aom repo"',children:"git clone https://aomedia.googlesource.com/aom\ncd aom && mkdir aom_build && cd aom_build\n"})}),(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["Configure compilation. The following flags are set to ensure the ",(0,s.jsx)(n.code,{children:"aomenc"})," binary is build for optimal performance:"]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Set CMake flags"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\n'})}),(0,s.jsxs)(n.ol,{start:"3",children:["\n",(0,s.jsx)(n.li,{children:"Compile:"}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Compile"',children:"make -j$(nproc)\n"})}),(0,s.jsxs)(n.p,{children:["The resulting binary will be available within the home folder of the location where you installed MSYS2 (usually ",(0,s.jsx)(n.code,{children:"C:"}),"). Navigate there, and then to the ",(0,s.jsx)(n.code,{children:"aom"})," folder; the binary should be there."]}),(0,s.jsx)(n.p,{children:'Built files should be in the "Debug" folder.'})]})]}),"\n",(0,s.jsx)(n.admonition,{title:"Sharing Native Binaries",type:"warning",children:(0,s.jsx)(n.p,{children:"Avoid sharing binaries compiled with native CPU optimizations unless the person you're sharing to has the same CPU architecture, as this can lead to incorrect encoder behavior."})}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.h3,{id:"av1-encoding",children:"AV1 Encoding"}),"\n",(0,s.jsx)(n.admonition,{title:"2-Pass Encoding",type:"note",children:(0,s.jsx)(n.p,{children:"The way aomenc was developed requires 2-pass to take full advantage of its efficiency which include better rate controls and encoding features. So always specify the encoder to use 2 passes when encoding."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Simple Y4M input with CQ 22, 1 pass, and raw ivf bitstream output"',children:"aomenc --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf input.y4m\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 1"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=1 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 2"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=2 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.h3,{id:"avif-encoding",children:"AVIF Encoding"}),"\n",(0,s.jsx)(n.p,{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders. A sample command for encoding AVIF looks like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),"\n",(0,s.jsx)(n.p,{children:"Where:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-c aom"})," is the encoder"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't parallelize perfectly. Test using a speed benchmark to verify which value works best for you."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8-bit source image."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,s.jsx)(n.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc is largely lacking in its ability to take advantage of multiple threads, so a tool like ",(0,s.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," should be utilized for effective parallelization. The parameters shown will be biased towards Av1an and ",(0,s.jsx)(n.a,{href:"/docs/encoders/aom-av1-lavish",children:"aom-av1-lavish"})," usage, so if you plan on using standalone aomenc please adjust as needed."]}),"\n",(0,s.jsx)(n.p,{children:"Here are some recommended parameters:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 --denoise-noise-level=8"})}),"\n",(0,s.jsx)(n.p,{children:"Now let's break it down."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because weird linear algebra allows the video to become smaller and reduces banding."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster. See the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",loading:"lazy"})]}),"\n",(0,s.jsxs)(n.admonition,{title:"Tile usage",type:"note",children:[(0,s.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,s.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,s.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,s.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)."]}),(0,s.jsxs)(n.p,{children:["If you would like an easy way to calculate the necessary number of tiles for your video, you can use ",(0,s.jsx)(n.a,{href:"https://autocompressor.net/tools/av1-calculator",children:"the AV1 Encoding Calculator"})," online or run ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/av1-tile-calc",children:"this local tile calculator"}),"."]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,s.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--aq-mode=0"})," adaptive quantization mode, a mostly debatable area nowadays. 0 is better most of the time but some say 1 is also good."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg can't input it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--deltaq-mode=0"})," This value has been tested to be more perceptually efficient."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering (smoothing) will be, always been a hot topic. Most agree on the default of 4. Others think 1 is good for 3D Pixar CGI-like and 2D animation and 4 for live action content, and a higher value for lower bitrate encodes."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause Av1an already did scene detection, so we wont have to. Plus it speeds things up."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since Av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-chroma-deltaq=1 --enable-qm=1"})," Parameters that give you free efficiency boost discovered via testing."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well (NLMeans is the denoiser used)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--denoise-noise-level=8"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness). Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["You can use photon noise tables as an alternative via ",(0,s.jsx)(n.code,{children:"--film-grain-table"}),", which is also conveniently available in Av1an as ",(0,s.jsx)(n.code,{children:"--photon-noise=X"})]})}),"\n",(0,s.jsx)(n.h2,{id:"community-forks",children:"Community Forks"}),"\n",(0,s.jsxs)(n.p,{children:["Mainline aomenc is unfortunately not perfect. It suffers from bad defaults, a heavy focus on the perceptually flawed ",(0,s.jsx)(n.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," metric, misleading settings, and other issues. Fortunately, there are a couple of forks developed by the encoding community that were created to combat aomenc's underlying issues."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"})," ",(0,s.jsx)(n.em,{children:"No longer maintained as of 13th January 2023"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/docs/encoders/aom-av1-lavish",children:"aom-av1-lavish"})," ",(0,s.jsx)(n.em,{children:"No longer maintained as of 4th June 2024"})]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/docs/encoders/aom-psy101",children:"aom-psy101"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/porcino/aom-av1ador",children:"aom-av1ador"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"These forks fix up the poor decisions made by the original AOM devs and most importantly introduce new parameters and tunes to help fine-tune the encoder even more."})]})}function m(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>r});i(6540);var s=i(4164);const t={tabItem:"tabItem_Ymn6"};var a=i(4848);function r(e){let{children:n,hidden:i,className:r}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,r),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>w});var s=i(6540),t=i(4164),a=i(3104),r=i(6347),l=i(205),o=i(7485),c=i(1682),d=i(679);function h(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:s,default:t}}=e;return{value:n,label:i,attributes:s,default:t}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const t=(0,r.W6)(),a=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(a),(0,s.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(t.location.search);n.set(a,e),t.replace({...t.location,search:n.toString()})}),[a,t])]}function x(e){const{defaultValue:n,queryString:i=!1,groupId:t}=e,a=u(e),[r,o]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=i.find((e=>e.default))??i[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:a}))),[c,h]=p({queryString:i,groupId:t}),[x,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[t,a]=(0,d.Dv)(i);return[t,(0,s.useCallback)((e=>{i&&a.set(e)}),[i,a])]}({groupId:t}),g=(()=>{const e=c??x;return m({value:e,tabValues:a})?e:null})();(0,l.A)((()=>{g&&o(g)}),[g]);return{selectedValue:r,selectValue:(0,s.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),f(e)}),[h,f,a]),tabValues:a}}var f=i(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=i(4848);function b(e){let{className:n,block:i,selectedValue:s,selectValue:r,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),t=l[i].value;t!==s&&(c(n),r(t))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:a}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...a,className:(0,t.A)("tabs__item",g.tabItem,a?.className,{"tabs__item--active":s===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:a}=e;const r=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===a));return e?(0,s.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==a})))})}function y(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,t.A)("tabs-container",g.tabList),children:[(0,j.jsx)(b,{...n,...e}),(0,j.jsx)(v,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,j.jsx)(y,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var s=i(6540);const t={},a=s.createContext(t);function r(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7d09a242.fce803dc.js b/assets/js/7d09a242.fce803dc.js new file mode 100644 index 000000000..55189f733 --- /dev/null +++ b/assets/js/7d09a242.fce803dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6692],{1720:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>h});const s=JSON.parse('{"id":"encoders/aomenc","title":"aomenc","description":"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.","source":"@site/docs/encoders/aomenc.mdx","sourceDirName":"encoders","slug":"/encoders/aomenc","permalink":"/docs/encoders/aomenc","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aomenc.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"aomenc","sidebar_position":4,"keywords":["AV1","encoding","video encoding","AOM AV1"]},"sidebar":"tutorialSidebar","previous":{"title":"x266","permalink":"/docs/encoders/x266"},"next":{"title":"SVT-AV1-PSY","permalink":"/docs/encoders/SVT-AV1-PSY"}}');var t=i(4848),a=i(8453),r=i(1470),l=i(9365);const o={title:"aomenc",sidebar_position:4,keywords:["AV1","encoding","video encoding","AOM AV1"]},c="aomenc",d={},h=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"AV1 Encoding",id:"av1-encoding",level:3},{value:"AVIF Encoding",id:"avif-encoding",level:3},{value:"Recommendations",id:"recommendations",level:2},{value:"Community Forks",id:"community-forks",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"aomenc",children:"aomenc"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://aomedia.googlesource.com/aom/",children:"aomenc"}),", AOM-AV1, or just ",(0,t.jsx)(n.strong,{children:"libaom"})," is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1."]}),"\n",(0,t.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,t.jsxs)(n.p,{children:["aomenc is available in FFmpeg via ",(0,t.jsx)(n.code,{children:"libaom-av1"}),", check if you have it by running ",(0,t.jsx)(n.code,{children:"ffmpeg -h encoder=libaom-av1"}),". You can input non-FFmpeg standard aomenc parameters via ",(0,t.jsx)(n.code,{children:"-aom-params"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,t.jsx)(n.p,{children:"aomenc supports the following color spaces:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Format"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,t.jsx)(n.th,{children:"Supported Bit Depth(s)"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GRAY8"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GRAY10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GRAY12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"12-bit"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsxs)(r.A,{children:[(0,t.jsxs)(l.A,{value:"unixlike",label:"Linux & macOS",default:!0,children:[(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Clone the mainline aom repo:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the aom repo"',children:"git clone https://aomedia.googlesource.com/aom\ncd aom && mkdir aom_build && cd aom_build\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["Configure compilation. The following flags are set to ensure the ",(0,t.jsx)(n.code,{children:"aomenc"})," binary is build for optimal performance:"]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Set CMake flags"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\n'})}),(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsx)(n.li,{children:"Compile:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Compile"',children:"make -j$(nproc)\n"})}),(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsx)(n.li,{children:"Install to your system. This may require elevated privileges:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Install"',children:"make install\n"})})]}),(0,t.jsxs)(l.A,{value:"wind",label:"Windows",children:[(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"MSYS2"})," is the best option for building in Windows, as it provides a Unix-like environment for compilation."]}),(0,t.jsxs)(n.ol,{start:"0",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,t.jsx)(n.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the UCRT64 console & install the required dependencies:"}),"\n"]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pacman -S cmake git perl yasm nasm python3 doxygen mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"Clone the mainline aom repo:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the aom repo"',children:"git clone https://aomedia.googlesource.com/aom\ncd aom && mkdir aom_build && cd aom_build\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["Configure compilation. The following flags are set to ensure the ",(0,t.jsx)(n.code,{children:"aomenc"})," binary is build for optimal performance:"]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Set CMake flags"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\n'})}),(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsx)(n.li,{children:"Compile:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Compile"',children:"make -j$(nproc)\n"})}),(0,t.jsxs)(n.p,{children:["The resulting binary will be available within the home folder of the location where you installed MSYS2 (usually ",(0,t.jsx)(n.code,{children:"C:"}),"). Navigate there, and then to the ",(0,t.jsx)(n.code,{children:"aom"})," folder; the binary should be there."]}),(0,t.jsx)(n.p,{children:'Built files should be in the "Debug" folder.'})]})]}),"\n",(0,t.jsx)(n.admonition,{title:"Sharing Native Binaries",type:"warning",children:(0,t.jsx)(n.p,{children:"Avoid sharing binaries compiled with native CPU optimizations unless the person you're sharing to has the same CPU architecture, as this can lead to incorrect encoder behavior."})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.h3,{id:"av1-encoding",children:"AV1 Encoding"}),"\n",(0,t.jsx)(n.admonition,{title:"2-Pass Encoding",type:"note",children:(0,t.jsx)(n.p,{children:"The way aomenc was developed requires 2-pass to take full advantage of its efficiency which include better rate controls and encoding features. So always specify the encoder to use 2 passes when encoding."})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Simple Y4M input with CQ 22, 1 pass, and raw ivf bitstream output"',children:"aomenc --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf input.y4m\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 1"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=1 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 2"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=2 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,t.jsx)(n.h3,{id:"avif-encoding",children:"AVIF Encoding"}),"\n",(0,t.jsx)(n.p,{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders. A sample command for encoding AVIF looks like this:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),"\n",(0,t.jsx)(n.p,{children:"Where:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"-c aom"})," is the encoder"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't parallelize perfectly. Test using a speed benchmark to verify which value works best for you."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8-bit source image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,t.jsx)(n.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,t.jsxs)(n.p,{children:["aomenc is largely lacking in its ability to take advantage of multiple threads, so a tool like ",(0,t.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," should be utilized for effective parallelization. The parameters shown will be biased towards Av1an and ",(0,t.jsx)(n.a,{href:"/docs/encoders/aom-av1-lavish",children:"aom-av1-lavish"})," usage, so if you plan on using standalone aomenc please adjust as needed."]}),"\n",(0,t.jsx)(n.p,{children:"Here are some recommended parameters:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"--bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 --denoise-noise-level=8"})}),"\n",(0,t.jsx)(n.p,{children:"Now let's break it down."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because weird linear algebra allows the video to become smaller and reduces banding."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster. See the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)("picture",{children:[(0,t.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,t.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",loading:"lazy"})]}),"\n",(0,t.jsxs)(n.admonition,{title:"Tile usage",type:"note",children:[(0,t.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,t.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,t.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,t.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)."]}),(0,t.jsxs)(n.p,{children:["If you would like an easy way to calculate the necessary number of tiles for your video, you can use ",(0,t.jsx)(n.a,{href:"https://autocompressor.net/tools/av1-calculator",children:"the AV1 Encoding Calculator"})," online or run ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato/av1-tile-calc",children:"this local tile calculator"}),"."]})]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,t.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--aq-mode=0"})," adaptive quantization mode, a mostly debatable area nowadays. 0 is better most of the time but some say 1 is also good."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg can't input it."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--deltaq-mode=0"})," This value has been tested to be more perceptually efficient."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering (smoothing) will be, always been a hot topic. Most agree on the default of 4. Others think 1 is good for 3D Pixar CGI-like and 2D animation and 4 for live action content, and a higher value for lower bitrate encodes."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause Av1an already did scene detection, so we wont have to. Plus it speeds things up."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since Av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-chroma-deltaq=1 --enable-qm=1"})," Parameters that give you free efficiency boost discovered via testing."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well (NLMeans is the denoiser used)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--denoise-noise-level=8"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness). Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["You can use photon noise tables as an alternative via ",(0,t.jsx)(n.code,{children:"--film-grain-table"}),", which is also conveniently available in Av1an as ",(0,t.jsx)(n.code,{children:"--photon-noise=X"})]})}),"\n",(0,t.jsx)(n.h2,{id:"community-forks",children:"Community Forks"}),"\n",(0,t.jsxs)(n.p,{children:["Mainline aomenc is unfortunately not perfect. It suffers from bad defaults, a heavy focus on the perceptually flawed ",(0,t.jsx)(n.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," metric, misleading settings, and other issues. Fortunately, there are a couple of forks developed by the encoding community that were created to combat aomenc's underlying issues."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"})," ",(0,t.jsx)(n.em,{children:"No longer maintained as of 13th January 2023"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/docs/encoders/aom-av1-lavish",children:"aom-av1-lavish"})," ",(0,t.jsx)(n.em,{children:"No longer maintained as of 4th June 2024"})]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/docs/encoders/aom-psy101",children:"aom-psy101"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/porcino/aom-av1ador",children:"aom-av1ador"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"These forks fix up the poor decisions made by the original AOM devs and most importantly introduce new parameters and tunes to help fine-tune the encoder even more."})]})}function m(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>r});i(6540);var s=i(4164);const t={tabItem:"tabItem_Ymn6"};var a=i(4848);function r(e){let{children:n,hidden:i,className:r}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,r),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>w});var s=i(6540),t=i(4164),a=i(3104),r=i(6347),l=i(205),o=i(7485),c=i(1682),d=i(679);function h(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:s,default:t}}=e;return{value:n,label:i,attributes:s,default:t}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const t=(0,r.W6)(),a=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(a),(0,s.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(t.location.search);n.set(a,e),t.replace({...t.location,search:n.toString()})}),[a,t])]}function x(e){const{defaultValue:n,queryString:i=!1,groupId:t}=e,a=u(e),[r,o]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=i.find((e=>e.default))??i[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:a}))),[c,h]=p({queryString:i,groupId:t}),[x,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[t,a]=(0,d.Dv)(i);return[t,(0,s.useCallback)((e=>{i&&a.set(e)}),[i,a])]}({groupId:t}),g=(()=>{const e=c??x;return m({value:e,tabValues:a})?e:null})();(0,l.A)((()=>{g&&o(g)}),[g]);return{selectedValue:r,selectValue:(0,s.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),f(e)}),[h,f,a]),tabValues:a}}var f=i(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=i(4848);function b(e){let{className:n,block:i,selectedValue:s,selectValue:r,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),t=l[i].value;t!==s&&(c(n),r(t))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:a}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...a,className:(0,t.A)("tabs__item",g.tabItem,a?.className,{"tabs__item--active":s===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:a}=e;const r=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===a));return e?(0,s.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==a})))})}function y(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,t.A)("tabs-container",g.tabList),children:[(0,j.jsx)(b,{...n,...e}),(0,j.jsx)(v,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,j.jsx)(y,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var s=i(6540);const t={},a=s.createContext(t);function r(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7eff0f1a.47606ae6.js b/assets/js/7eff0f1a.47606ae6.js deleted file mode 100644 index 194e498c2..000000000 --- a/assets/js/7eff0f1a.47606ae6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2515],{7199:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var n=o(4848),t=o(8453);const s={title:"AVC / H.264",sidebar_position:1},r="H.264",a={id:"video/AVC",title:"AVC / H.264",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/AVC.mdx",sourceDirName:"video",slug:"/video/AVC",permalink:"/docs/video/AVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AVC.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"AVC / H.264",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"WavPack",permalink:"/docs/audio/WavPack"},next:{title:"HEVC / H.265",permalink:"/docs/video/HEVC"}},d={},c=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"h264",children:"H.264"})}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(i.p,{children:["H.264, also known as AVC (Advanced Video Coding), is a video compression standard that has played a significant role in multimedia codec technology. H.264 revolutionized video encoding by offering vastly more efficient compression than predecessors, and has been the nearly universal defacto video compression standard since. Its history is marked by continuous refinement and widespread adoption, especially as it pertains to the highly optimized ",(0,n.jsx)(i.a,{href:"/docs/encoders/x264",children:"x264"})," video encoder. Despite being over a decade old, H.264 remains relevant today. Newer codecs like ",(0,n.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,n.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),", and ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," aim to provide more efficient compression than H.264 but are currently not as universal. The choice between these codecs largely depends on the specific requirements of the application, compatibility and support, and the balance between compression efficiency and computational complexity."]})]})}function u(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>r,x:()=>a});var n=o(6540);const t={},s=n.createContext(t);function r(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7eff0f1a.9a5d601b.js b/assets/js/7eff0f1a.9a5d601b.js new file mode 100644 index 000000000..9d4f1240e --- /dev/null +++ b/assets/js/7eff0f1a.9a5d601b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2515],{4592:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"video/AVC","title":"AVC / H.264","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/AVC.mdx","sourceDirName":"video","slug":"/video/AVC","permalink":"/docs/video/AVC","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AVC.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"AVC / H.264","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"WavPack","permalink":"/docs/audio/WavPack"},"next":{"title":"HEVC / H.265","permalink":"/docs/video/HEVC"}}');var t=o(4848),s=o(8453);const r={title:"AVC / H.264",sidebar_position:1},a="H.264",d={},c=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"h264",children:"H.264"})}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(i.p,{children:["H.264, also known as AVC (Advanced Video Coding), is a video compression standard that has played a significant role in multimedia codec technology. H.264 revolutionized video encoding by offering vastly more efficient compression than predecessors, and has been the nearly universal defacto video compression standard since. Its history is marked by continuous refinement and widespread adoption, especially as it pertains to the highly optimized ",(0,t.jsx)(i.a,{href:"/docs/encoders/x264",children:"x264"})," video encoder. Despite being over a decade old, H.264 remains relevant today. Newer codecs like ",(0,t.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,t.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),", and ",(0,t.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," aim to provide more efficient compression than H.264 but are currently not as universal. The choice between these codecs largely depends on the specific requirements of the application, compatibility and support, and the balance between compression efficiency and computational complexity."]})]})}function u(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>r,x:()=>a});var n=o(6540);const t={},s=n.createContext(t);function r(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7f76a12e.4b9d38ae.js b/assets/js/7f76a12e.4b9d38ae.js deleted file mode 100644 index 59bc74261..000000000 --- a/assets/js/7f76a12e.4b9d38ae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1502],{2225:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var s=i(4848),t=i(8453);const o={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/av1-encoding-for-dummies",source:"@site/blog/2023-09-03-av1-for-dummies.mdx",title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",date:"2023-09-03T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"}],readingTime:16.09,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4",key:null,page:null},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4",key:null,page:null}],frontMatter:{title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"},nextItem:{title:"Reducing Image Load Online",permalink:"/blog/site-optimization"}},l={authorsImageUrls:[void 0,void 0]},c=[{value:"Installing the Tools",id:"installing-the-tools",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:2},{value:"The GUI Way",id:"the-gui-way",level:3},{value:"The WSL2 Way",id:"the-wsl2-way",level:3},{value:"The Automated Way",id:"the-automated-way",level:3},{value:"The Manual Way",id:"the-manual-way",level:3},{value:"macOS",id:"macos",level:2},{value:"Linux",id:"linux",level:2},{value:"The GUI Way",id:"the-gui-way-1",level:3},{value:"The TUI Way",id:"the-tui-way",level:3},{value:"The Compiling Route",id:"the-compiling-route",level:3},{value:"Ubuntu",id:"ubuntu",level:4},{value:"Arch",id:"arch",level:3},{value:"Compiling aom-av1-lavish",id:"compiling-aom-av1-lavish",level:4},{value:"Encoding",id:"encoding",level:2},{value:"Merging Everything",id:"merging-everything",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2},{value:"Final Thoughts",id:"final-thoughts",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["This guide will show you how to encode in AV1 the ",(0,s.jsx)(n.em,{children:"right"})," and ",(0,s.jsx)(n.em,{children:"optimal"})," way. Yes, you using standalone ",(0,s.jsx)(n.code,{children:"libaom"}),", ",(0,s.jsx)(n.code,{children:"libsvtav1"}),", and ",(0,s.jsx)(n.code,{children:"librav1e"})," from FFmpeg or even piping ",(0,s.jsx)(n.code,{children:"yuv4mpeg"})," into ",(0,s.jsx)(n.strong,{children:"mainline"})," aomenc are all unoptimal."]}),"\n",(0,s.jsx)(n.admonition,{title:"Outdated Information",type:"danger",children:(0,s.jsxs)(n.p,{children:["While a lot of the information presented in this guide is still relevant and correct, the AV1 ecosystem has changed dramatically since this guide's inception which has demanded a rewrite. Please see the ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-for-dummies",children:"AV1 for Dummies"})," blog post for more information."]})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Compare",src:i(8602).A+"",width:"1045",height:"588"})}),"\n",(0,s.jsxs)(n.p,{children:["In this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is ",(0,s.jsx)(n.strong,{children:"RAM consumption"}),", encoding 2160p (4K) with ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"})," with 4 workers could take upwards of ",(0,s.jsx)(n.strong,{children:"16GB"})," of RAM! So do keep this in mind."]}),"\n",(0,s.jsx)(n.h2,{id:"installing-the-tools",children:"Installing the Tools"}),"\n",(0,s.jsx)(n.p,{children:"Given all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Jump to"}),": ",(0,s.jsx)(n.a,{href:"#microsoft-windows",children:"Windows"})," | ",(0,s.jsx)(n.a,{href:"#macos",children:"macOS"})," | ",(0,s.jsx)(n.a,{href:"#linux",children:"Linux"})]}),"\n",(0,s.jsx)(n.h2,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,s.jsx)(n.h3,{id:"the-gui-way",children:"The GUI Way"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://github.com/n00mkrad/nmkoder",children:"NMKODER"})," which is a GUI front-end to av1an with all dependencies installed."]}),"\n",(0,s.jsx)(n.li,{children:"You're done, you can skip to the encoding part"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Almost abandonware",type:"danger",children:(0,s.jsx)(n.p,{children:"Since Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal."})}),"\n",(0,s.jsx)(n.h3,{id:"the-wsl2-way",children:"The WSL2 Way"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"(Recommended)"})}),"\n",(0,s.jsx)(n.p,{children:"If you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good."}),"\n",(0,s.jsxs)(n.p,{children:["The easiest way to encode with WSL2 is to use ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),", an interactive TUI for ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an",children:"Av1an"}),". An ArchWSL2 installation tutorial is provided ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"the-automated-way",children:"The Automated Way"}),"\n",(0,s.jsxs)(n.p,{children:["There is now a batch script for automating the install process, which can be found ",(0,s.jsx)(n.a,{href:"https://github.com/Hishiro64/av1an-win-script",children:"here"}),". The instructions are in the README file."]}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["The script will download outdated version encoders and tools such as ",(0,s.jsx)(n.code,{children:"aom-av1-psy"})," and MKVToolNix v76.0, if you are fine with these you can proceed."]})}),"\n",(0,s.jsx)(n.h3,{id:"the-manual-way",children:"The Manual Way"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.strong,{children:"Python 3.10.x, this will change so consult from the"})," ",(0,s.jsx)(n.a,{href:"http://www.vapoursynth.com/doc/installation.html",children:"Vapoursynth website"})," ",(0,s.jsx)(n.strong,{children:"if you're reading this from the future"})," from ",(0,s.jsx)(n.a,{href:"https://www.python.org/downloads/windows/",children:"here"}),' and select "Windows Installer 64-bit". Upon installation check the tick for adding Python to PATH like so\n',(0,s.jsx)(n.img,{alt:"Python PATH",src:i(9658).A+"",width:"672",height:"417"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download and install Vapoursynth from ",(0,s.jsx)(n.a,{href:"https://github.com/vapoursynth/vapoursynth/releases",children:"here"}),' and select "VapourSynth64-RXX.exe"']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Open the terminal and type ",(0,s.jsx)(n.code,{children:"vsrepo.py install lsmas ffms2"})," to install some plugins for Av1an to work."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download MKVToolNix from ",(0,s.jsx)(n.a,{href:"https://mkvtoolnix.download/downloads.html#windows",children:"here"}),', select "mkvtoolnix-64bit-XX.X.X-setup.exe", and install ',(0,s.jsx)(n.strong,{children:"(Also available on winget!)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download Av1an from ",(0,s.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases",children:"here"}),' (SELECT LATEST AND CLICK THE "ASSETS" DROPDOWN)']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download ",(0,s.jsx)(n.strong,{children:"shared libraries"})," FFmpeg from ",(0,s.jsx)(n.a,{href:"https://www.gyan.dev/ffmpeg/builds",children:"gyan.dev"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download a pre-built fork of Aomenc (",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging",children:"aom-av1-lavish"}),") which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows ",(0,s.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"here"})," ",(0,s.jsx)(n.em,{children:"(Current as of Sept 6, 2023)"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["If you opt to compile aomenc yourself, you can view the instructions on how to do that ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc/#installation",children:"here"}),"."]})}),"\n",(0,s.jsxs)(n.ol,{start:"8",children:["\n",(0,s.jsxs)(n.li,{children:["Move Av1an, FFmpeg ",(0,s.jsx)(n.strong,{children:"(Including the FFmpeg DLLs)"}),", and aomenc to somewhere preferable, eg ",(0,s.jsx)(n.code,{children:"C:\\Encoding"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Add the folder ",(0,s.jsx)(n.strong,{children:"AND MKVTOOLNIX INSTALLATION FOLDER"})," to the ",(0,s.jsx)(n.a,{href:"https://www.maketecheasier.com/what-is-the-windows-path/",children:"Windows PATH environment"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"macos",children:"macOS"}),"\n",(0,s.jsx)(n.p,{children:"macOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Homebrew + Macports for Av1an + rav1e:"}),"\n",(0,s.jsxs)(n.em,{children:["Note that some commands may have to be run with ",(0,s.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]})]}),"\n",(0,s.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["As is installing MacPorts. Install the relevent ",(0,s.jsx)(n.code,{children:".pkg"})," for your macOS version from the MacPorts Project website:\n",(0,s.jsx)(n.a,{href:"https://www.macports.org/install.php",children:"www.macports.org/install.php"})]}),"\n",(0,s.jsx)(n.p,{children:"Now, you can run the following commands:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install rav1e aom mkvtoolnix ffmpeg\n# Usually you must run MacPorts commands for package installations as root\nport upgrade outdated\nport install av1an\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This is the easiest way to get everything set up & working to produce AV1 video with ",(0,s.jsx)(n.code,{children:"rav1e"})," or mainline ",(0,s.jsx)(n.code,{children:"aomenc"})," & Av1an. You can check that things are installed by running the following commands & parsing their output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% av1an --version\nav1an 0.4.1-unstable (rev e10880d) (Release)\n\n* Compiler\n rustc 1.70.0 (LLVM 16.0)\n\n* Target Triple\n aarch64-apple-darwin\n\n* Date Info\n Commit Date: 2023-06-25\n\n* VapourSynth Plugins\n systems.innocent.lsmas : Not found\n com.vapoursynth.ffms2 : Not found\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'% rav1e --version | grep "release" -C 1\nrav1e 0.6.6 () (release)\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'% aomenc --help | grep "AOMedia" -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\n\n Use --codec to switch to a non-default encoder.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Notice ",(0,s.jsx)(n.code,{children:"systems.innocent.lsmas : Not found"})," in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through ",(0,s.jsx)(n.code,{children:"-m hybrid"}),". This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'av1an -i "input" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v " --tiles 8 -s 4 --quantizer 80 --no-scene-detection" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o "output.mkv"\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Building From Source"})}),"\n",(0,s.jsx)(n.p,{children:"If you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,s.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Homebrew installs ",(0,s.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from ",(0,s.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,s.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,s.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,s.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'brew install git rust nasm\ngit clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\ncd .. && cd target/release\ncp av1an /usr/local/bin\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"More Difficult: Building aom-av1-lavish from Source"})}),"\n",(0,s.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until Clybius merges ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the line ",(0,s.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,s.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,s.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,s.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,s.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,s.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root:\nmake install\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Now you can run ",(0,s.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,s.jsx)(n.code,{children:"aomenc"})," executable to ",(0,s.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,s.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,s.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Notice how it says ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below."]}),"\n",(0,s.jsx)(n.h2,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"Yet again, try using Arch. It's way easier."})}),"\n",(0,s.jsx)(n.h3,{id:"the-gui-way-1",children:"The GUI Way"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/aviator",children:"Aviator"})," (",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"})," + ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/FFmpeg",children:"FFmpeg"}),") or ",(0,s.jsx)(n.a,{href:"https://giannirosato.com/blog/post/aviator-1/",children:"rAV1ator"})," basically same thing but ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an.mdx",children:"Av1an"})," + ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"}),". Both are only available as ",(0,s.jsx)(n.a,{href:"https://beta.flathub.org/apps/net.natesales.Aviator",children:"Flatpaks"}),". Keep in mind Aviator ships with ",(0,s.jsx)(n.strong,{children:"SVT-AV1"})," and rAV1ator with ",(0,s.jsx)(n.strong,{children:"rav1e"})," instead of aomenc/AOM-AV1, which I will not be covering here."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"the-tui-way",children:"The TUI Way"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"(Recommended)"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rav1ator-cli"}),", a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation",children:"this page"})," for more info. Can be easily used on any distro."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"the-compiling-route",children:"The Compiling Route"}),"\n",(0,s.jsx)(n.h4,{id:"ubuntu",children:"Ubuntu"}),"\n",(0,s.jsxs)(n.p,{children:["The guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via ",(0,s.jsx)(n.code,{children:"rustup"})," first, as apt version of Rust is severely outdated, then you can continue."]}),"\n",(0,s.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install l-smash:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/l-smash/l-smash.git\ncd l-smash\n./configure --enable-shared --extra-cflags="-march=native"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,s.jsx)(n.p,{children:"Install zimg:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone --recursive https://github.com/sekrit-twc/zimg.git\ncd zimg\n./autogen.sh\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install ImageMagick:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/ImageMagick/ImageMagick\ncd ImageMagick\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install Vapoursynth R63:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'wget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\nunzip R63.zip\ncd vapoursynth-R63\n./autogen.sh\n./configure CFLAGS="-march=native" CXXFLAGS="-march=native" --libdir=/usr/lib\nmake -j$(nproc)\nsudo make install\nsudo mkdir /usr/lib/vapoursynth\nsudo ldconfig\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The plugin directory will be located in ",(0,s.jsx)(n.code,{children:"/usr/lib/vapoursynth"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Install L-SMASH-Works Vapoursynth Plugin:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args="-march=native" -Dcpp_args="-march=native"\nninja -j$(nproc)\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"danger",children:(0,s.jsxs)(n.p,{children:["L-SMASH-Works doesn't work on ",(0,s.jsx)(n.strong,{children:"aarch64"}),", it is recommended to use other plugins instead."]})}),"\n",(0,s.jsx)(n.p,{children:"Install FFMS2 Vapoursynth Plugin:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/FFMS/ffms2\ncd ffms2\n./autogen.sh\n./configure CFLAGS="-O3 -march=native" CXXFLAGS="-O3 -march=native"\nmake -j$(nproc)\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\n'})}),"\n",(0,s.jsx)(n.p,{children:"Install Av1an:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\nsudo cp target/release/av1an /usr/local/bin\n'})}),"\n",(0,s.jsxs)(n.p,{children:["When there's no errors, proceed to compiling ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"arch",children:"Arch"}),"\n",(0,s.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\n"})}),"\n",(0,s.jsx)(n.p,{children:"you're done, proceed."}),"\n",(0,s.jsx)(n.h4,{id:"compiling-aom-av1-lavish",children:"Compiling aom-av1-lavish"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,s.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsxs)(n.p,{children:["The moment you've all been waiting for, let's just get into it. Here's an example ",(0,s.jsx)(n.em,{children:"recommended"})," parameter as of now (09/03/23) [MM/DD/YY]:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'av1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a " -an " -f " -an " -v " --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 " -o "output.mkv"\n'})}),"\n",(0,s.jsx)(n.admonition,{title:"Parameter Meta",type:"info",children:(0,s.jsxs)(n.p,{children:["It is strongly recommended to join the ",(0,s.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general."]})}),"\n",(0,s.jsx)(n.p,{children:"Now let's dissect it one-by-one"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Av1an parameters:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-i"})," Input."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-x 300"})," Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-w 4"}),' Specifies the amount of "workers" or amount of encoders working on the video.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--verbose"})," Sets logging to verbose."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--resume"})," Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \"resumed\" without the parameter in place."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-e aom"})," Specifies we're using aomenc encoder which should be the default option."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-c mkvmerge"})," Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-m lsmash"})," Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-f " -an "'})," ",(0,s.jsx)(n.code,{children:"-f"})," Stands for ffmpeg parameters, ",(0,s.jsx)(n.code,{children:"-an"})," is to remove all audio since its better to encode and merge it separately. To crop use ",(0,s.jsx)(n.code,{children:'-f " -an -vf crop=1920:800 "'})," for example to crop the video to 1920x800."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-v " "'})," Is where you put the encoder's parameters in."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-a " -an "'})," FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: ",(0,s.jsx)(n.code,{children:'-a " -c:a libopus -b:a 128k "'}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--photon-noise=10"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--set-thread-affinity=2"})," Pins the thread to the encoder, aligns with ",(0,s.jsx)(n.code,{children:"--threads=2"})," in the encoder parameter so set them accordingly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"aomenc parameters:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because it makes the video smaller and reduces ",(0,s.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring",children:"banding"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--threads=2"})," Sets the amount of threads the encoder can use, aligns with ",(0,s.jsx)(n.code,{children:"--set-thread-affinity"})," in Av1an."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",width:"1280",height:"768",loading:"lazy"})]}),"\n",(0,s.jsx)(n.admonition,{title:"Tile usage",type:"note",children:(0,s.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,s.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,s.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,s.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)"]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,s.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--aq-mode"})," adaptive quantization mode, 0 is better most of the time"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Tunes to use",type:"info",children:(0,s.jsxs)(n.p,{children:["Set ",(0,s.jsx)(n.code,{children:"tune-content"})," to ",(0,s.jsx)(n.code,{children:"animation"})," if you're encoding above ",(0,s.jsx)(n.code,{children:"cq-level=30"})," A.K.A lower quality, despite it's name\nSet ",(0,s.jsx)(n.code,{children:"tune-content"})," to ",(0,s.jsx)(n.code,{children:"psy"})," for everything else, ",(0,s.jsxs)(n.strong,{children:["do not use if you encode above ",(0,s.jsx)(n.code,{children:"cq-level=30"})]}),"\nFor ",(0,s.jsx)(n.code,{children:"tune"}),", this is a bit tricky. For now, the meta seems to be ",(0,s.jsx)(n.code,{children:"ssim"}),", but back then it was ",(0,s.jsx)(n.code,{children:"lavish"})," which is considered THE best tune because it's based on ",(0,s.jsx)(n.a,{href:"https://github.com/google/butteraugli",children:"butteraugli"}),". Now it's fallen behind because its more blurry than ",(0,s.jsx)(n.code,{children:"ssim"}),", and before that it was ",(0,s.jsx)(n.code,{children:"butteraugli"}),", and then ",(0,s.jsx)(n.code,{children:"ipq_vmaf_psy"}),", and finally just ",(0,s.jsx)(n.code,{children:"ipq"}),".\nIf you use any of the VMAF tunes, ",(0,s.jsxs)(n.strong,{children:["you need to specify ",(0,s.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put it"]}),"."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--deltaq-mode"})," set to 0 because its just better."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause ",(0,s.jsx)(n.strong,{children:"Av1an already did scene detection, so we wont have to."}),". And it speeds things up."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1"})," Parameters that give you free efficiency boost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Concatenation Error on Linux",type:"info",children:(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"ulimit -n 200000"}),", resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ",(0,s.jsx)(n.code,{children:"mkvmerge @../options.json"})]})}),"\n",(0,s.jsx)(n.h2,{id:"merging-everything",children:"Merging Everything"}),"\n",(0,s.jsxs)(n.p,{children:["Once you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into ",(0,s.jsx)(n.code,{children:"mp4"}),", just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental."]}),"\n",(0,s.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--denoise-noise-level=10"})," Alternative to ",(0,s.jsx)(n.code,{children:"photon-noise"}),", slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and ",(0,s.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"final-thoughts",children:"Final Thoughts"}),"\n",(0,s.jsx)(n.p,{children:'Encoding has always been about experimentation for the best, there is really no "One size fits all" for encoding content, as they differ from scene complexity, how it\'s captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.strong,{children:["Guide originally hosted on ",(0,s.jsx)(n.a,{href:"https://rentry.co/AV1",children:"https://rentry.co/AV1"}),", rewrite and migration by Simulping."]})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8602:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/compare-guide-6feb966fbd9d73be4a3097c41691c4ad.webp"},9658:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/python-path-a89fc4fe6c6eb4c2ea0a7610dd2cf09a.webp"},8453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var s=i(6540);const t={},o=s.createContext(t);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7f76a12e.e417c56d.js b/assets/js/7f76a12e.e417c56d.js new file mode 100644 index 000000000..5aa492477 --- /dev/null +++ b/assets/js/7f76a12e.e417c56d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1502],{2225:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var s=i(7233),t=i(4848),o=i(8453);const a={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},r=void 0,l={authorsImageUrls:[void 0,void 0]},c=[{value:"Installing the Tools",id:"installing-the-tools",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:2},{value:"The GUI Way",id:"the-gui-way",level:3},{value:"The WSL2 Way",id:"the-wsl2-way",level:3},{value:"The Automated Way",id:"the-automated-way",level:3},{value:"The Manual Way",id:"the-manual-way",level:3},{value:"macOS",id:"macos",level:2},{value:"Linux",id:"linux",level:2},{value:"The GUI Way",id:"the-gui-way-1",level:3},{value:"The TUI Way",id:"the-tui-way",level:3},{value:"The Compiling Route",id:"the-compiling-route",level:3},{value:"Ubuntu",id:"ubuntu",level:4},{value:"Arch",id:"arch",level:3},{value:"Compiling aom-av1-lavish",id:"compiling-aom-av1-lavish",level:4},{value:"Encoding",id:"encoding",level:2},{value:"Merging Everything",id:"merging-everything",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2},{value:"Final Thoughts",id:"final-thoughts",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["This guide will show you how to encode in AV1 the ",(0,t.jsx)(n.em,{children:"right"})," and ",(0,t.jsx)(n.em,{children:"optimal"})," way. Yes, you using standalone ",(0,t.jsx)(n.code,{children:"libaom"}),", ",(0,t.jsx)(n.code,{children:"libsvtav1"}),", and ",(0,t.jsx)(n.code,{children:"librav1e"})," from FFmpeg or even piping ",(0,t.jsx)(n.code,{children:"yuv4mpeg"})," into ",(0,t.jsx)(n.strong,{children:"mainline"})," aomenc are all unoptimal."]}),"\n",(0,t.jsx)(n.admonition,{title:"Outdated Information",type:"danger",children:(0,t.jsxs)(n.p,{children:["While a lot of the information presented in this guide is still relevant and correct, the AV1 ecosystem has changed dramatically since this guide's inception which has demanded a rewrite. Please see the ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-for-dummies",children:"AV1 for Dummies"})," blog post for more information."]})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Compare",src:i(1679).A+"",width:"1045",height:"588"})}),"\n",(0,t.jsxs)(n.p,{children:["In this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is ",(0,t.jsx)(n.strong,{children:"RAM consumption"}),", encoding 2160p (4K) with ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"})," with 4 workers could take upwards of ",(0,t.jsx)(n.strong,{children:"16GB"})," of RAM! So do keep this in mind."]}),"\n",(0,t.jsx)(n.h2,{id:"installing-the-tools",children:"Installing the Tools"}),"\n",(0,t.jsx)(n.p,{children:"Given all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this."}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Jump to"}),": ",(0,t.jsx)(n.a,{href:"#microsoft-windows",children:"Windows"})," | ",(0,t.jsx)(n.a,{href:"#macos",children:"macOS"})," | ",(0,t.jsx)(n.a,{href:"#linux",children:"Linux"})]}),"\n",(0,t.jsx)(n.h2,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,t.jsx)(n.h3,{id:"the-gui-way",children:"The GUI Way"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Install ",(0,t.jsx)(n.a,{href:"https://github.com/n00mkrad/nmkoder",children:"NMKODER"})," which is a GUI front-end to av1an with all dependencies installed."]}),"\n",(0,t.jsx)(n.li,{children:"You're done, you can skip to the encoding part"}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{title:"Almost abandonware",type:"danger",children:(0,t.jsx)(n.p,{children:"Since Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal."})}),"\n",(0,t.jsx)(n.h3,{id:"the-wsl2-way",children:"The WSL2 Way"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"(Recommended)"})}),"\n",(0,t.jsx)(n.p,{children:"If you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good."}),"\n",(0,t.jsxs)(n.p,{children:["The easiest way to encode with WSL2 is to use ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),", an interactive TUI for ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an",children:"Av1an"}),". An ArchWSL2 installation tutorial is provided ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows",children:"here"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"the-automated-way",children:"The Automated Way"}),"\n",(0,t.jsxs)(n.p,{children:["There is now a batch script for automating the install process, which can be found ",(0,t.jsx)(n.a,{href:"https://github.com/Hishiro64/av1an-win-script",children:"here"}),". The instructions are in the README file."]}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsxs)(n.p,{children:["The script will download outdated version encoders and tools such as ",(0,t.jsx)(n.code,{children:"aom-av1-psy"})," and MKVToolNix v76.0, if you are fine with these you can proceed."]})}),"\n",(0,t.jsx)(n.h3,{id:"the-manual-way",children:"The Manual Way"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install ",(0,t.jsx)(n.strong,{children:"Python 3.10.x, this will change so consult from the"})," ",(0,t.jsx)(n.a,{href:"http://www.vapoursynth.com/doc/installation.html",children:"Vapoursynth website"})," ",(0,t.jsx)(n.strong,{children:"if you're reading this from the future"})," from ",(0,t.jsx)(n.a,{href:"https://www.python.org/downloads/windows/",children:"here"}),' and select "Windows Installer 64-bit". Upon installation check the tick for adding Python to PATH like so\n',(0,t.jsx)(n.img,{alt:"Python PATH",src:i(8547).A+"",width:"672",height:"417"}),")"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download and install Vapoursynth from ",(0,t.jsx)(n.a,{href:"https://github.com/vapoursynth/vapoursynth/releases",children:"here"}),' and select "VapourSynth64-RXX.exe"']}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Open the terminal and type ",(0,t.jsx)(n.code,{children:"vsrepo.py install lsmas ffms2"})," to install some plugins for Av1an to work."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download MKVToolNix from ",(0,t.jsx)(n.a,{href:"https://mkvtoolnix.download/downloads.html#windows",children:"here"}),', select "mkvtoolnix-64bit-XX.X.X-setup.exe", and install ',(0,t.jsx)(n.strong,{children:"(Also available on winget!)"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download Av1an from ",(0,t.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases",children:"here"}),' (SELECT LATEST AND CLICK THE "ASSETS" DROPDOWN)']}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download ",(0,t.jsx)(n.strong,{children:"shared libraries"})," FFmpeg from ",(0,t.jsx)(n.a,{href:"https://www.gyan.dev/ffmpeg/builds",children:"gyan.dev"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download a pre-built fork of Aomenc (",(0,t.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging",children:"aom-av1-lavish"}),") which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows ",(0,t.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"here"})," ",(0,t.jsx)(n.em,{children:"(Current as of Sept 6, 2023)"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["If you opt to compile aomenc yourself, you can view the instructions on how to do that ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc/#installation",children:"here"}),"."]})}),"\n",(0,t.jsxs)(n.ol,{start:"8",children:["\n",(0,t.jsxs)(n.li,{children:["Move Av1an, FFmpeg ",(0,t.jsx)(n.strong,{children:"(Including the FFmpeg DLLs)"}),", and aomenc to somewhere preferable, eg ",(0,t.jsx)(n.code,{children:"C:\\Encoding"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Add the folder ",(0,t.jsx)(n.strong,{children:"AND MKVTOOLNIX INSTALLATION FOLDER"})," to the ",(0,t.jsx)(n.a,{href:"https://www.maketecheasier.com/what-is-the-windows-path/",children:"Windows PATH environment"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"macos",children:"macOS"}),"\n",(0,t.jsx)(n.p,{children:"macOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend."}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Homebrew + Macports for Av1an + rav1e:"}),"\n",(0,t.jsxs)(n.em,{children:["Note that some commands may have to be run with ",(0,t.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]})]}),"\n",(0,t.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["As is installing MacPorts. Install the relevent ",(0,t.jsx)(n.code,{children:".pkg"})," for your macOS version from the MacPorts Project website:\n",(0,t.jsx)(n.a,{href:"https://www.macports.org/install.php",children:"www.macports.org/install.php"})]}),"\n",(0,t.jsx)(n.p,{children:"Now, you can run the following commands:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install rav1e aom mkvtoolnix ffmpeg\n# Usually you must run MacPorts commands for package installations as root\nport upgrade outdated\nport install av1an\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This is the easiest way to get everything set up & working to produce AV1 video with ",(0,t.jsx)(n.code,{children:"rav1e"})," or mainline ",(0,t.jsx)(n.code,{children:"aomenc"})," & Av1an. You can check that things are installed by running the following commands & parsing their output:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"% av1an --version\nav1an 0.4.1-unstable (rev e10880d) (Release)\n\n* Compiler\n rustc 1.70.0 (LLVM 16.0)\n\n* Target Triple\n aarch64-apple-darwin\n\n* Date Info\n Commit Date: 2023-06-25\n\n* VapourSynth Plugins\n systems.innocent.lsmas : Not found\n com.vapoursynth.ffms2 : Not found\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'% rav1e --version | grep "release" -C 1\nrav1e 0.6.6 () (release)\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\n'})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'% aomenc --help | grep "AOMedia" -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\n\n Use --codec to switch to a non-default encoder.\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Notice ",(0,t.jsx)(n.code,{children:"systems.innocent.lsmas : Not found"})," in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through ",(0,t.jsx)(n.code,{children:"-m hybrid"}),". This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'av1an -i "input" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v " --tiles 8 -s 4 --quantizer 80 --no-scene-detection" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o "output.mkv"\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Building From Source"})}),"\n",(0,t.jsx)(n.p,{children:"If you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,t.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,t.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Homebrew installs ",(0,t.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from ",(0,t.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,t.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,t.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,t.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example."}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'brew install git rust nasm\ngit clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\ncd .. && cd target/release\ncp av1an /usr/local/bin\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"More Difficult: Building aom-av1-lavish from Source"})}),"\n",(0,t.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until Clybius merges ",(0,t.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Add the line ",(0,t.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,t.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,t.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,t.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,t.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,t.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the ",(0,t.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root:\nmake install\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Now you can run ",(0,t.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,t.jsx)(n.code,{children:"aomenc"})," executable to ",(0,t.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,t.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,t.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Notice how it says ",(0,t.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,t.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below."]}),"\n",(0,t.jsx)(n.h2,{id:"linux",children:"Linux"}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsx)(n.p,{children:"Yet again, try using Arch. It's way easier."})}),"\n",(0,t.jsx)(n.h3,{id:"the-gui-way-1",children:"The GUI Way"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato/aviator",children:"Aviator"})," (",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"})," + ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/FFmpeg",children:"FFmpeg"}),") or ",(0,t.jsx)(n.a,{href:"https://giannirosato.com/blog/post/aviator-1/",children:"rAV1ator"})," basically same thing but ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an.mdx",children:"Av1an"})," + ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"}),". Both are only available as ",(0,t.jsx)(n.a,{href:"https://beta.flathub.org/apps/net.natesales.Aviator",children:"Flatpaks"}),". Keep in mind Aviator ships with ",(0,t.jsx)(n.strong,{children:"SVT-AV1"})," and rAV1ator with ",(0,t.jsx)(n.strong,{children:"rav1e"})," instead of aomenc/AOM-AV1, which I will not be covering here."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"the-tui-way",children:"The TUI Way"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"(Recommended)"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rav1ator-cli"}),", a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See ",(0,t.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation",children:"this page"})," for more info. Can be easily used on any distro."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"the-compiling-route",children:"The Compiling Route"}),"\n",(0,t.jsx)(n.h4,{id:"ubuntu",children:"Ubuntu"}),"\n",(0,t.jsxs)(n.p,{children:["The guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via ",(0,t.jsx)(n.code,{children:"rustup"})," first, as apt version of Rust is severely outdated, then you can continue."]}),"\n",(0,t.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\n"})}),"\n",(0,t.jsx)(n.p,{children:"Install l-smash:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/l-smash/l-smash.git\ncd l-smash\n./configure --enable-shared --extra-cflags="-march=native"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,t.jsx)(n.p,{children:"Install zimg:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone --recursive https://github.com/sekrit-twc/zimg.git\ncd zimg\n./autogen.sh\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,t.jsx)(n.p,{children:"Install ImageMagick:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/ImageMagick/ImageMagick\ncd ImageMagick\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,t.jsx)(n.p,{children:"Install Vapoursynth R63:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'wget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\nunzip R63.zip\ncd vapoursynth-R63\n./autogen.sh\n./configure CFLAGS="-march=native" CXXFLAGS="-march=native" --libdir=/usr/lib\nmake -j$(nproc)\nsudo make install\nsudo mkdir /usr/lib/vapoursynth\nsudo ldconfig\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The plugin directory will be located in ",(0,t.jsx)(n.code,{children:"/usr/lib/vapoursynth"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Install L-SMASH-Works Vapoursynth Plugin:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args="-march=native" -Dcpp_args="-march=native"\nninja -j$(nproc)\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"danger",children:(0,t.jsxs)(n.p,{children:["L-SMASH-Works doesn't work on ",(0,t.jsx)(n.strong,{children:"aarch64"}),", it is recommended to use other plugins instead."]})}),"\n",(0,t.jsx)(n.p,{children:"Install FFMS2 Vapoursynth Plugin:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/FFMS/ffms2\ncd ffms2\n./autogen.sh\n./configure CFLAGS="-O3 -march=native" CXXFLAGS="-O3 -march=native"\nmake -j$(nproc)\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\n'})}),"\n",(0,t.jsx)(n.p,{children:"Install Av1an:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\nsudo cp target/release/av1an /usr/local/bin\n'})}),"\n",(0,t.jsxs)(n.p,{children:["When there's no errors, proceed to compiling ",(0,t.jsx)(n.code,{children:"aom-av1-lavish"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"arch",children:"Arch"}),"\n",(0,t.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\n"})}),"\n",(0,t.jsx)(n.p,{children:"you're done, proceed."}),"\n",(0,t.jsx)(n.h4,{id:"compiling-aom-av1-lavish",children:"Compiling aom-av1-lavish"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,t.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsxs)(n.p,{children:["The moment you've all been waiting for, let's just get into it. Here's an example ",(0,t.jsx)(n.em,{children:"recommended"})," parameter as of now (09/03/23) [MM/DD/YY]:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'av1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a " -an " -f " -an " -v " --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 " -o "output.mkv"\n'})}),"\n",(0,t.jsx)(n.admonition,{title:"Parameter Meta",type:"info",children:(0,t.jsxs)(n.p,{children:["It is strongly recommended to join the ",(0,t.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general."]})}),"\n",(0,t.jsx)(n.p,{children:"Now let's dissect it one-by-one"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Av1an parameters:"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"-i"})," Input."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"-x 300"})," Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"-w 4"}),' Specifies the amount of "workers" or amount of encoders working on the video.']}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--verbose"})," Sets logging to verbose."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--resume"})," Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \"resumed\" without the parameter in place."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"-e aom"})," Specifies we're using aomenc encoder which should be the default option."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"-c mkvmerge"})," Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"-m lsmash"})," Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:'-f " -an "'})," ",(0,t.jsx)(n.code,{children:"-f"})," Stands for ffmpeg parameters, ",(0,t.jsx)(n.code,{children:"-an"})," is to remove all audio since its better to encode and merge it separately. To crop use ",(0,t.jsx)(n.code,{children:'-f " -an -vf crop=1920:800 "'})," for example to crop the video to 1920x800."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:'-v " "'})," Is where you put the encoder's parameters in."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:'-a " -an "'})," FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: ",(0,t.jsx)(n.code,{children:'-a " -c:a libopus -b:a 128k "'}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--photon-noise=10"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--set-thread-affinity=2"})," Pins the thread to the encoder, aligns with ",(0,t.jsx)(n.code,{children:"--threads=2"})," in the encoder parameter so set them accordingly."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"aomenc parameters:"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because it makes the video smaller and reduces ",(0,t.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring",children:"banding"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--threads=2"})," Sets the amount of threads the encoder can use, aligns with ",(0,t.jsx)(n.code,{children:"--set-thread-affinity"})," in Av1an."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)("picture",{children:[(0,t.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,t.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",width:"1280",height:"768",loading:"lazy"})]}),"\n",(0,t.jsx)(n.admonition,{title:"Tile usage",type:"note",children:(0,t.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,t.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,t.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,t.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)"]})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,t.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--aq-mode"})," adaptive quantization mode, 0 is better most of the time"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{title:"Tunes to use",type:"info",children:(0,t.jsxs)(n.p,{children:["Set ",(0,t.jsx)(n.code,{children:"tune-content"})," to ",(0,t.jsx)(n.code,{children:"animation"})," if you're encoding above ",(0,t.jsx)(n.code,{children:"cq-level=30"})," A.K.A lower quality, despite it's name\nSet ",(0,t.jsx)(n.code,{children:"tune-content"})," to ",(0,t.jsx)(n.code,{children:"psy"})," for everything else, ",(0,t.jsxs)(n.strong,{children:["do not use if you encode above ",(0,t.jsx)(n.code,{children:"cq-level=30"})]}),"\nFor ",(0,t.jsx)(n.code,{children:"tune"}),", this is a bit tricky. For now, the meta seems to be ",(0,t.jsx)(n.code,{children:"ssim"}),", but back then it was ",(0,t.jsx)(n.code,{children:"lavish"})," which is considered THE best tune because it's based on ",(0,t.jsx)(n.a,{href:"https://github.com/google/butteraugli",children:"butteraugli"}),". Now it's fallen behind because its more blurry than ",(0,t.jsx)(n.code,{children:"ssim"}),", and before that it was ",(0,t.jsx)(n.code,{children:"butteraugli"}),", and then ",(0,t.jsx)(n.code,{children:"ipq_vmaf_psy"}),", and finally just ",(0,t.jsx)(n.code,{children:"ipq"}),".\nIf you use any of the VMAF tunes, ",(0,t.jsxs)(n.strong,{children:["you need to specify ",(0,t.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put it"]}),"."]})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--deltaq-mode"})," set to 0 because its just better."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause ",(0,t.jsx)(n.strong,{children:"Av1an already did scene detection, so we wont have to."}),". And it speeds things up."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1"})," Parameters that give you free efficiency boost."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{title:"Concatenation Error on Linux",type:"info",children:(0,t.jsxs)(n.p,{children:["Run ",(0,t.jsx)(n.code,{children:"ulimit -n 200000"}),", resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ",(0,t.jsx)(n.code,{children:"mkvmerge @../options.json"})]})}),"\n",(0,t.jsx)(n.h2,{id:"merging-everything",children:"Merging Everything"}),"\n",(0,t.jsxs)(n.p,{children:["Once you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into ",(0,t.jsx)(n.code,{children:"mp4"}),", just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental."]}),"\n",(0,t.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--denoise-noise-level=10"})," Alternative to ",(0,t.jsx)(n.code,{children:"photon-noise"}),", slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and ",(0,t.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"final-thoughts",children:"Final Thoughts"}),"\n",(0,t.jsx)(n.p,{children:'Encoding has always been about experimentation for the best, there is really no "One size fits all" for encoding content, as they differ from scene complexity, how it\'s captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!'}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.strong,{children:["Guide originally hosted on ",(0,t.jsx)(n.a,{href:"https://rentry.co/AV1",children:"https://rentry.co/AV1"}),", rewrite and migration by Simulping."]})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1679:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/compare-guide-6feb966fbd9d73be4a3097c41691c4ad.webp"},8547:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/python-path-a89fc4fe6c6eb4c2ea0a7610dd2cf09a.webp"},8453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var s=i(6540);const t={},o=s.createContext(t);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(o.Provider,{value:n},e.children)}},7233:e=>{e.exports=JSON.parse('{"permalink":"/blog/av1-encoding-for-dummies","source":"@site/blog/2023-09-03-av1-for-dummies.mdx","title":"AV1 Encoding for Dummies","description":"This guide will show you how to encode in AV1 the *right* and *optimal* way.","date":"2023-09-03T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"}],"readingTime":16.09,"hasTruncateMarker":true,"authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4","socials":{},"key":null,"page":null},{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"AV1 Encoding for Dummies","description":"This guide will show you how to encode in AV1 the *right* and *optimal* way.","slug":"av1-encoding-for-dummies","authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"},{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"}],"tags":["video","compression"],"image":"/img/compare-guide.webp","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Embedding the Un-Embeddable","permalink":"/blog/embedding-the-un-embeddable"},"nextItem":{"title":"Reducing Image Load Online","permalink":"/blog/site-optimization"}}')}}]); \ No newline at end of file diff --git a/assets/js/7fa695a7.4039b6b8.js b/assets/js/7fa695a7.4039b6b8.js deleted file mode 100644 index 93fd282b1..000000000 --- a/assets/js/7fa695a7.4039b6b8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1363],{6046:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=n(4848),t=n(8453);const r={title:"GIF",sidebar_position:3},o="GIF",a={id:"images/GIF",title:"GIF",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/GIF.mdx",sourceDirName:"images",slug:"/images/GIF",permalink:"/docs/images/GIF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/GIF.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"GIF",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"PNG",permalink:"/docs/images/PNG"},next:{title:"HEIC",permalink:"/docs/images/HEIC"}},c={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2}];function l(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"gif",children:"GIF"})}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(i.p,{children:["Graphics Interchange Format (GIF) is an image file format first released by CompuServe in 1987. It remains popular due to it's widespread support for animated images despite its obsolete efficency. Other animated image formats like Animated ",(0,s.jsx)(i.a,{href:"/docs/images/AVIF",children:"AVIF"})," & Animated ",(0,s.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"})," have since surpassed GIF in functionality, as has the animated ",(0,s.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"})," variant APNG."]}),"\n",(0,s.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,s.jsxs)(i.p,{children:["Lossless? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Lossy? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Supported Bit Depth:\n",(0,s.jsx)(i.em,{children:"256 colors"})]}),"\n",(0,s.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Animation? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Transparency? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Progressive Decode? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Royalty Free? ",(0,s.jsx)(i.em,{children:"Yes"})]})]})}function m(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>a});var s=n(6540);const t={},r=s.createContext(t);function o(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7fa695a7.ac5844c6.js b/assets/js/7fa695a7.ac5844c6.js new file mode 100644 index 000000000..1e2e37b22 --- /dev/null +++ b/assets/js/7fa695a7.ac5844c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1363],{3358:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"images/GIF","title":"GIF","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/images/GIF.mdx","sourceDirName":"images","slug":"/images/GIF","permalink":"/docs/images/GIF","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/GIF.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"GIF","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"PNG","permalink":"/docs/images/PNG"},"next":{"title":"HEIC","permalink":"/docs/images/HEIC"}}');var t=s(4848),r=s(8453);const o={title:"GIF",sidebar_position:3},a="GIF",c={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2}];function l(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"gif",children:"GIF"})}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(i.p,{children:["Graphics Interchange Format (GIF) is an image file format first released by CompuServe in 1987. It remains popular due to it's widespread support for animated images despite its obsolete efficency. Other animated image formats like Animated ",(0,t.jsx)(i.a,{href:"/docs/images/AVIF",children:"AVIF"})," & Animated ",(0,t.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"})," have since surpassed GIF in functionality, as has the animated ",(0,t.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"})," variant APNG."]}),"\n",(0,t.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,t.jsxs)(i.p,{children:["Lossless? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Lossy? ",(0,t.jsx)(i.em,{children:"No"})]}),"\n",(0,t.jsxs)(i.p,{children:["Supported Bit Depth:\n",(0,t.jsx)(i.em,{children:"256 colors"})]}),"\n",(0,t.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,t.jsx)(i.em,{children:"No"})]}),"\n",(0,t.jsxs)(i.p,{children:["Animation? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Transparency? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Progressive Decode? ",(0,t.jsx)(i.em,{children:"No"})]}),"\n",(0,t.jsxs)(i.p,{children:["Royalty Free? ",(0,t.jsx)(i.em,{children:"Yes"})]})]})}function m(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>o,x:()=>a});var n=s(6540);const t={},r=n.createContext(t);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80447496.2ec80bc4.js b/assets/js/80447496.2ec80bc4.js deleted file mode 100644 index 50d94c212..000000000 --- a/assets/js/80447496.2ec80bc4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7715],{6520:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var n=t(4848),o=t(8453);const r={title:"VVC / H.266",sidebar_position:3},s="H.266",c={id:"video/VVC",title:"VVC / H.266",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VVC.mdx",sourceDirName:"video",slug:"/video/VVC",permalink:"/docs/video/VVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VVC.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"VVC / H.266",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"HEVC / H.265",permalink:"/docs/video/HEVC"},next:{title:"VP8",permalink:"/docs/video/VP8"}},d={},a=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"h266",children:"H.266"})}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(i.p,{children:["H.266, or VVC (Versatile Video Coding), is a codec standardized in 2020 by the Joint Video Experts Team (JVET). It succeeds ",(0,n.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", and claims to be 40% more efficient. In practice, it is currently about as efficient as ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," when using the ",(0,n.jsx)(i.a,{href:"/docs/encoders/VVenC",children:"VVenC"})," encoder, although it is inherently a more complex format which means it will be more difficult to decode. It is encumbered by royalties."]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," 7.0 released in April 2024 comes with native VVC decoder."]})]})}function u(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>c});var n=t(6540);const o={},r=n.createContext(o);function s(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80447496.ea6304c4.js b/assets/js/80447496.ea6304c4.js new file mode 100644 index 000000000..6699d8eb5 --- /dev/null +++ b/assets/js/80447496.ea6304c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7715],{6594:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"video/VVC","title":"VVC / H.266","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/VVC.mdx","sourceDirName":"video","slug":"/video/VVC","permalink":"/docs/video/VVC","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VVC.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"VVC / H.266","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"HEVC / H.265","permalink":"/docs/video/HEVC"},"next":{"title":"VP8","permalink":"/docs/video/VP8"}}');var o=i(4848),s=i(8453);const r={title:"VVC / H.266",sidebar_position:3},c="H.266",d={},a=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"h266",children:"H.266"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(t.p,{children:["H.266, or VVC (Versatile Video Coding), is a codec standardized in 2020 by the Joint Video Experts Team (JVET). It succeeds ",(0,o.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"}),", and claims to be 40% more efficient. In practice, it is currently about as efficient as ",(0,o.jsx)(t.a,{href:"/docs/video/AV1",children:"AV1"})," when using the ",(0,o.jsx)(t.a,{href:"/docs/encoders/VVenC",children:"VVenC"})," encoder, although it is inherently a more complex format which means it will be more difficult to decode. It is encumbered by royalties."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," 7.0 released in April 2024 comes with native VVC decoder."]})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>c});var n=i(6540);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80bfa96b.cd5df282.js b/assets/js/80bfa96b.cd5df282.js new file mode 100644 index 000000000..07ea06b64 --- /dev/null +++ b/assets/js/80bfa96b.cd5df282.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2901],{7261:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"resources","title":"Resources","description":"Encoding resources that you might find useful.","source":"@site/docs/resources.mdx","sourceDirName":".","slug":"/resources","permalink":"/docs/resources","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/resources.mdx","tags":[],"version":"current","sidebarPosition":12,"frontMatter":{"title":"Resources","sidebar_label":"\ud83d\uddc3\ufe0f Resources","sidebar_position":12},"sidebar":"tutorialSidebar","previous":{"title":"\u25b6\ufe0f Video Players","permalink":"/docs/video-players"},"next":{"title":"\u2712\ufe0f Contribution Guide","permalink":"/docs/contribution-guide"}}');var i=s(4848),o=s(8453);const r={title:"Resources",sidebar_label:"\ud83d\uddc3\ufe0f Resources",sidebar_position:12},c="Resources",d={},a=[];function u(e){const t={a:"a",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"resources",children:"Resources"})}),"\n",(0,i.jsx)(t.p,{children:"Encoding resources that you might find useful."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://guide.encode.moe",children:"https://guide.encode.moe"})," - Filtering and fansubbing."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://lvsfunc.encode.moe/en/latest",children:"https://lvsfunc.encode.moe/en/latest"})," - lvsfunc documentation."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://silentaperture.gitlab.io/mdbook-guide/introduction.html",children:"https://silentaperture.gitlab.io/mdbook-guide/introduction.html"})," - SilentAperture's Advanced Encoding guide, mostly about filtering."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://x265.readthedocs.io/en/master",children:"https://x265.readthedocs.io/en/master"})," - x265 technical documentation, made by MulticoreWare themselves."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"http://www.chaneru.com/Roku/HLS/X264_Settings.htm",children:"http://www.chaneru.com/Roku/HLS/X264_Settings.htm"})," - x264 settings."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac",children:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac"})," - Anime encoding guide by Kokomins. Has some pretty good advices regarding psychovisual stuff and x265."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://wiki.xiph.org/Main_Page",children:"https://wiki.xiph.org/Main_Page"})," - Xiph Wiki."]}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>c});var n=s(6540);const i={},o=n.createContext(i);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80bfa96b.e5d4b132.js b/assets/js/80bfa96b.e5d4b132.js deleted file mode 100644 index 3eed5ed60..000000000 --- a/assets/js/80bfa96b.e5d4b132.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2901],{9340:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>o,metadata:()=>c,toc:()=>a});var s=n(4848),i=n(8453);const o={title:"Resources",sidebar_label:"\ud83d\uddc3\ufe0f Resources",sidebar_position:12},r="Resources",c={id:"resources",title:"Resources",description:"Encoding resources that you might find useful.",source:"@site/docs/resources.mdx",sourceDirName:".",slug:"/resources",permalink:"/docs/resources",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/resources.mdx",tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"Resources",sidebar_label:"\ud83d\uddc3\ufe0f Resources",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"\u25b6\ufe0f Video Players",permalink:"/docs/video-players"},next:{title:"\u2712\ufe0f Contribution Guide",permalink:"/docs/contribution-guide"}},d={},a=[];function u(e){const t={a:"a",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"resources",children:"Resources"})}),"\n",(0,s.jsx)(t.p,{children:"Encoding resources that you might find useful."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://guide.encode.moe",children:"https://guide.encode.moe"})," - Filtering and fansubbing."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://lvsfunc.encode.moe/en/latest",children:"https://lvsfunc.encode.moe/en/latest"})," - lvsfunc documentation."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://silentaperture.gitlab.io/mdbook-guide/introduction.html",children:"https://silentaperture.gitlab.io/mdbook-guide/introduction.html"})," - SilentAperture's Advanced Encoding guide, mostly about filtering."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://x265.readthedocs.io/en/master",children:"https://x265.readthedocs.io/en/master"})," - x265 technical documentation, made by MulticoreWare themselves."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"http://www.chaneru.com/Roku/HLS/X264_Settings.htm",children:"http://www.chaneru.com/Roku/HLS/X264_Settings.htm"})," - x264 settings."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac",children:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac"})," - Anime encoding guide by Kokomins. Has some pretty good advices regarding psychovisual stuff and x265."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://wiki.xiph.org/Main_Page",children:"https://wiki.xiph.org/Main_Page"})," - Xiph Wiki."]}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>c});var s=n(6540);const i={},o=s.createContext(i);function r(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/814f3328.39af2631.js b/assets/js/814f3328.39af2631.js new file mode 100644 index 000000000..0fdc5f1cd --- /dev/null +++ b/assets/js/814f3328.39af2631.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Better late than never: SVT-AV1 v2.2.x Deep Dive","permalink":"/blog/svt-av1-third-deep-dive","unlisted":false,"date":"2024-11-14T00:00:00.000Z"},{"title":"Codec Wiki: One Year Later","permalink":"/blog/codec-wiki-one-year-later","unlisted":false,"date":"2024-07-20T00:00:00.000Z"},{"title":"AV1 for Dummies","permalink":"/blog/av1-for-dummies","unlisted":false,"date":"2024-06-24T00:00:00.000Z"},{"title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","permalink":"/blog/svt-av1-second-deep-dive","unlisted":false,"date":"2024-05-19T00:00:00.000Z"},{"title":"Encoding Animation with SVT-AV1: A Deep Dive","permalink":"/blog/svt-av1-deep-dive","unlisted":false,"date":"2023-12-30T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.ba8e6fdd.js b/assets/js/814f3328.ba8e6fdd.js deleted file mode 100644 index 228471184..000000000 --- a/assets/js/814f3328.ba8e6fdd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Codec Wiki: One Year Later","permalink":"/blog/codec-wiki-one-year-later","unlisted":false,"date":"2024-07-20T00:00:00.000Z"},{"title":"AV1 for Dummies","permalink":"/blog/av1-for-dummies","unlisted":false,"date":"2024-06-24T00:00:00.000Z"},{"title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","permalink":"/blog/svt-av1-second-deep-dive","unlisted":false,"date":"2024-05-19T00:00:00.000Z"},{"title":"Encoding Animation with SVT-AV1: A Deep Dive","permalink":"/blog/svt-av1-deep-dive","unlisted":false,"date":"2023-12-30T00:00:00.000Z"},{"title":"Embedding the Un-Embeddable","permalink":"/blog/embedding-the-un-embeddable","unlisted":false,"date":"2023-10-29T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/81739261.b57112ee.js b/assets/js/81739261.b57112ee.js new file mode 100644 index 000000000..e8fe08638 --- /dev/null +++ b/assets/js/81739261.b57112ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4794],{6500:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"video/prores","title":"ProRes","description":"ProRes is a family of lossy video compression codecs developed by Apple Inc. ProRes is designed to serve as a high-quality \\"visually lossless\\" video editing codec that offers superior image quality compared to many other editing codecs while still maintaining a relatively compact file size compared to uncompressed video.","source":"@site/docs/video/prores.mdx","sourceDirName":"video","slug":"/video/prores","permalink":"/docs/video/prores","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/prores.mdx","tags":[],"version":"current","sidebarPosition":14,"frontMatter":{"title":"ProRes","sidebar_position":14},"sidebar":"tutorialSidebar","previous":{"title":"UT Video","permalink":"/docs/video/utvideo"},"next":{"title":"ECM","permalink":"/docs/video/ECM"}}');var r=t(4848),n=t(8453);const o={title:"ProRes",sidebar_position:14},d="ProRes",a={},l=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Usage",id:"usage",level:2}];function c(e){const i={a:"a",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"prores",children:"ProRes"})}),"\n",(0,r.jsx)(i.p,{children:'ProRes is a family of lossy video compression codecs developed by Apple Inc. ProRes is designed to serve as a high-quality "visually lossless" video editing codec that offers superior image quality compared to many other editing codecs while still maintaining a relatively compact file size compared to uncompressed video.'}),"\n",(0,r.jsxs)(i.p,{children:["ProRes uses 4:2:2 or 4:4:4 chroma subsampling depending on the specific subset. This provides greater color fidelity and precision than typical 8-bit 4:2:0 codecs like what can commonly be seen with ",(0,r.jsx)(i.a,{href:"/docs/video/AVC",children:"AVC"}),"."]}),"\n",(0,r.jsxs)(i.p,{children:["ProRes compression uses the ",(0,r.jsx)(i.a,{href:"/docs/introduction/terminology#discrete-cosine-transform-dct",children:"Discrete Cosine Transform"})," and intra-frame compression techniques; there is no inter-frame compression applied, meaning redundancy between frames isn't utilized to increase compression efficiency; this keeps decoding light, and simplifies the codec. ProRes is able to achieve very high quality video with relatively low data rates around 100-400 MB/s depending on the resolution and specific ProRes variant."]}),"\n",(0,r.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,r.jsx)(i.p,{children:"There are multiple variants of ProRes that offer different combinations of image quality and compression ratios:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Format"}),(0,r.jsx)(i.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,r.jsx)(i.th,{style:{textAlign:"right"},children:"Supported Bit Depth(s)"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:(0,r.jsx)(i.a,{href:"https://www.apple.com/final-cut-pro/docs/Apple_ProRes_RAW.pdf",children:"ProRes RAW"})}),(0,r.jsx)(i.td,{style:{textAlign:"center"},children:"N/A"}),(0,r.jsx)(i.td,{style:{textAlign:"right"},children:"12-bit"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"ProRes 4444 XQ"}),(0,r.jsx)(i.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,r.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit, 12-bit*"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"ProRes 4444"}),(0,r.jsx)(i.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,r.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit, 12-bit*"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"ProRes HQ"}),(0,r.jsx)(i.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,r.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"ProRes"}),(0,r.jsx)(i.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,r.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"ProRes LT"}),(0,r.jsx)(i.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,r.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"ProRes Proxy"}),(0,r.jsx)(i.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,r.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit"})]})]})]}),"\n",(0,r.jsxs)(i.p,{children:["*",(0,r.jsx)(i.em,{children:"ProRes 4444 XQ and 4444 support 12-bit color depth, but the lossless alpha channel is 16-bit if included."})]}),"\n",(0,r.jsx)(i.p,{children:"The higher data rate variants like 4444 XQ and HQ prioritize maximum fidelity at the expense of larger file sizes. The lower data rate variants trade off some quality for much smaller file sizes suitable for editing where storage space is constrained."}),"\n",(0,r.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(i.p,{children:"Apple ProRes Raw is available in LUMIX cameras & the Sony Alpha FX3 via Atomos Ninja V. Both cameras are capable of recording 12-bit uncompressed RAW video in the ProRes RAW format."}),"\n",(0,r.jsx)(i.p,{children:"ProRes has become widely adopted in professional video post-production workflows due to its quality, performance, metadata handling, and tight integration with Apple's Final Cut Pro editing software & ecosystem."}),"\n",(0,r.jsx)(i.p,{children:"ProRes is supported by most major non-linear editing systems beyond just Final Cut Pro, including Adobe Premiere Pro & BlackMagic's DaVinci Resolve. This cross-platform compatibility makes it a convenient codec for exchange between different video editing applications."}),"\n",(0,r.jsx)(i.p,{children:"While designed primarily as an editing codec, Apple has also implemented hardware acceleration for ProRes encode & decode in recent Mac devices via Apple Silicon starting with the M2 chip. This hardware acceleration enables higher performance for tasks like playback, transcoding, and export compared to software-only implementations."})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>d});var s=t(6540);const r={},n=s.createContext(r);function o(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/81739261.ec5a3f1a.js b/assets/js/81739261.ec5a3f1a.js deleted file mode 100644 index 05dac9cac..000000000 --- a/assets/js/81739261.ec5a3f1a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4794],{2358:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>d,toc:()=>l});var s=t(4848),r=t(8453);const n={title:"ProRes",sidebar_position:14},o="ProRes",d={id:"video/prores",title:"ProRes",description:'ProRes is a family of lossy video compression codecs developed by Apple Inc. ProRes is designed to serve as a high-quality "visually lossless" video editing codec that offers superior image quality compared to many other editing codecs while still maintaining a relatively compact file size compared to uncompressed video.',source:"@site/docs/video/prores.mdx",sourceDirName:"video",slug:"/video/prores",permalink:"/docs/video/prores",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/prores.mdx",tags:[],version:"current",sidebarPosition:14,frontMatter:{title:"ProRes",sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"UT Video",permalink:"/docs/video/utvideo"},next:{title:"ECM",permalink:"/docs/video/ECM"}},a={},l=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Usage",id:"usage",level:2}];function c(e){const i={a:"a",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"prores",children:"ProRes"})}),"\n",(0,s.jsx)(i.p,{children:'ProRes is a family of lossy video compression codecs developed by Apple Inc. ProRes is designed to serve as a high-quality "visually lossless" video editing codec that offers superior image quality compared to many other editing codecs while still maintaining a relatively compact file size compared to uncompressed video.'}),"\n",(0,s.jsxs)(i.p,{children:["ProRes uses 4:2:2 or 4:4:4 chroma subsampling depending on the specific subset. This provides greater color fidelity and precision than typical 8-bit 4:2:0 codecs like what can commonly be seen with ",(0,s.jsx)(i.a,{href:"/docs/video/AVC",children:"AVC"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["ProRes compression uses the ",(0,s.jsx)(i.a,{href:"/docs/introduction/terminology#discrete-cosine-transform-dct",children:"Discrete Cosine Transform"})," and intra-frame compression techniques; there is no inter-frame compression applied, meaning redundancy between frames isn't utilized to increase compression efficiency; this keeps decoding light, and simplifies the codec. ProRes is able to achieve very high quality video with relatively low data rates around 100-400 MB/s depending on the resolution and specific ProRes variant."]}),"\n",(0,s.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,s.jsx)(i.p,{children:"There are multiple variants of ProRes that offer different combinations of image quality and compression ratios:"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Format"}),(0,s.jsx)(i.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,s.jsx)(i.th,{style:{textAlign:"right"},children:"Supported Bit Depth(s)"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"https://www.apple.com/final-cut-pro/docs/Apple_ProRes_RAW.pdf",children:"ProRes RAW"})}),(0,s.jsx)(i.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(i.td,{style:{textAlign:"right"},children:"12-bit"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"ProRes 4444 XQ"}),(0,s.jsx)(i.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit, 12-bit*"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"ProRes 4444"}),(0,s.jsx)(i.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit, 12-bit*"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"ProRes HQ"}),(0,s.jsx)(i.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"ProRes"}),(0,s.jsx)(i.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"ProRes LT"}),(0,s.jsx)(i.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"ProRes Proxy"}),(0,s.jsx)(i.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(i.td,{style:{textAlign:"right"},children:"10-bit"})]})]})]}),"\n",(0,s.jsxs)(i.p,{children:["*",(0,s.jsx)(i.em,{children:"ProRes 4444 XQ and 4444 support 12-bit color depth, but the lossless alpha channel is 16-bit if included."})]}),"\n",(0,s.jsx)(i.p,{children:"The higher data rate variants like 4444 XQ and HQ prioritize maximum fidelity at the expense of larger file sizes. The lower data rate variants trade off some quality for much smaller file sizes suitable for editing where storage space is constrained."}),"\n",(0,s.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(i.p,{children:"Apple ProRes Raw is available in LUMIX cameras & the Sony Alpha FX3 via Atomos Ninja V. Both cameras are capable of recording 12-bit uncompressed RAW video in the ProRes RAW format."}),"\n",(0,s.jsx)(i.p,{children:"ProRes has become widely adopted in professional video post-production workflows due to its quality, performance, metadata handling, and tight integration with Apple's Final Cut Pro editing software & ecosystem."}),"\n",(0,s.jsx)(i.p,{children:"ProRes is supported by most major non-linear editing systems beyond just Final Cut Pro, including Adobe Premiere Pro & BlackMagic's DaVinci Resolve. This cross-platform compatibility makes it a convenient codec for exchange between different video editing applications."}),"\n",(0,s.jsx)(i.p,{children:"While designed primarily as an editing codec, Apple has also implemented hardware acceleration for ProRes encode & decode in recent Mac devices via Apple Silicon starting with the M2 chip. This hardware acceleration enables higher performance for tasks like playback, transcoding, and export compared to software-only implementations."})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>d});var s=t(6540);const r={},n=s.createContext(r);function o(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/83732ada.0732b040.js b/assets/js/83732ada.0732b040.js deleted file mode 100644 index fe72bff11..000000000 --- a/assets/js/83732ada.0732b040.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6840],{3387:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>d,toc:()=>a});var o=t(4848),n=t(8453);const s={title:"HEVC / H.265",sidebar_position:2},r="H.265",d={id:"video/HEVC",title:"HEVC / H.265",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/HEVC.mdx",sourceDirName:"video",slug:"/video/HEVC",permalink:"/docs/video/HEVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/HEVC.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"HEVC / H.265",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"AVC / H.264",permalink:"/docs/video/AVC"},next:{title:"VVC / H.266",permalink:"/docs/video/VVC"}},c={},a=[];function u(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"h265",children:"H.265"})}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(i.p,{children:["H.265, also known as High-Efficiency Video Coding (HEVC), is a video compression standard designed to deliver higher-quality videos with reduced file sizes. It is a successor to the ",(0,o.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"})," codec and was developed to address the increasing demand for efficient and high-quality video compression, particularly in the context of 4K content. This codec is encumbered by royalties."]})]})}function l(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>d});var o=t(6540);const n={},s=o.createContext(n);function r(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/83732ada.1017b5ad.js b/assets/js/83732ada.1017b5ad.js new file mode 100644 index 000000000..7d526fb1e --- /dev/null +++ b/assets/js/83732ada.1017b5ad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6840],{4167:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>r,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"video/HEVC","title":"HEVC / H.265","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/HEVC.mdx","sourceDirName":"video","slug":"/video/HEVC","permalink":"/docs/video/HEVC","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/HEVC.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"HEVC / H.265","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"AVC / H.264","permalink":"/docs/video/AVC"},"next":{"title":"VVC / H.266","permalink":"/docs/video/VVC"}}');var n=i(4848),s=i(8453);const r={title:"HEVC / H.265",sidebar_position:2},d="H.265",c={},a=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"h265",children:"H.265"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(t.p,{children:["H.265, also known as High-Efficiency Video Coding (HEVC), is a video compression standard designed to deliver higher-quality videos with reduced file sizes. It is a successor to the ",(0,n.jsx)(t.a,{href:"/docs/video/AVC",children:"H.264"})," codec and was developed to address the increasing demand for efficient and high-quality video compression, particularly in the context of 4K content. This codec is encumbered by royalties."]})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>d});var o=i(6540);const n={},s=o.createContext(n);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/841b1305.347f21bf.js b/assets/js/841b1305.347f21bf.js new file mode 100644 index 000000000..f0222376b --- /dev/null +++ b/assets/js/841b1305.347f21bf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9939],{4429:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"encoders/uavs3e","title":"uavs3e","description":"uavs3e is an open-source encoder for the AVS3 codec, developed by Chinese research institutions including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation.","source":"@site/docs/encoders/uavs3e.mdx","sourceDirName":"encoders","slug":"/encoders/uavs3e","permalink":"/docs/encoders/uavs3e","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/uavs3e.mdx","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"uavs3e","sidebar_position":20,"keywords":["avs3","encoding","video encoding"]},"sidebar":"tutorialSidebar","previous":{"title":"aom-psy101","permalink":"/docs/encoders/aom-psy101"},"next":{"title":"NVENC","permalink":"/docs/encoders_hw/nvenc"}}');var r=s(4848),i=s(8453),a=s(1470),o=s(9365);const l={title:"uavs3e",sidebar_position:20,keywords:["avs3","encoding","video encoding"]},c="uavs3e",u={},d=[{value:"Installation",id:"installation",level:2},{value:"10-bit Support",id:"10-bit-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Notes",id:"notes",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"uavs3e",children:"uavs3e"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/",children:"uavs3e"})," is an open-source encoder for the ",(0,r.jsx)(n.a,{href:"/docs/video/AVS3",children:"AVS3"})," codec, developed by Chinese research institutions including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation."]}),"\n",(0,r.jsx)(n.p,{children:"The encoder receives infrequent updates, which may result in bugs and compilation issues. It supports AMD64 with AVX2, ARM with NEON, and LoongArch CPUs."}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(a.A,{children:[(0,r.jsxs)(o.A,{value:"unixlike",label:"Linux & macOS",children:[(0,r.jsxs)(n.p,{children:["The developers do not provide pre-built binaries, so you'll need to compile it yourself. Compilation requires GNU Make and CMake. As of August 2024, ",(0,r.jsx)(n.code,{children:"uavs3e"})," does not compile with GCC 14, using Clang 18 instead resolves this issue."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/uavs3/uavs3e.git\ncd uavs3e\nmkdir build/linux && cd build/linux\ncmake ../.. -DCOMPILE_10BIT=0 -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++\nmake -j 8\n"})}),(0,r.jsxs)(n.p,{children:["If you encounter undefined calls to ",(0,r.jsx)(n.code,{children:"close"})," or ",(0,r.jsx)(n.code,{children:"lseek64"})," functions, add the following two lines at the top of the ",(0,r.jsx)(n.code,{children:"test/utest.c"})," file:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c",children:"#define _LARGEFILE64_SOURCE\n#include \n"})}),(0,r.jsxs)(n.p,{children:["Binaries will be available in the ",(0,r.jsx)(n.code,{children:"build/linux"})," folder. On Linux, you can run ",(0,r.jsx)(n.code,{children:"make install"})," to install the encoder (may require elevated permissions)."]})]}),(0,r.jsxs)(o.A,{value:"windows",label:"Windows",children:[(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Ensure you have the following prerequisites installed before starting the build process:"}),"\n"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://visualstudio.microsoft.com/visual-cpp-build-tools/",children:"Microsoft C++ Build Tools"}),': Select "Desktop development with C++".']}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://git-scm.com/download/win",children:"Git"})}),"\n"]}),(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Open Developer PowerShell for VS 2022."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Run the following commands:"}),"\n"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/uavs3/uavs3e.git\ncd uavs3e\n.\\version.bat\ncd build\\x86_windows\ndevenv uavs3e.sln /Upgrade\nmsbuild uavs3e.sln /p:Configuration=Release /p:WindowsTargetPlatformVersion=10.0\n"})}),(0,r.jsxs)(n.p,{children:["Binaries will be available in the ",(0,r.jsx)(n.code,{children:"bin"})," folder."]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"10-bit-support",children:"10-bit Support"}),"\n",(0,r.jsxs)(a.A,{children:[(0,r.jsx)(o.A,{value:"unixlike",label:"Linux & macOS",children:(0,r.jsxs)(n.p,{children:["To enable 10-bit support, set ",(0,r.jsx)(n.code,{children:"-DCOMPILE_10BIT=1"})," in the CMake command. However, the encoder compiled with this flag has been reported to cause ",(0,r.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/issues/53",children:"segmentation faults"})," on some systems."]})}),(0,r.jsx)(o.A,{value:"windows",label:"Windows",children:(0,r.jsxs)(n.p,{children:["To enable 10-bit support, change the line ",(0,r.jsx)(n.code,{children:"#define COMPILE_10BIT 0"})," to ",(0,r.jsx)(n.code,{children:"#define COMPILE_10BIT 1"})," in the ",(0,r.jsx)(n.code,{children:"inc/com_api.h"})," file."]})})]}),"\n",(0,r.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsxs)(n.p,{children:["The encoder cannot parse ",(0,r.jsx)(n.code,{children:".y4m"})," files, they need to be converted to raw video (",(0,r.jsx)(n.code,{children:".yuv"}),") format."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Simple 8-bit FHD 23.976 fps input with QP 20 and raw avs3 bitstream output"',children:"uavs3enc -i input.yuv -w 1920 -h 1080 -d 8 --fps_num 24000 --fps_den 1001 -q 20 -o output.avs3\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Speed 2, CRF 20, intra period 120, multithreaded"',children:"uavs3enc -i input.yuv -w 1920 -h 1080 -d 8 --fps_num 24000 --fps_den 1001 -p 120 --wpp_threads 8 --frm_threads 8 --speed_level 2 --rc_type 1 -q 20 -o output.avs3\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Currently, uavs3e ",(0,r.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/issues/2",children:"does not support piping"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"notes",children:"Notes"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Usable speed presets range from 0 to 4, where 0 is the slowest and 4 is the fastest."}),"\n",(0,r.jsxs)(n.li,{children:["The encoder can be quite competitive, even compared with the newest ",(0,r.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"})," and ",(0,r.jsx)(n.a,{href:"/docs/video/VVC",children:"VVC"})," encoders in terms of visual fidelity."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"uavs3d"})," can be used to decode the output bitstream. For real-time playback, you need to have ",(0,r.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," compiled with ",(0,r.jsx)(n.code,{children:"--enable-libuavs3d"}),"."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,n,s)=>{s.d(n,{A:()=>a});s(6540);var t=s(4164);const r={tabItem:"tabItem_Ymn6"};var i=s(4848);function a(e){let{children:n,hidden:s,className:a}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,a),hidden:s,children:n})}},1470:(e,n,s)=>{s.d(n,{A:()=>y});var t=s(6540),r=s(4164),i=s(3104),a=s(6347),o=s(205),l=s(7485),c=s(1682),u=s(679);function d(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:s}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:s,attributes:t,default:r}}=e;return{value:n,label:s,attributes:t,default:r}}))}(s);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,s])}function p(e){let{value:n,tabValues:s}=e;return s.some((e=>e.value===n))}function v(e){let{queryString:n=!1,groupId:s}=e;const r=(0,a.W6)(),i=function(e){let{queryString:n=!1,groupId:s}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:n,groupId:s});return[(0,l.aZ)(i),(0,t.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function m(e){const{defaultValue:n,queryString:s=!1,groupId:r}=e,i=h(e),[a,l]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=s.find((e=>e.default))??s[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:i}))),[c,d]=v({queryString:s,groupId:r}),[m,f]=function(e){let{groupId:n}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,u.Dv)(s);return[r,(0,t.useCallback)((e=>{s&&i.set(e)}),[s,i])]}({groupId:r}),b=(()=>{const e=c??m;return p({value:e,tabValues:i})?e:null})();(0,o.A)((()=>{b&&l(b)}),[b]);return{selectedValue:a,selectValue:(0,t.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),f(e)}),[d,f,i]),tabValues:i}}var f=s(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=s(4848);function g(e){let{className:n,block:s,selectedValue:t,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,s=l.indexOf(n),r=o[s].value;r!==t&&(c(n),a(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;n=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;n=l[s]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":s},n),children:o.map((e=>{let{value:n,label:s,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>l.push(e),onKeyDown:d,onClick:u,...i,className:(0,r.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":t===n}),children:s??n},n)}))})}function j(e){let{lazy:n,children:s,selectedValue:i}=e;const a=(Array.isArray(s)?s:[s]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===i));return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function w(e){const n=m(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,x.jsx)(w,{...e,children:d(e.children)},String(n))}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>o});var t=s(6540);const r={},i=t.createContext(r);function a(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/841b1305.92aedeb8.js b/assets/js/841b1305.92aedeb8.js deleted file mode 100644 index 02fb84549..000000000 --- a/assets/js/841b1305.92aedeb8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9939],{7026:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var s=t(4848),r=t(8453),i=t(1470),a=t(9365);const o={title:"uavs3e",sidebar_position:20,keywords:["avs3","encoding","video encoding"]},l="uavs3e",c={id:"encoders/uavs3e",title:"uavs3e",description:"uavs3e is an open-source encoder for the AVS3 codec, developed by Chinese research institutions including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation.",source:"@site/docs/encoders/uavs3e.mdx",sourceDirName:"encoders",slug:"/encoders/uavs3e",permalink:"/docs/encoders/uavs3e",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/uavs3e.mdx",tags:[],version:"current",sidebarPosition:20,frontMatter:{title:"uavs3e",sidebar_position:20,keywords:["avs3","encoding","video encoding"]},sidebar:"tutorialSidebar",previous:{title:"aom-psy101",permalink:"/docs/encoders/aom-psy101"},next:{title:"NVENC",permalink:"/docs/encoders_hw/nvenc"}},u={},d=[{value:"Installation",id:"installation",level:2},{value:"10-bit Support",id:"10-bit-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Notes",id:"notes",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"uavs3e",children:"uavs3e"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/",children:"uavs3e"})," is an open-source encoder for the ",(0,s.jsx)(n.a,{href:"/docs/video/AVS3",children:"AVS3"})," codec, developed by Chinese research institutions including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation."]}),"\n",(0,s.jsx)(n.p,{children:"The encoder receives infrequent updates, which may result in bugs and compilation issues. It supports AMD64 with AVX2, ARM with NEON, and LoongArch CPUs."}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,s.jsxs)(n.p,{children:["The developers do not provide pre-built binaries, so you'll need to compile it yourself. Compilation requires GNU Make and CMake. As of August 2024, ",(0,s.jsx)(n.code,{children:"uavs3e"})," does not compile with GCC 14, using Clang 18 instead resolves this issue."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/uavs3/uavs3e.git\ncd uavs3e\nmkdir build/linux && cd build/linux\ncmake ../.. -DCOMPILE_10BIT=0 -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++\nmake -j 8\n"})}),(0,s.jsxs)(n.p,{children:["If you encounter undefined calls to ",(0,s.jsx)(n.code,{children:"close"})," or ",(0,s.jsx)(n.code,{children:"lseek64"})," functions, add the following two lines at the top of the ",(0,s.jsx)(n.code,{children:"test/utest.c"})," file:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:"#define _LARGEFILE64_SOURCE\n#include \n"})}),(0,s.jsxs)(n.p,{children:["Binaries will be available in the ",(0,s.jsx)(n.code,{children:"build/linux"})," folder. On Linux, you can run ",(0,s.jsx)(n.code,{children:"make install"})," to install the encoder (may require elevated permissions)."]})]}),(0,s.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Ensure you have the following prerequisites installed before starting the build process:"}),"\n"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://visualstudio.microsoft.com/visual-cpp-build-tools/",children:"Microsoft C++ Build Tools"}),': Select "Desktop development with C++".']}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://git-scm.com/download/win",children:"Git"})}),"\n"]}),(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open Developer PowerShell for VS 2022."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run the following commands:"}),"\n"]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/uavs3/uavs3e.git\ncd uavs3e\n.\\version.bat\ncd build\\x86_windows\ndevenv uavs3e.sln /Upgrade\nmsbuild uavs3e.sln /p:Configuration=Release /p:WindowsTargetPlatformVersion=10.0\n"})}),(0,s.jsxs)(n.p,{children:["Binaries will be available in the ",(0,s.jsx)(n.code,{children:"bin"})," folder."]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"10-bit-support",children:"10-bit Support"}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(a.A,{value:"unixlike",label:"Linux & macOS",children:(0,s.jsxs)(n.p,{children:["To enable 10-bit support, set ",(0,s.jsx)(n.code,{children:"-DCOMPILE_10BIT=1"})," in the CMake command. However, the encoder compiled with this flag has been reported to cause ",(0,s.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/issues/53",children:"segmentation faults"})," on some systems."]})}),(0,s.jsx)(a.A,{value:"windows",label:"Windows",children:(0,s.jsxs)(n.p,{children:["To enable 10-bit support, change the line ",(0,s.jsx)(n.code,{children:"#define COMPILE_10BIT 0"})," to ",(0,s.jsx)(n.code,{children:"#define COMPILE_10BIT 1"})," in the ",(0,s.jsx)(n.code,{children:"inc/com_api.h"})," file."]})})]}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsxs)(n.p,{children:["The encoder cannot parse ",(0,s.jsx)(n.code,{children:".y4m"})," files, they need to be converted to raw video (",(0,s.jsx)(n.code,{children:".yuv"}),") format."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Simple 8-bit FHD 23.976 fps input with QP 20 and raw avs3 bitstream output"',children:"uavs3enc -i input.yuv -w 1920 -h 1080 -d 8 --fps_num 24000 --fps_den 1001 -q 20 -o output.avs3\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Speed 2, CRF 20, intra period 120, multithreaded"',children:"uavs3enc -i input.yuv -w 1920 -h 1080 -d 8 --fps_num 24000 --fps_den 1001 -p 120 --wpp_threads 8 --frm_threads 8 --speed_level 2 --rc_type 1 -q 20 -o output.avs3\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Currently, uavs3e ",(0,s.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/issues/2",children:"does not support piping"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Usable speed presets range from 0 to 4, where 0 is the slowest and 4 is the fastest."}),"\n",(0,s.jsxs)(n.li,{children:["The encoder can be quite competitive, even compared with the newest ",(0,s.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"})," and ",(0,s.jsx)(n.a,{href:"/docs/video/VVC",children:"VVC"})," encoders in terms of visual fidelity."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"uavs3d"})," can be used to decode the output bitstream. For real-time playback, you need to have ",(0,s.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," compiled with ",(0,s.jsx)(n.code,{children:"--enable-libuavs3d"}),"."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var s=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,s.A)(r.tabItem,a),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>y});var s=t(6540),r=t(4164),i=t(3104),a=t(6347),o=t(205),l=t(7485),c=t(1682),u=t(679);function d(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:s,default:r}}=e;return{value:n,label:t,attributes:s,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function v(e){let{queryString:n=!1,groupId:t}=e;const r=(0,a.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(i),(0,s.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=h(e),[a,l]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=t.find((e=>e.default))??t[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:i}))),[c,d]=v({queryString:t,groupId:r}),[m,b]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,u.Dv)(t);return[r,(0,s.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:r}),f=(()=>{const e=c??m;return p({value:e,tabValues:i})?e:null})();(0,o.A)((()=>{f&&l(f)}),[f]);return{selectedValue:a,selectValue:(0,s.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)}),[d,b,i]),tabValues:i}}var b=t(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(4848);function g(e){let{className:n,block:t,selectedValue:s,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=l.indexOf(n),r=o[t].value;r!==s&&(c(n),a(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>l.push(e),onKeyDown:d,onClick:u,...i,className:(0,r.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===i));return e?(0,s.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function w(e){const n=m(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",f.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function y(e){const n=(0,b.A)();return(0,x.jsx)(w,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var s=t(6540);const r={},i=s.createContext(r);function a(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/842a7beb.3c1f9079.js b/assets/js/842a7beb.3c1f9079.js deleted file mode 100644 index 8dcc4058f..000000000 --- a/assets/js/842a7beb.3c1f9079.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6866],{7216:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=i(4848),o=i(8453);const r={title:"rAV1ator",sidebar_position:5},s="rAV1ator",a={id:"utilities/rAV1ator",title:"rAV1ator",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/utilities/rAV1ator.mdx",sourceDirName:"utilities",slug:"/utilities/rAV1ator",permalink:"/docs/utilities/rAV1ator",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rAV1ator.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"rAV1ator",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"MKVToolNix",permalink:"/docs/utilities/MKVToolNix"},next:{title:"rav1ator-cli",permalink:"/docs/utilities/rav1ator-cli"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rav1ator",children:"rAV1ator"})}),"\n",(0,n.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(t.p,{children:["rAV1ator is a fork of ",(0,n.jsx)(t.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," designed to use ",(0,n.jsx)(t.a,{href:"/docs/utilities/av1an",children:"Av1an"})," & ",(0,n.jsx)(t.a,{href:"/docs/encoders/rav1e",children:"rav1e"})," instead of ",(0,n.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),". It is also distributed as a Flatpak with bundled dependencies outside of Flathub; running the following command will allow you to install it:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"flatpak --user remote-add --no-gpg-verify project-volo https://giannirosato.com/repo && flatpak --user install project-volo net.natesales.rAV1ator\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Initially, Aviator was supposed to switch to using the Av1an + rav1e backend that currently serves rAV1ator, but the decision was made to split the two projects due to their fundamentally different goals & Flathub's trouble with Rust dependencies. Aviator is designed to allow easy, painless AV1 encoding, while rAV1ator is designed to make accessing ",(0,n.jsx)(t.em,{children:"specifically"})," Av1an & rav1e easier for interested codec enthusiasts. rAV1ator is maintained by Gianni Rosato & Trix."]})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/842a7beb.f5e11ae0.js b/assets/js/842a7beb.f5e11ae0.js new file mode 100644 index 000000000..0ebbdd8dc --- /dev/null +++ b/assets/js/842a7beb.f5e11ae0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6866],{7247:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"utilities/rAV1ator","title":"rAV1ator","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/utilities/rAV1ator.mdx","sourceDirName":"utilities","slug":"/utilities/rAV1ator","permalink":"/docs/utilities/rAV1ator","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rAV1ator.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"rAV1ator","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"MKVToolNix","permalink":"/docs/utilities/MKVToolNix"},"next":{"title":"rav1ator-cli","permalink":"/docs/utilities/rav1ator-cli"}}');var o=i(4848),r=i(8453);const s={title:"rAV1ator",sidebar_position:5},a="rAV1ator",c={},l=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"rav1ator",children:"rAV1ator"})}),"\n",(0,o.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,o.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,o.jsxs)(t.p,{children:["rAV1ator is a fork of ",(0,o.jsx)(t.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," designed to use ",(0,o.jsx)(t.a,{href:"/docs/utilities/av1an",children:"Av1an"})," & ",(0,o.jsx)(t.a,{href:"/docs/encoders/rav1e",children:"rav1e"})," instead of ",(0,o.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),". It is also distributed as a Flatpak with bundled dependencies outside of Flathub; running the following command will allow you to install it:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"flatpak --user remote-add --no-gpg-verify project-volo https://giannirosato.com/repo && flatpak --user install project-volo net.natesales.rAV1ator\n"})}),"\n",(0,o.jsxs)(t.p,{children:["Initially, Aviator was supposed to switch to using the Av1an + rav1e backend that currently serves rAV1ator, but the decision was made to split the two projects due to their fundamentally different goals & Flathub's trouble with Rust dependencies. Aviator is designed to allow easy, painless AV1 encoding, while rAV1ator is designed to make accessing ",(0,o.jsx)(t.em,{children:"specifically"})," Av1an & rav1e easier for interested codec enthusiasts. rAV1ator is maintained by Gianni Rosato & Trix."]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/84e198a2.18879c5b.js b/assets/js/84e198a2.18879c5b.js new file mode 100644 index 000000000..e60c01f2b --- /dev/null +++ b/assets/js/84e198a2.18879c5b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6711],{8671:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>l,default:()=>u,frontMatter:()=>s,metadata:()=>n,toc:()=>r});const n=JSON.parse('{"id":"utilities/eac3to","title":"eac3to","description":"eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV).","source":"@site/docs/utilities/eac3to.mdx","sourceDirName":"utilities","slug":"/utilities/eac3to","permalink":"/docs/utilities/eac3to","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/eac3to.mdx","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"eac3to","sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"dovi_tool","permalink":"/docs/utilities/dovi_tool"},"next":{"title":"hdr10plus_tool","permalink":"/docs/utilities/hdr10plus_tool"}}');var o=t(4848),a=t(8453);const s={title:"eac3to",sidebar_position:10},l="eac3to",d={},r=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Audio conversion",id:"audio-conversion",level:3},{value:"Get BDMV info",id:"get-bdmv-info",level:3},{value:"Demux",id:"demux",level:3},{value:"Delay audio",id:"delay-audio",level:3}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"eac3to",children:"eac3to"})}),"\n",(0,o.jsx)(i.p,{children:"eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV)."}),"\n",(0,o.jsx)(i.admonition,{title:"Compatibility",type:"info",children:(0,o.jsx)(i.p,{children:"This is a Windows only software, although usage with Wine is possible."})}),"\n",(0,o.jsx)(i.admonition,{title:"Avoid using when possible",type:"caution",children:(0,o.jsxs)(i.p,{children:["There is absolutely no reason whatsoever to use this software unless required by paleolithic ",(0,o.jsx)(i.a,{href:"https://wiki.installgentoo.com/wiki/Private_trackers",children:"private trackers"}),", due to a bajillion dependencies needed that aren't bundled with the download itself. Use something like FFmpeg instead."]})}),"\n",(0,o.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Download from ",(0,o.jsx)(i.a,{href:"https://www.videohelp.com/software/eac3to",children:"VideoHelp"}),", drag and drop into your designated folder, add to PATH when necessary."]}),"\n"]}),"\n",(0,o.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(i.h3,{id:"audio-conversion",children:"Audio conversion"}),"\n",(0,o.jsx)(i.p,{children:"Examples:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",metastring:'title="Convert PCM audio to FLAC"',children:"eac3to source.pcm destination.flac\n"})}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",metastring:'title="Convert TrueHD to FLAC while also extracting the AC-3 compatibility layer"',children:"eac3to source.thd destination.flac destination.ac3\n"})}),"\n",(0,o.jsx)(i.h3,{id:"get-bdmv-info",children:"Get BDMV info"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:"eac3to Movie.2024.Bluray/BDMV\n"})}),"\n",(0,o.jsx)(i.h3,{id:"demux",children:"Demux"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:"eac3to Movie.2024.Bluray/BDMV -demux\n"})}),"\n",(0,o.jsx)(i.h3,{id:"delay-audio",children:"Delay audio"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:"eac3to input.eac3 output.eac3 1000ms\n"})})]})}function u(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>l});var n=t(6540);const o={},a=n.createContext(o);function s(e){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/84e198a2.91ffddfe.js b/assets/js/84e198a2.91ffddfe.js deleted file mode 100644 index ac5ced2cb..000000000 --- a/assets/js/84e198a2.91ffddfe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6711],{2955:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>r});var n=t(4848),o=t(8453);const a={title:"eac3to",sidebar_position:10},s="eac3to",l={id:"utilities/eac3to",title:"eac3to",description:"eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV).",source:"@site/docs/utilities/eac3to.mdx",sourceDirName:"utilities",slug:"/utilities/eac3to",permalink:"/docs/utilities/eac3to",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/eac3to.mdx",tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"eac3to",sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"dovi_tool",permalink:"/docs/utilities/dovi_tool"},next:{title:"hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool"}},d={},r=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Audio conversion",id:"audio-conversion",level:3},{value:"Get BDMV info",id:"get-bdmv-info",level:3},{value:"Demux",id:"demux",level:3},{value:"Delay audio",id:"delay-audio",level:3}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"eac3to",children:"eac3to"})}),"\n",(0,n.jsx)(i.p,{children:"eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV)."}),"\n",(0,n.jsx)(i.admonition,{title:"Compatibility",type:"info",children:(0,n.jsx)(i.p,{children:"This is a Windows only software, although usage with Wine is possible."})}),"\n",(0,n.jsx)(i.admonition,{title:"Avoid using when possible",type:"caution",children:(0,n.jsxs)(i.p,{children:["There is absolutely no reason whatsoever to use this software unless required by paleolithic ",(0,n.jsx)(i.a,{href:"https://wiki.installgentoo.com/wiki/Private_trackers",children:"private trackers"}),", due to a bajillion dependencies needed that aren't bundled with the download itself. Use something like FFmpeg instead."]})}),"\n",(0,n.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Download from ",(0,n.jsx)(i.a,{href:"https://www.videohelp.com/software/eac3to",children:"VideoHelp"}),", drag and drop into your designated folder, add to PATH when necessary."]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(i.h3,{id:"audio-conversion",children:"Audio conversion"}),"\n",(0,n.jsx)(i.p,{children:"Examples:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="Convert PCM audio to FLAC"',children:"eac3to source.pcm destination.flac\n"})}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="Convert TrueHD to FLAC while also extracting the AC-3 compatibility layer"',children:"eac3to source.thd destination.flac destination.ac3\n"})}),"\n",(0,n.jsx)(i.h3,{id:"get-bdmv-info",children:"Get BDMV info"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"eac3to Movie.2024.Bluray/BDMV\n"})}),"\n",(0,n.jsx)(i.h3,{id:"demux",children:"Demux"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"eac3to Movie.2024.Bluray/BDMV -demux\n"})}),"\n",(0,n.jsx)(i.h3,{id:"delay-audio",children:"Delay audio"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"eac3to input.eac3 output.eac3 1000ms\n"})})]})}function u(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>l});var n=t(6540);const o={},a=n.createContext(o);function s(e){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/86ba2311.85a01566.js b/assets/js/86ba2311.85a01566.js new file mode 100644 index 000000000..dee59c47a --- /dev/null +++ b/assets/js/86ba2311.85a01566.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8141],{4288:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"video/VP9","title":"VP9","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/VP9.mdx","sourceDirName":"video","slug":"/video/VP9","permalink":"/docs/video/VP9","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VP9.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"VP9","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"VP8","permalink":"/docs/video/VP8"},"next":{"title":"AV1","permalink":"/docs/video/AV1"}}');var n=o(4848),s=o(8453);const r={title:"VP9",sidebar_position:5},c="VP9",d={},a=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"vp9",children:"VP9"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(t.p,{children:["VP9, famous for being YouTube's codec of choice for many years, is a royalty free video compression format that competes with ",(0,n.jsx)(t.a,{href:"/docs/video/HEVC",children:"HEVC"})," and ",(0,n.jsx)(t.a,{href:"/docs/video/AVC",children:"AVC"}),". It is slightly less efficient than HEVC in terms of visual quality, but VP9 is a computationally much simpler codec and therefore is very easy on system resources when decoding. If you're interested in VP9 encoding, please see the ",(0,n.jsx)(t.a,{href:"/docs/encoders/vpxenc",children:"vpxenc"})," or ",(0,n.jsx)(t.a,{href:"/docs/encoders/SVT-VP9",children:"SVT-VP9"})," sections."]})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>c});var i=o(6540);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/86ba2311.bdcf75f1.js b/assets/js/86ba2311.bdcf75f1.js deleted file mode 100644 index a5cc9ddd4..000000000 --- a/assets/js/86ba2311.bdcf75f1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8141],{4632:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var i=o(4848),n=o(8453);const s={title:"VP9",sidebar_position:5},r="VP9",c={id:"video/VP9",title:"VP9",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VP9.mdx",sourceDirName:"video",slug:"/video/VP9",permalink:"/docs/video/VP9",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VP9.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"VP9",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"VP8",permalink:"/docs/video/VP8"},next:{title:"AV1",permalink:"/docs/video/AV1"}},d={},a=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"vp9",children:"VP9"})}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(t.p,{children:["VP9, famous for being YouTube's codec of choice for many years, is a royalty free video compression format that competes with ",(0,i.jsx)(t.a,{href:"/docs/video/HEVC",children:"HEVC"})," and ",(0,i.jsx)(t.a,{href:"/docs/video/AVC",children:"AVC"}),". It is slightly less efficient than HEVC in terms of visual quality, but VP9 is a computationally much simpler codec and therefore is very easy on system resources when decoding. If you're interested in VP9 encoding, please see the ",(0,i.jsx)(t.a,{href:"/docs/encoders/vpxenc",children:"vpxenc"})," or ",(0,i.jsx)(t.a,{href:"/docs/encoders/SVT-VP9",children:"SVT-VP9"})," sections."]})]})}function l(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>c});var i=o(6540);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8793.6c976fe1.js b/assets/js/8793.6c976fe1.js deleted file mode 100644 index 80e7450aa..000000000 --- a/assets/js/8793.6c976fe1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8793],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>y,Ki:()=>k,kJ:()=>p,x:()=>i,e7:()=>m,J_:()=>f,Gx:()=>_});var n=a(6540),s=a(9532),r=a(6803),l=a(4848);function i(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=n.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:s=!1}=e;const r=function(e){let{content:t,isBlogPostPage:a}=e;return(0,n.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:s});return(0,l.jsx)(o.Provider,{value:r,children:t})}function m(){const e=(0,n.useContext)(o);if(null===e)throw new s.dV("BlogPostProvider");return e}var u=a(6025),d=a(4586);const h=e=>new Date(e).toISOString();function g(e){const t=e.map(j);return{author:1===t.length?t[0]:t}}function x(e,t,a){return e?{image:v({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function p(e){const{siteConfig:t}=(0,d.A)(),{withBaseUrl:a}=(0,u.hH)(),{metadata:{blogDescription:n,blogTitle:s,permalink:r}}=e,l=`${t.url}${r}`;return{"@context":"https://schema.org","@type":"Blog","@id":l,mainEntityOfPage:l,headline:s,description:n,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:s,metadata:r}=e,{date:l,title:i,description:o,lastUpdatedAt:c}=r,m=n.image??s.image,u=s.keywords??[],d=`${t.url}${r.permalink}`,p=c?h(c):void 0;return{"@type":"BlogPosting","@id":d,mainEntityOfPage:d,url:d,headline:i,name:i,description:o,datePublished:l,...p?{dateModified:p}:{},...g(r.authors),...x(m,a,i),...u?{keywords:u}:{}}}(e.content,t,a)))}}function f(){const e=i(),{assets:t,metadata:a}=m(),{siteConfig:n}=(0,d.A)(),{withBaseUrl:s}=(0,u.hH)(),{date:r,title:l,description:o,frontMatter:c,lastUpdatedAt:p}=a,f=t.image??c.image,j=c.keywords??[],v=p?h(p):void 0,b=`${n.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":b,mainEntityOfPage:b,url:b,headline:l,name:l,description:o,datePublished:r,...v?{dateModified:v}:{},...g(a.authors),...x(f,s,l),...j?{keywords:j}:{},isPartOf:{"@type":"Blog","@id":`${n.url}${e.blogBasePath}`,name:e.blogTitle}}}function j(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function v(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var b=a(6347),N=a(8774),w=a(1682),A=a(9169);function _(e){const{pathname:t}=(0,b.zy)();return(0,n.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,A.ys)(e.permalink,t))}(e,t)))),[e,t])}function k(e){const t=(0,w.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function y(e){let{items:t,ulClassName:a,liClassName:n,linkClassName:s,linkActiveClassName:r}=e;return(0,l.jsx)("ul",{className:a,children:t.map((e=>(0,l.jsx)("li",{className:n,children:(0,l.jsx)(N.A,{isNavLink:!0,to:e.permalink,className:s,activeClassName:r,children:e.title})},e.permalink)))})}},8027:(e,t,a)=>{a.d(t,{A:()=>T});var n=a(6540),s=a(4164),r=a(263),l=a(4581),i=a(1312),o=a(4096),c=a(6342),m=a(1107),u=a(4848);function d(e){let{year:t,yearGroupHeadingClassName:a,children:n}=e;return(0,u.jsxs)("div",{role:"group",children:[(0,u.jsx)(m.A,{as:"h3",className:a,children:t}),n]})}function h(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:n}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,u.jsx)(u.Fragment,{children:e.map((e=>{let[t,s]=e;return(0,u.jsx)(d,{year:t,yearGroupHeadingClassName:a,children:(0,u.jsx)(n,{items:s})},t)}))})}return(0,u.jsx)(n,{items:t})}const g=(0,n.memo)(h),x="sidebar_re4s",p="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",j="sidebarItem__DBe",v="sidebarItemLink_mo7H",b="sidebarItemLinkActive_I1ZP",N="yearGroupHeading_rMGB",w=e=>{let{items:t}=e;return(0,u.jsx)(o.OU,{items:t,ulClassName:(0,s.A)(f,"clean-list"),liClassName:j,linkClassName:v,linkActiveClassName:b})};function A(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,u.jsx)("aside",{className:"col col--3",children:(0,u.jsxs)("nav",{className:(0,s.A)(x,"thin-scrollbar"),"aria-label":(0,i.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,u.jsx)("div",{className:(0,s.A)(p,"margin-bottom--md"),children:t.title}),(0,u.jsx)(g,{items:a,ListComponent:w,yearGroupHeadingClassName:N})]})})}const _=(0,n.memo)(A);var k=a(5600);const y={yearGroupHeading:"yearGroupHeading_QT03"},C=e=>{let{items:t}=e;return(0,u.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function M(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,u.jsx)(g,{items:a,ListComponent:C,yearGroupHeadingClassName:y.yearGroupHeading})}function P(e){return(0,u.jsx)(k.GX,{component:M,props:e})}const B=(0,n.memo)(P);function L(e){let{sidebar:t}=e;const a=(0,l.l)();return t?.items.length?"mobile"===a?(0,u.jsx)(B,{sidebar:t}):(0,u.jsx)(_,{sidebar:t}):null}function T(e){const{sidebar:t,toc:a,children:n,...l}=e,i=t&&t.items.length>0;return(0,u.jsx)(r.A,{...l,children:(0,u.jsx)("div",{className:"container margin-vert--lg",children:(0,u.jsxs)("div",{className:"row",children:[(0,u.jsx)(L,{sidebar:t}),(0,u.jsx)("main",{className:(0,s.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:n}),a&&(0,u.jsx)("div",{className:"col col--2",children:a})]})})})}},1240:(e,t,a)=>{a.d(t,{A:()=>z});a(6540);var n=a(4164),s=a(4096),r=a(4848);function l(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var i=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:l}=(0,s.e7)(),{permalink:c,title:m}=a,u=l?"h1":"h2";return(0,r.jsx)(u,{className:(0,n.A)(o.title,t),children:l?m:(0,r.jsx)(i.A,{to:c,children:m})})}var m=a(1312),u=a(5846),d=a(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,u.W)();return t=>{const a=Math.ceil(t);return e(a,(0,m.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function x(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function p(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function f(e){let{className:t}=e;const{metadata:a}=(0,s.e7)(),{date:l,readingTime:i}=a,o=(0,d.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,n.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(x,{date:l,formattedDate:(c=l,o.format(new Date(c)))}),void 0!==i&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(p,{}),(0,r.jsx)(g,{readingTime:i})]})]});var c}const j="githubSvg_Uu4N";const v="xSvg_y3PF";const b=function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,r.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"}),(0,r.jsx)("path",{d:"M3.6 9h16.8"}),(0,r.jsx)("path",{d:"M3.6 15h16.8"}),(0,r.jsx)("path",{d:"M11.5 3a17 17 0 0 0 0 18"}),(0,r.jsx)("path",{d:"M12.5 3a17 17 0 0 1 0 18"})]})},N={authorSocials:"authorSocials_rSDt",authorSocialLink:"authorSocialLink_owbf",authorSocialIcon:"authorSocialIcon_XYv3"},w={twitter:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 209",width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",...e,children:(0,r.jsx)("path",{d:"M256 25.45c-9.42 4.177-19.542 7-30.166 8.27 10.845-6.5 19.172-16.793 23.093-29.057a105.183 105.183 0 0 1-33.351 12.745C205.995 7.201 192.346.822 177.239.822c-29.006 0-52.523 23.516-52.523 52.52 0 4.117.465 8.125 1.36 11.97-43.65-2.191-82.35-23.1-108.255-54.876-4.52 7.757-7.11 16.78-7.11 26.404 0 18.222 9.273 34.297 23.365 43.716a52.312 52.312 0 0 1-23.79-6.57c-.003.22-.003.44-.003.661 0 25.447 18.104 46.675 42.13 51.5a52.592 52.592 0 0 1-23.718.9c6.683 20.866 26.08 36.05 49.062 36.475-17.975 14.086-40.622 22.483-65.228 22.483-4.24 0-8.42-.249-12.529-.734 23.243 14.902 50.85 23.597 80.51 23.597 96.607 0 149.434-80.031 149.434-149.435 0-2.278-.05-4.543-.152-6.795A106.748 106.748 0 0 0 256 25.45",fill:"#55acee"})})},label:"Twitter"},github:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 250",width:"1em",height:"1em",...e,className:(0,n.A)(e.className,j),xmlns:"http://www.w3.org/2000/svg",style:{"--dark":"#000","--light":"#fff"},preserveAspectRatio:"xMidYMid",children:(0,r.jsx)("path",{d:"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"})})},label:"GitHub"},stackoverflow:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 169.61 200",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"M140.44 178.38v-48.65h21.61V200H0v-70.27h21.61v48.65z",fill:"#bcbbbb"}),(0,r.jsx)("path",{d:"M124.24 140.54l4.32-16.22-86.97-17.83-3.78 17.83zM49.7 82.16L130.72 120l7.56-16.22-81.02-37.83zm22.68-40l68.06 57.3 11.35-13.51-68.6-57.3-11.35 13.51zM116.14 0l-14.59 10.81 53.48 71.89 14.58-10.81zM37.81 162.16h86.43v-16.21H37.81z",fill:"#f48024"})]})},label:"Stack Overflow"},linkedin:{Icon:function(e){return(0,r.jsx)("svg",{width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",...e,children:(0,r.jsx)("path",{d:"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.907 39.907 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186l-.016 67.013ZM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009-.002-12.157 9.851-22.014 22.008-22.016 12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97v122.16ZM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453",fill:"#0A66C2"})})},label:"LinkedIn"},x:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",fill:"none",viewBox:"0 0 1200 1227",...e,className:(0,n.A)(e.className,v),style:{"--dark":"#000","--light":"#fff"},children:(0,r.jsx)("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})})},label:"X"}};function A(e){let{platform:t,link:a}=e;const{Icon:s,label:l}=w[o=t]??{Icon:b,label:o};var o;return(0,r.jsx)(i.A,{className:N.authorSocialLink,href:a,title:l,children:(0,r.jsx)(s,{className:(0,n.A)(N.authorSocialLink)})})}function _(e){let{author:t}=e;const a=Object.entries(t.socials??{});return(0,r.jsx)("div",{className:N.authorSocials,children:a.map((e=>{let[t,a]=e;return(0,r.jsx)(A,{platform:t,link:a},t)}))})}var k=a(1107);const y={authorImage:"authorImage_XqGP","author-as-h1":"author-as-h1_n9oJ","author-as-h2":"author-as-h2_gXvM",authorDetails:"authorDetails_lV9A",authorName:"authorName_yefp",authorTitle:"authorTitle_nd0D",authorBlogPostCount:"authorBlogPostCount_iiJ5"};function C(e){return e.href?(0,r.jsx)(i.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function M(e){let{title:t}=e;return(0,r.jsx)("small",{className:y.authorTitle,title:t,children:t})}function P(e){let{name:t,as:a}=e;return a?(0,r.jsx)(k.A,{as:a,className:y.authorName,children:t}):(0,r.jsx)("span",{className:y.authorName,children:t})}function B(e){let{count:t}=e;return(0,r.jsx)("span",{className:(0,n.A)(y.authorBlogPostCount),children:t})}function L(e){let{as:t,author:a,className:s,count:l}=e;const{name:i,title:o,url:c,imageURL:m,email:u,page:d}=a,h=d?.permalink||c||u&&`mailto:${u}`||void 0;return(0,r.jsxs)("div",{className:(0,n.A)("avatar margin-bottom--sm",s,y[`author-as-${t}`]),children:[m&&(0,r.jsx)(C,{href:h,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:(0,n.A)("avatar__photo",y.authorImage),src:m,alt:i})}),(i||o)&&(0,r.jsxs)("div",{className:(0,n.A)("avatar__intro",y.authorDetails),children:[(0,r.jsxs)("div",{className:"avatar__name",children:[i&&(0,r.jsx)(C,{href:h,children:(0,r.jsx)(P,{name:i,as:t})}),l&&(0,r.jsx)(B,{count:l})]}),!!o&&(0,r.jsx)(M,{title:o}),(0,r.jsx)(_,{author:a})]})]})}const T={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function I(e){let{className:t}=e;const{metadata:{authors:a},assets:l}=(0,s.e7)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,r.jsx)("div",{className:(0,n.A)("margin-top--md margin-bottom--sm",i?T.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,n.A)(!i&&(o?"col col--12":"col col--6"),i?T.imageOnlyAuthorCol:T.authorCol),children:(0,r.jsx)(L,{author:{...e,imageURL:l.authorsImageUrls[t]??e.imageURL}})},t)))})}function U(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(f,{}),(0,r.jsx)(I,{})]})}var H=a(440),O=a(8509);function R(e){let{children:t,className:a}=e;const{isBlogPostPage:l}=(0,s.e7)();return(0,r.jsx)("div",{id:l?H.LU:void 0,className:(0,n.A)("markdown",a),children:(0,r.jsx)(O.A,{children:t})})}var G=a(7559),$=a(4336),F=a(2053);function S(){return(0,r.jsx)("b",{children:(0,r.jsx)(m.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function Z(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(i.A,{"aria-label":(0,m.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,r.jsx)(S,{})})}function D(){const{metadata:e,isBlogPostPage:t}=(0,s.e7)(),{tags:a,title:l,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:m}=e,u=!t&&o,d=a.length>0;if(!(d||u||i))return null;if(t){const e=!!(i||m||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[d&&(0,r.jsx)("div",{className:(0,n.A)("row","margin-top--sm",G.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(F.A,{tags:a})})}),e&&(0,r.jsx)($.A,{className:(0,n.A)("margin-top--sm",G.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:m,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[d&&(0,r.jsx)("div",{className:(0,n.A)("col",{"col--9":u}),children:(0,r.jsx)(F.A,{tags:a})}),u&&(0,r.jsx)("div",{className:(0,n.A)("col text--right",{"col--3":d}),children:(0,r.jsx)(Z,{blogPostTitle:l,to:e.permalink})})]})}function z(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,s.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(l,{className:(0,n.A)(i,a),children:[(0,r.jsx)(U,{}),(0,r.jsx)(R,{children:t}),(0,r.jsx)(D,{})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var n=a(4164),s=a(8774),r=a(4848);function l(e){const{permalink:t,title:a,subLabel:l,isNext:i}=e;return(0,r.jsxs)(s.A,{className:(0,n.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var n=a(4164),s=a(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=a(4848);function i(e){let{permalink:t,label:a,count:i,description:o}=e;return(0,l.jsxs)(s.A,{href:t,title:o,className:(0,n.A)(r.tag,i?r.tagWithCount:r.tagRegular),children:[a,i&&(0,l.jsx)("span",{children:i})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(4164),s=a(1312),r=a(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,n.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:l.tag,children:(0,i.jsx)(r.A,{...e})},e.permalink)))})]})}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var n=a(6540),s=a(4586);const r=["zero","one","two","few","many","other"];function l(e){return r.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,s.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const n=e.split("|");if(1===n.length)return n[0];n.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const s=a.select(t),r=a.pluralForms.indexOf(s);return n[Math.min(r,n.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/8793.ddc5836a.js b/assets/js/8793.ddc5836a.js new file mode 100644 index 000000000..5e61b7fca --- /dev/null +++ b/assets/js/8793.ddc5836a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8793],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>y,Ki:()=>k,kJ:()=>p,x:()=>i,e7:()=>m,J_:()=>f,Gx:()=>_});var n=a(6540),s=a(9532),r=a(6803),l=a(4848);function i(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=n.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:s=!1}=e;const r=function(e){let{content:t,isBlogPostPage:a}=e;return(0,n.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:s});return(0,l.jsx)(o.Provider,{value:r,children:t})}function m(){const e=(0,n.useContext)(o);if(null===e)throw new s.dV("BlogPostProvider");return e}var u=a(6025),d=a(4586);const h=e=>new Date(e).toISOString();function g(e){const t=e.map(j);return{author:1===t.length?t[0]:t}}function x(e,t,a){return e?{image:v({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function p(e){const{siteConfig:t}=(0,d.A)(),{withBaseUrl:a}=(0,u.hH)(),{metadata:{blogDescription:n,blogTitle:s,permalink:r}}=e,l=`${t.url}${r}`;return{"@context":"https://schema.org","@type":"Blog","@id":l,mainEntityOfPage:l,headline:s,description:n,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:s,metadata:r}=e,{date:l,title:i,description:o,lastUpdatedAt:c}=r,m=n.image??s.image,u=s.keywords??[],d=`${t.url}${r.permalink}`,p=c?h(c):void 0;return{"@type":"BlogPosting","@id":d,mainEntityOfPage:d,url:d,headline:i,name:i,description:o,datePublished:l,...p?{dateModified:p}:{},...g(r.authors),...x(m,a,i),...u?{keywords:u}:{}}}(e.content,t,a)))}}function f(){const e=i(),{assets:t,metadata:a}=m(),{siteConfig:n}=(0,d.A)(),{withBaseUrl:s}=(0,u.hH)(),{date:r,title:l,description:o,frontMatter:c,lastUpdatedAt:p}=a,f=t.image??c.image,j=c.keywords??[],v=p?h(p):void 0,b=`${n.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":b,mainEntityOfPage:b,url:b,headline:l,name:l,description:o,datePublished:r,...v?{dateModified:v}:{},...g(a.authors),...x(f,s,l),...j?{keywords:j}:{},isPartOf:{"@type":"Blog","@id":`${n.url}${e.blogBasePath}`,name:e.blogTitle}}}function j(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function v(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var b=a(6347),N=a(8774),w=a(1682),A=a(9169);function _(e){const{pathname:t}=(0,b.zy)();return(0,n.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,A.ys)(e.permalink,t))}(e,t)))),[e,t])}function k(e){const t=(0,w.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function y(e){let{items:t,ulClassName:a,liClassName:n,linkClassName:s,linkActiveClassName:r}=e;return(0,l.jsx)("ul",{className:a,children:t.map((e=>(0,l.jsx)("li",{className:n,children:(0,l.jsx)(N.A,{isNavLink:!0,to:e.permalink,className:s,activeClassName:r,children:e.title})},e.permalink)))})}},8027:(e,t,a)=>{a.d(t,{A:()=>T});var n=a(6540),s=a(4164),r=a(7823),l=a(4581),i=a(1312),o=a(4096),c=a(6342),m=a(1107),u=a(4848);function d(e){let{year:t,yearGroupHeadingClassName:a,children:n}=e;return(0,u.jsxs)("div",{role:"group",children:[(0,u.jsx)(m.A,{as:"h3",className:a,children:t}),n]})}function h(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:n}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,u.jsx)(u.Fragment,{children:e.map((e=>{let[t,s]=e;return(0,u.jsx)(d,{year:t,yearGroupHeadingClassName:a,children:(0,u.jsx)(n,{items:s})},t)}))})}return(0,u.jsx)(n,{items:t})}const g=(0,n.memo)(h),x="sidebar_re4s",p="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",j="sidebarItem__DBe",v="sidebarItemLink_mo7H",b="sidebarItemLinkActive_I1ZP",N="yearGroupHeading_rMGB",w=e=>{let{items:t}=e;return(0,u.jsx)(o.OU,{items:t,ulClassName:(0,s.A)(f,"clean-list"),liClassName:j,linkClassName:v,linkActiveClassName:b})};function A(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,u.jsx)("aside",{className:"col col--3",children:(0,u.jsxs)("nav",{className:(0,s.A)(x,"thin-scrollbar"),"aria-label":(0,i.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,u.jsx)("div",{className:(0,s.A)(p,"margin-bottom--md"),children:t.title}),(0,u.jsx)(g,{items:a,ListComponent:w,yearGroupHeadingClassName:N})]})})}const _=(0,n.memo)(A);var k=a(5600);const y={yearGroupHeading:"yearGroupHeading_QT03"},C=e=>{let{items:t}=e;return(0,u.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function M(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,u.jsx)(g,{items:a,ListComponent:C,yearGroupHeadingClassName:y.yearGroupHeading})}function P(e){return(0,u.jsx)(k.GX,{component:M,props:e})}const B=(0,n.memo)(P);function L(e){let{sidebar:t}=e;const a=(0,l.l)();return t?.items.length?"mobile"===a?(0,u.jsx)(B,{sidebar:t}):(0,u.jsx)(_,{sidebar:t}):null}function T(e){const{sidebar:t,toc:a,children:n,...l}=e,i=t&&t.items.length>0;return(0,u.jsx)(r.A,{...l,children:(0,u.jsx)("div",{className:"container margin-vert--lg",children:(0,u.jsxs)("div",{className:"row",children:[(0,u.jsx)(L,{sidebar:t}),(0,u.jsx)("main",{className:(0,s.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:n}),a&&(0,u.jsx)("div",{className:"col col--2",children:a})]})})})}},1240:(e,t,a)=>{a.d(t,{A:()=>z});a(6540);var n=a(4164),s=a(4096),r=a(4848);function l(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var i=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:l}=(0,s.e7)(),{permalink:c,title:m}=a,u=l?"h1":"h2";return(0,r.jsx)(u,{className:(0,n.A)(o.title,t),children:l?m:(0,r.jsx)(i.A,{to:c,children:m})})}var m=a(1312),u=a(5846),d=a(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,u.W)();return t=>{const a=Math.ceil(t);return e(a,(0,m.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function x(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function p(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function f(e){let{className:t}=e;const{metadata:a}=(0,s.e7)(),{date:l,readingTime:i}=a,o=(0,d.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,n.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(x,{date:l,formattedDate:(c=l,o.format(new Date(c)))}),void 0!==i&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(p,{}),(0,r.jsx)(g,{readingTime:i})]})]});var c}const j="githubSvg_Uu4N";const v="xSvg_y3PF";const b=function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,r.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"}),(0,r.jsx)("path",{d:"M3.6 9h16.8"}),(0,r.jsx)("path",{d:"M3.6 15h16.8"}),(0,r.jsx)("path",{d:"M11.5 3a17 17 0 0 0 0 18"}),(0,r.jsx)("path",{d:"M12.5 3a17 17 0 0 1 0 18"})]})},N={authorSocials:"authorSocials_rSDt",authorSocialLink:"authorSocialLink_owbf",authorSocialIcon:"authorSocialIcon_XYv3"},w={twitter:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 209",width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",...e,children:(0,r.jsx)("path",{d:"M256 25.45c-9.42 4.177-19.542 7-30.166 8.27 10.845-6.5 19.172-16.793 23.093-29.057a105.183 105.183 0 0 1-33.351 12.745C205.995 7.201 192.346.822 177.239.822c-29.006 0-52.523 23.516-52.523 52.52 0 4.117.465 8.125 1.36 11.97-43.65-2.191-82.35-23.1-108.255-54.876-4.52 7.757-7.11 16.78-7.11 26.404 0 18.222 9.273 34.297 23.365 43.716a52.312 52.312 0 0 1-23.79-6.57c-.003.22-.003.44-.003.661 0 25.447 18.104 46.675 42.13 51.5a52.592 52.592 0 0 1-23.718.9c6.683 20.866 26.08 36.05 49.062 36.475-17.975 14.086-40.622 22.483-65.228 22.483-4.24 0-8.42-.249-12.529-.734 23.243 14.902 50.85 23.597 80.51 23.597 96.607 0 149.434-80.031 149.434-149.435 0-2.278-.05-4.543-.152-6.795A106.748 106.748 0 0 0 256 25.45",fill:"#55acee"})})},label:"Twitter"},github:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 250",width:"1em",height:"1em",...e,className:(0,n.A)(e.className,j),xmlns:"http://www.w3.org/2000/svg",style:{"--dark":"#000","--light":"#fff"},preserveAspectRatio:"xMidYMid",children:(0,r.jsx)("path",{d:"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"})})},label:"GitHub"},stackoverflow:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 169.61 200",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"M140.44 178.38v-48.65h21.61V200H0v-70.27h21.61v48.65z",fill:"#bcbbbb"}),(0,r.jsx)("path",{d:"M124.24 140.54l4.32-16.22-86.97-17.83-3.78 17.83zM49.7 82.16L130.72 120l7.56-16.22-81.02-37.83zm22.68-40l68.06 57.3 11.35-13.51-68.6-57.3-11.35 13.51zM116.14 0l-14.59 10.81 53.48 71.89 14.58-10.81zM37.81 162.16h86.43v-16.21H37.81z",fill:"#f48024"})]})},label:"Stack Overflow"},linkedin:{Icon:function(e){return(0,r.jsx)("svg",{width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",...e,children:(0,r.jsx)("path",{d:"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.907 39.907 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186l-.016 67.013ZM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009-.002-12.157 9.851-22.014 22.008-22.016 12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97v122.16ZM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453",fill:"#0A66C2"})})},label:"LinkedIn"},x:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",fill:"none",viewBox:"0 0 1200 1227",...e,className:(0,n.A)(e.className,v),style:{"--dark":"#000","--light":"#fff"},children:(0,r.jsx)("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})})},label:"X"}};function A(e){let{platform:t,link:a}=e;const{Icon:s,label:l}=w[o=t]??{Icon:b,label:o};var o;return(0,r.jsx)(i.A,{className:N.authorSocialLink,href:a,title:l,children:(0,r.jsx)(s,{className:(0,n.A)(N.authorSocialLink)})})}function _(e){let{author:t}=e;const a=Object.entries(t.socials??{});return(0,r.jsx)("div",{className:N.authorSocials,children:a.map((e=>{let[t,a]=e;return(0,r.jsx)(A,{platform:t,link:a},t)}))})}var k=a(1107);const y={authorImage:"authorImage_XqGP","author-as-h1":"author-as-h1_n9oJ","author-as-h2":"author-as-h2_gXvM",authorDetails:"authorDetails_lV9A",authorName:"authorName_yefp",authorTitle:"authorTitle_nd0D",authorBlogPostCount:"authorBlogPostCount_iiJ5"};function C(e){return e.href?(0,r.jsx)(i.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function M(e){let{title:t}=e;return(0,r.jsx)("small",{className:y.authorTitle,title:t,children:t})}function P(e){let{name:t,as:a}=e;return a?(0,r.jsx)(k.A,{as:a,className:y.authorName,children:t}):(0,r.jsx)("span",{className:y.authorName,children:t})}function B(e){let{count:t}=e;return(0,r.jsx)("span",{className:(0,n.A)(y.authorBlogPostCount),children:t})}function L(e){let{as:t,author:a,className:s,count:l}=e;const{name:i,title:o,url:c,imageURL:m,email:u,page:d}=a,h=d?.permalink||c||u&&`mailto:${u}`||void 0;return(0,r.jsxs)("div",{className:(0,n.A)("avatar margin-bottom--sm",s,y[`author-as-${t}`]),children:[m&&(0,r.jsx)(C,{href:h,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:(0,n.A)("avatar__photo",y.authorImage),src:m,alt:i})}),(i||o)&&(0,r.jsxs)("div",{className:(0,n.A)("avatar__intro",y.authorDetails),children:[(0,r.jsxs)("div",{className:"avatar__name",children:[i&&(0,r.jsx)(C,{href:h,children:(0,r.jsx)(P,{name:i,as:t})}),void 0!==l&&(0,r.jsx)(B,{count:l})]}),!!o&&(0,r.jsx)(M,{title:o}),(0,r.jsx)(_,{author:a})]})]})}const T={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function I(e){let{className:t}=e;const{metadata:{authors:a},assets:l}=(0,s.e7)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,r.jsx)("div",{className:(0,n.A)("margin-top--md margin-bottom--sm",i?T.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,n.A)(!i&&(o?"col col--12":"col col--6"),i?T.imageOnlyAuthorCol:T.authorCol),children:(0,r.jsx)(L,{author:{...e,imageURL:l.authorsImageUrls[t]??e.imageURL}})},t)))})}function U(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(f,{}),(0,r.jsx)(I,{})]})}var H=a(440),O=a(8509);function R(e){let{children:t,className:a}=e;const{isBlogPostPage:l}=(0,s.e7)();return(0,r.jsx)("div",{id:l?H.LU:void 0,className:(0,n.A)("markdown",a),children:(0,r.jsx)(O.A,{children:t})})}var G=a(7559),$=a(4336),F=a(2053);function S(){return(0,r.jsx)("b",{children:(0,r.jsx)(m.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function Z(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(i.A,{"aria-label":(0,m.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,r.jsx)(S,{})})}function D(){const{metadata:e,isBlogPostPage:t}=(0,s.e7)(),{tags:a,title:l,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:m}=e,u=!t&&o,d=a.length>0;if(!(d||u||i))return null;if(t){const e=!!(i||m||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[d&&(0,r.jsx)("div",{className:(0,n.A)("row","margin-top--sm",G.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(F.A,{tags:a})})}),e&&(0,r.jsx)($.A,{className:(0,n.A)("margin-top--sm",G.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:m,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[d&&(0,r.jsx)("div",{className:(0,n.A)("col",{"col--9":u}),children:(0,r.jsx)(F.A,{tags:a})}),u&&(0,r.jsx)("div",{className:(0,n.A)("col text--right",{"col--3":d}),children:(0,r.jsx)(Z,{blogPostTitle:l,to:e.permalink})})]})}function z(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,s.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(l,{className:(0,n.A)(i,a),children:[(0,r.jsx)(U,{}),(0,r.jsx)(R,{children:t}),(0,r.jsx)(D,{})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var n=a(4164),s=a(8774),r=a(4848);function l(e){const{permalink:t,title:a,subLabel:l,isNext:i}=e;return(0,r.jsxs)(s.A,{className:(0,n.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var n=a(4164),s=a(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=a(4848);function i(e){let{permalink:t,label:a,count:i,description:o}=e;return(0,l.jsxs)(s.A,{href:t,title:o,className:(0,n.A)(r.tag,i?r.tagWithCount:r.tagRegular),children:[a,i&&(0,l.jsx)("span",{children:i})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(4164),s=a(1312),r=a(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,n.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:l.tag,children:(0,i.jsx)(r.A,{...e})},e.permalink)))})]})}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var n=a(6540),s=a(4586);const r=["zero","one","two","few","many","other"];function l(e){return r.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,s.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const n=e.split("|");if(1===n.length)return n[0];n.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const s=a.select(t),r=a.pluralForms.indexOf(s);return n[Math.min(r,n.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/8a894f7b.61cfc55c.js b/assets/js/8a894f7b.61cfc55c.js new file mode 100644 index 000000000..e4d06fdbb --- /dev/null +++ b/assets/js/8a894f7b.61cfc55c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[538],{2101:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"introduction/video-artifacts","title":"Spotting Video Artifacts","description":"https://xkcd.com/2414","source":"@site/docs/introduction/video-artifacts.mdx","sourceDirName":"introduction","slug":"/introduction/video-artifacts","permalink":"/docs/introduction/video-artifacts","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/video-artifacts.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Lossy Compression","permalink":"/docs/introduction/lossy"},"next":{"title":"Psychovisual","permalink":"/docs/introduction/psychovisual"}}');var s=i(4848),n=i(8453);const a={sidebar_position:4},r="Spotting Video Artifacts",c={},l=[{value:"Moir\xe9 Pattern",id:"moir\xe9-pattern",level:2},{value:"Staircase Effect",id:"staircase-effect",level:2},{value:"Color Bleed",id:"color-bleed",level:2},{value:"Ringing",id:"ringing",level:2},{value:"Blocking",id:"blocking",level:2},{value:"Banding/Contouring",id:"bandingcontouring",level:2},{value:"Mosquito Noise",id:"mosquito-noise",level:2}];function h(e){const t={a:"a",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"spotting-video-artifacts",children:"Spotting Video Artifacts"})}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/solar_system_compression_artifacts_2x.avif",type:"image/avif"}),(0,s.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/solar_system_compression_artifacts_2x.png",alt:"XKCD about compression artifacts",width:"659",height:"540"})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.a,{href:"https://xkcd.com/2414",children:"https://xkcd.com/2414"})})}),"\n",(0,s.jsx)(t.p,{children:"Video artifacts are visual distortions or anomalies that appear in a video, which can affect the quality of the image. Artifacts are first categorized by whether they\u2019re time/sequence-based (temporal) or location-based (spatial). If you can see the artifact when the video is paused, then it\u2019s probably a spatial artifact. If it\u2019s much more visible while the video plays, then it\u2019s likely temporal."}),"\n",(0,s.jsx)(t.h2,{id:"moir\xe9-pattern",children:"Moir\xe9 Pattern"}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/moire-pattern.jxl",type:"image/jxl"}),(0,s.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/moire-pattern.jpeg",alt:"Moir\xe9 pattern on a brick building",width:"205",height:"250"})]}),"\n",(0,s.jsx)(t.p,{children:"Moir\xe9 patterns are large-scale spatial interference pattern produced when a pattern in the source image and the manner in which the encoder operates are slightly out of alignment spatially. The artifacts generated by the encoder then introduce strange, swirling effects in the source image's pattern upon decoding. and"}),"\n",(0,s.jsx)(t.h2,{id:"staircase-effect",children:"Staircase Effect"}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/staircase-effect.jxl",type:"image/jxl"}),(0,s.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/staircase-effect.jpeg",alt:"Staircase Effect",width:"452",height:"548",loading:"lazy"})]}),"\n",(0,s.jsx)(t.p,{children:'The staircase effect is a spatial artifact that occurs when diagonal straight or curved edges that should be smooth take on a jagged appearance, looking somewhat like a set of stair steps. This is the effect that is being reduced by "anti-aliasing" filters.'}),"\n",(0,s.jsx)(t.h2,{id:"color-bleed",children:"Color Bleed"}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/color-bleed.jxl",type:"image/jxl"}),(0,s.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/color-bleed.jpeg",alt:"Color Bleed",width:"624",height:"276",loading:"lazy"})]}),"\n",(0,s.jsx)(t.p,{children:"Color bleeding, as its name suggests, occurs when the edges of one color in the image unintentionally bleeds or overlaps into another color. The cause of color bleeding is usually related to the compression algorithm's handling of chrominance information. Chrominance refers to the color information in an image or video, and it's usually compressed separately from the luminance (brightness) information. In some compression algorithms, the chrominance information may be compressed more aggressively than the luminance information, resulting in a loss of color accuracy and detail."}),"\n",(0,s.jsx)(t.h2,{id:"ringing",children:"Ringing"}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/ringing-artifact.jxl",type:"image/jxl"}),(0,s.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/ringing-artifact.jpeg",alt:"Ringing artifact on a star symbol",width:"684",height:"599",loading:"lazy"})]}),"\n",(0,s.jsx)(t.p,{children:"Note the blue and pink fringes around the edges of the star above (as well as the stepping and other significant compression artifacts). Those fringes are the ringing effect. It is very similar to mosquito noise which will be talked about down below."}),"\n",(0,s.jsx)(t.h2,{id:"blocking",children:"Blocking"}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/blocking_on_cat.jxl",type:"image/jxl"}),(0,s.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/blocking_on_cat.jpeg",alt:"Blocking artifacts on a cat",loading:"lazy"})]}),"\n",(0,s.jsx)(t.p,{children:'To understand this artifact, we first need to know what DCT (Discrete Cosine Transform)-based compression is. It\'s a way of reducing the size of a digital image or video file by analyzing the data in small chunks (called "blocks") and then using mathematical formulas to transform that data into a more compact representation. This transformed data can then be stored or transmitted more efficiently.'}),"\n",(0,s.jsx)(t.p,{children:'However, this compression technique can sometimes lead to visible "distortions" in the compressed image or video. One of the most common types of distortion is the "blocking artifact," which occurs when the edges of the compressed blocks become visible, creating a grid-like pattern over the image or video.'}),"\n",(0,s.jsx)(t.p,{children:"In simpler terms, imagine if you take a picture and then try to compress it to make the file size smaller. The compression algorithm divides the picture into small blocks and tries to simplify the information in each block. But when there's not enough bitrate/data, the algorithm simplifies the information too much, resulting in visible blocks or a grid pattern on the picture. This is what we call the DCT blocking compression artifact."}),"\n",(0,s.jsx)(t.h2,{id:"bandingcontouring",children:"Banding/Contouring"}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/colorbanding_ex1.jxl",type:"image/jxl"}),(0,s.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/colorbanding_ex1.jpeg",alt:"Banding",width:"418",height:"303",loading:"lazy"})]}),"\n",(0,s.jsx)(t.p,{children:"Banding or contouring is a specific form of posterization in which the color blocks form bands or stripes in the image. This occurs when the video is encoded with too coarse a quantization (Technique used in video compression that reduces the amount of data needed to store or transmit a video by rounding off certain values in the video's signal) configuration and a lack of available color gradient. As a result, the video's contents show a \"layered\" look, where instead of smooth gradients and transitions, the transitions from color to color are abrupt, causing strips of color to appear."}),"\n",(0,s.jsx)(t.h2,{id:"mosquito-noise",children:"Mosquito Noise"}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/mosquito-noise.jxl",type:"image/jxl"}),(0,s.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/mosquito-noise.jpeg",alt:"Mosquito noise surrounding an iron fence",width:"505",height:"353",loading:"lazy"})]}),"\n",(0,s.jsx)(t.p,{children:"Mosquito noise appears as small, moving, and blocky artifacts around sharp edges or fine details in videos or images. They are mostly found in videos that are compressed using the DCT algorithm we talked about earlier, such as MPEG videos or JPEG images."})]})}function d(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var o=i(6540);const s={},n=o.createContext(s);function a(e){const t=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),o.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a894f7b.ed44ed07.js b/assets/js/8a894f7b.ed44ed07.js deleted file mode 100644 index ee96f8c2a..000000000 --- a/assets/js/8a894f7b.ed44ed07.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[538],{8245:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var o=i(4848),n=i(8453);const s={sidebar_position:4},a="Spotting Video Artifacts",r={id:"introduction/video-artifacts",title:"Spotting Video Artifacts",description:"https://xkcd.com/2414",source:"@site/docs/introduction/video-artifacts.mdx",sourceDirName:"introduction",slug:"/introduction/video-artifacts",permalink:"/docs/introduction/video-artifacts",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/video-artifacts.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Lossy Compression",permalink:"/docs/introduction/lossy"},next:{title:"Psychovisual",permalink:"/docs/introduction/psychovisual"}},c={},l=[{value:"Moir\xe9 Pattern",id:"moir\xe9-pattern",level:2},{value:"Staircase Effect",id:"staircase-effect",level:2},{value:"Color Bleed",id:"color-bleed",level:2},{value:"Ringing",id:"ringing",level:2},{value:"Blocking",id:"blocking",level:2},{value:"Banding/Contouring",id:"bandingcontouring",level:2},{value:"Mosquito Noise",id:"mosquito-noise",level:2}];function h(e){const t={a:"a",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"spotting-video-artifacts",children:"Spotting Video Artifacts"})}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/solar_system_compression_artifacts_2x.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/solar_system_compression_artifacts_2x.png",alt:"XKCD about compression artifacts",width:"659",height:"540"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.em,{children:(0,o.jsx)(t.a,{href:"https://xkcd.com/2414",children:"https://xkcd.com/2414"})})}),"\n",(0,o.jsx)(t.p,{children:"Video artifacts are visual distortions or anomalies that appear in a video, which can affect the quality of the image. Artifacts are first categorized by whether they\u2019re time/sequence-based (temporal) or location-based (spatial). If you can see the artifact when the video is paused, then it\u2019s probably a spatial artifact. If it\u2019s much more visible while the video plays, then it\u2019s likely temporal."}),"\n",(0,o.jsx)(t.h2,{id:"moir\xe9-pattern",children:"Moir\xe9 Pattern"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/moire-pattern.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/moire-pattern.jpeg",alt:"Moir\xe9 pattern on a brick building",width:"205",height:"250"})]}),"\n",(0,o.jsx)(t.p,{children:"Moir\xe9 patterns are large-scale spatial interference pattern produced when a pattern in the source image and the manner in which the encoder operates are slightly out of alignment spatially. The artifacts generated by the encoder then introduce strange, swirling effects in the source image's pattern upon decoding. and"}),"\n",(0,o.jsx)(t.h2,{id:"staircase-effect",children:"Staircase Effect"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/staircase-effect.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/staircase-effect.jpeg",alt:"Staircase Effect",width:"452",height:"548",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:'The staircase effect is a spatial artifact that occurs when diagonal straight or curved edges that should be smooth take on a jagged appearance, looking somewhat like a set of stair steps. This is the effect that is being reduced by "anti-aliasing" filters.'}),"\n",(0,o.jsx)(t.h2,{id:"color-bleed",children:"Color Bleed"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/color-bleed.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/color-bleed.jpeg",alt:"Color Bleed",width:"624",height:"276",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:"Color bleeding, as its name suggests, occurs when the edges of one color in the image unintentionally bleeds or overlaps into another color. The cause of color bleeding is usually related to the compression algorithm's handling of chrominance information. Chrominance refers to the color information in an image or video, and it's usually compressed separately from the luminance (brightness) information. In some compression algorithms, the chrominance information may be compressed more aggressively than the luminance information, resulting in a loss of color accuracy and detail."}),"\n",(0,o.jsx)(t.h2,{id:"ringing",children:"Ringing"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/ringing-artifact.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/ringing-artifact.jpeg",alt:"Ringing artifact on a star symbol",width:"684",height:"599",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:"Note the blue and pink fringes around the edges of the star above (as well as the stepping and other significant compression artifacts). Those fringes are the ringing effect. It is very similar to mosquito noise which will be talked about down below."}),"\n",(0,o.jsx)(t.h2,{id:"blocking",children:"Blocking"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/blocking_on_cat.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/blocking_on_cat.jpeg",alt:"Blocking artifacts on a cat",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:'To understand this artifact, we first need to know what DCT (Discrete Cosine Transform)-based compression is. It\'s a way of reducing the size of a digital image or video file by analyzing the data in small chunks (called "blocks") and then using mathematical formulas to transform that data into a more compact representation. This transformed data can then be stored or transmitted more efficiently.'}),"\n",(0,o.jsx)(t.p,{children:'However, this compression technique can sometimes lead to visible "distortions" in the compressed image or video. One of the most common types of distortion is the "blocking artifact," which occurs when the edges of the compressed blocks become visible, creating a grid-like pattern over the image or video.'}),"\n",(0,o.jsx)(t.p,{children:"In simpler terms, imagine if you take a picture and then try to compress it to make the file size smaller. The compression algorithm divides the picture into small blocks and tries to simplify the information in each block. But when there's not enough bitrate/data, the algorithm simplifies the information too much, resulting in visible blocks or a grid pattern on the picture. This is what we call the DCT blocking compression artifact."}),"\n",(0,o.jsx)(t.h2,{id:"bandingcontouring",children:"Banding/Contouring"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/colorbanding_ex1.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/colorbanding_ex1.jpeg",alt:"Banding",width:"418",height:"303",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:"Banding or contouring is a specific form of posterization in which the color blocks form bands or stripes in the image. This occurs when the video is encoded with too coarse a quantization (Technique used in video compression that reduces the amount of data needed to store or transmit a video by rounding off certain values in the video's signal) configuration and a lack of available color gradient. As a result, the video's contents show a \"layered\" look, where instead of smooth gradients and transitions, the transitions from color to color are abrupt, causing strips of color to appear."}),"\n",(0,o.jsx)(t.h2,{id:"mosquito-noise",children:"Mosquito Noise"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/mosquito-noise.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/mosquito-noise.jpeg",alt:"Mosquito noise surrounding an iron fence",width:"505",height:"353",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:"Mosquito noise appears as small, moving, and blocky artifacts around sharp edges or fine details in videos or images. They are mostly found in videos that are compressed using the DCT algorithm we talked about earlier, such as MPEG videos or JPEG images."})]})}function d(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var o=i(6540);const n={},s=o.createContext(n);function a(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8aacd032.7172a8bf.js b/assets/js/8aacd032.7172a8bf.js new file mode 100644 index 000000000..b5d67df82 --- /dev/null +++ b/assets/js/8aacd032.7172a8bf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2897],{2458:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>a,contentTitle:()=>d,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"video/AV1","title":"AV1","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/AV1.mdx","sourceDirName":"video","slug":"/video/AV1","permalink":"/docs/video/AV1","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AV1.mdx","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"AV1","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"VP9","permalink":"/docs/video/VP9"},"next":{"title":"AVS3","permalink":"/docs/video/AVS3"}}');var n=o(4848),r=o(8453);const s={title:"AV1",sidebar_position:6},d="AV1",a={},c=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"av1",children:"AV1"})}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(i.p,{children:["AV1 is a royalty-free video compression format designed to succeed ",(0,n.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),". It presently competes with ",(0,n.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),", ",(0,n.jsx)(i.a,{href:"/docs/video/VVC",children:"VVC"}),", and ",(0,n.jsx)(i.a,{href:"/docs/video/HEVC",children:"HEVC"}),". AV1 is computationally more complex than VP9, but is fast to decode due to the mature and efficient dav1d AV1 decoder. AV1 hardware accelerated decoding is also available on a variety of different consumer hardware devices, all of which are enumerated ",(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/AV1#Hardware",children:"on Wikipedia"}),". Standout entries include modern Intel, AMD, & Nvidia integrated & discrete GPUs, Google's Tensor SoC powering the Pixel line, Apple's A17 Pro in the iPhone 15 Pro series, and modern Mediatek & Qualcomm chips. YouTube is currently in the process of transitioning their videos to use AV1."]}),"\n",(0,n.jsxs)(i.p,{children:["There are a number of viable AV1 encoding solutions available today. The three best, most ubiquitous, and free implementations are ",(0,n.jsx)(i.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),", ",(0,n.jsx)(i.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", & ",(0,n.jsx)(i.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),"."]})]})}function u(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>s,x:()=>d});var t=o(6540);const n={},r=t.createContext(n);function s(e){const i=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),t.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8aacd032.b71489f2.js b/assets/js/8aacd032.b71489f2.js deleted file mode 100644 index 82f75e30d..000000000 --- a/assets/js/8aacd032.b71489f2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2897],{6669:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var t=o(4848),n=o(8453);const r={title:"AV1",sidebar_position:6},s="AV1",d={id:"video/AV1",title:"AV1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/AV1.mdx",sourceDirName:"video",slug:"/video/AV1",permalink:"/docs/video/AV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AV1.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"AV1",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"VP9",permalink:"/docs/video/VP9"},next:{title:"AVS3",permalink:"/docs/video/AVS3"}},a={},c=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"av1",children:"AV1"})}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(i.p,{children:["AV1 is a royalty-free video compression format designed to succeed ",(0,t.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),". It presently competes with ",(0,t.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),", ",(0,t.jsx)(i.a,{href:"/docs/video/VVC",children:"VVC"}),", and ",(0,t.jsx)(i.a,{href:"/docs/video/HEVC",children:"HEVC"}),". AV1 is computationally more complex than VP9, but is fast to decode due to the mature and efficient dav1d AV1 decoder. AV1 hardware accelerated decoding is also available on a variety of different consumer hardware devices, all of which are enumerated ",(0,t.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/AV1#Hardware",children:"on Wikipedia"}),". Standout entries include modern Intel, AMD, & Nvidia integrated & discrete GPUs, Google's Tensor SoC powering the Pixel line, Apple's A17 Pro in the iPhone 15 Pro series, and modern Mediatek & Qualcomm chips. YouTube is currently in the process of transitioning their videos to use AV1."]}),"\n",(0,t.jsxs)(i.p,{children:["There are a number of viable AV1 encoding solutions available today. The three best, most ubiquitous, and free implementations are ",(0,t.jsx)(i.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),", ",(0,t.jsx)(i.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", & ",(0,t.jsx)(i.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),"."]})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>s,x:()=>d});var t=o(6540);const n={},r=t.createContext(n);function s(e){const i=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),t.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8bdabb45.7ff3db00.js b/assets/js/8bdabb45.7ff3db00.js deleted file mode 100644 index 3e04f4789..000000000 --- a/assets/js/8bdabb45.7ff3db00.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7957],{5575:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>t,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var o=i(4848),s=i(8453);const r={label:"AVM",sidebar_position:15},t="AVM",c={id:"encoders/AVM",title:"AVM",description:"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media.",source:"@site/docs/encoders/AVM.mdx",sourceDirName:"encoders",slug:"/encoders/AVM",permalink:"/docs/encoders/AVM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/AVM.mdx",tags:[],version:"current",sidebarPosition:15,frontMatter:{label:"AVM",sidebar_position:15},sidebar:"tutorialSidebar",previous:{title:"VTM",permalink:"/docs/encoders/VTM"},next:{title:"HM",permalink:"/docs/encoders/HM"}},d={},l=[{value:"Rumors",id:"rumors",level:2},{value:"Installation",id:"installation",level:2},{value:"Arch Linux",id:"arch-linux",level:3},{value:"Compiling",id:"compiling",level:3},{value:"Usage",id:"usage",level:2},{value:"aomdec",id:"aomdec",level:2}];function a(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"avm",children:"AVM"})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/avm",children:"AVM"}),", or ",(0,o.jsx)(n.strong,{children:"A"}),"OM ",(0,o.jsx)(n.strong,{children:"V"}),"ideo ",(0,o.jsx)(n.strong,{children:"M"}),"odel is the reference implementation for a future codec from the Alliance for Open Media, the organization behind ",(0,o.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"}),".\nThe codebase is under the Clear BSD license and currently only produces ",(0,o.jsx)(n.code,{children:"av01"})," bitstreams."]}),"\n",(0,o.jsx)(n.p,{children:"The AVM codec is currently in development and is not yet ready for production use. Not much has been documented or tested."}),"\n",(0,o.jsx)(n.h2,{id:"rumors",children:"Rumors"}),"\n",(0,o.jsx)(n.p,{children:"Some things about the new encoding implementation can be confirmed via the codebase, but none of those changes are final until the codec is standardized and officially released."}),"\n",(0,o.jsx)(n.p,{children:"Some rumors about the codec include:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"The name of the codec is going to be AV2, superseding AV1"}),"\n",(0,o.jsx)(n.li,{children:"The codec will be based on AV1, with certain backwards compatibility features available"}),"\n",(0,o.jsx)(n.li,{children:"Hardware decoding implementations could be implemented at no cost (no royalties) by utilizing GPU shaders and existing AV1 decoding hardware."}),"\n",(0,o.jsxs)(n.li,{children:['AOM\'s strategy will be to release codecs "mid-cycle" relative to ISO/ITU\'s release schedule, meaning it is likely that "AV2" will compete with ',(0,o.jsx)(n.a,{href:"/docs/video/VVC",children:"VVC"}),", not ",(0,o.jsx)(n.a,{href:"/docs/video/ECM",children:"ECM"}),"."]}),"\n",(0,o.jsx)(n.li,{children:"A quantizer scale of 0-255 will be standard."}),"\n",(0,o.jsxs)(n.li,{children:["AVM tries to address some issues with high-fidelity AV1 encoding by introducing a better denoiser to mitigate ",(0,o.jsx)(n.a,{href:"/docs/introduction/video-artifacts#mosquito-noise",children:"mosquito noise"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(n.h3,{id:"arch-linux",children:"Arch Linux"}),"\n",(0,o.jsxs)(n.p,{children:["AVM is available in the Arch User Repository (AUR) as ",(0,o.jsx)(n.code,{children:"avm"})," and ",(0,o.jsx)(n.code,{children:"avm-git"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"compiling",children:"Compiling"}),"\n",(0,o.jsxs)(n.p,{children:["Since this encoder is under heavy development, there are no pre-built binaries provided, so you will need to compile yourself.\nWindows users are recommended to compile via MinGW-W64 which comes with ",(0,o.jsx)(n.a,{href:"https://msys2.org/",children:"MSYS2"}),"."]}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"Compilation requires CMake, Nasm, and Perl."})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/avm.git\ncd avm/build\ncmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0\nmake -j$(nproc)\n"})}),"\n",(0,o.jsx)(n.p,{children:"Since this is a huge project, compiling will take a while depending on your CPU."}),"\n",(0,o.jsxs)(n.p,{children:["The resulting binary will be called ",(0,o.jsx)(n.code,{children:"aomenc"}),", the same name that encodes content to AV1.\nIt will be available in the same folder (",(0,o.jsx)(n.code,{children:"build"}),"), or you can run ",(0,o.jsx)(n.code,{children:"make install"})," on Linux to install (May need elevated permissions)."]}),"\n",(0,o.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["To convert ",(0,o.jsx)(n.code,{children:"cq-level"})," in aomenc and ",(0,o.jsx)(n.code,{children:"crf"})," in SVT-AV1 to AVM's QP values, multiply by 4. For example, ",(0,o.jsx)(n.code,{children:"--cq-level 20"})," equals to ",(0,o.jsx)(n.code,{children:"--quantizer 60"}),"."]})}),"\n",(0,o.jsxs)(n.p,{children:["Simple Y4M input with QP 65, and ",(0,o.jsx)(n.code,{children:"ivf"})," output:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"aomenc --qp=65 -o output.ivf input.y4m\n"})}),"\n",(0,o.jsx)(n.p,{children:"Preset level 6 (higher is faster), QP 65, Y4M input:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"aomenc --qp=65 --cpu-used=6 -o output.ivf input.y4m\n"})}),"\n",(0,o.jsx)(n.p,{children:"FFmpeg piping:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc --qp=65 --cpu-used=6 -o output.ivf -\n"})}),"\n",(0,o.jsx)(n.h2,{id:"aomdec",children:"aomdec"}),"\n",(0,o.jsxs)(n.p,{children:["You will need the ",(0,o.jsx)(n.code,{children:"aomdec"})," binary you also compiled to be able to play your encoded video, as there are ",(0,o.jsx)(n.strong,{children:"zero"})," video players currently in the whole world that can play your encoded content."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>c});var o=i(6540);const s={},r=o.createContext(s);function t(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8bdabb45.ddb8e58e.js b/assets/js/8bdabb45.ddb8e58e.js new file mode 100644 index 000000000..886be3c2c --- /dev/null +++ b/assets/js/8bdabb45.ddb8e58e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7957],{130:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"encoders/AVM","title":"AVM","description":"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media.","source":"@site/docs/encoders/AVM.mdx","sourceDirName":"encoders","slug":"/encoders/AVM","permalink":"/docs/encoders/AVM","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/AVM.mdx","tags":[],"version":"current","sidebarPosition":15,"frontMatter":{"label":"AVM","sidebar_position":15},"sidebar":"tutorialSidebar","previous":{"title":"VTM","permalink":"/docs/encoders/VTM"},"next":{"title":"HM","permalink":"/docs/encoders/HM"}}');var s=i(4848),r=i(8453);const t={label:"AVM",sidebar_position:15},c="AVM",d={},l=[{value:"Rumors",id:"rumors",level:2},{value:"Installation",id:"installation",level:2},{value:"Arch Linux",id:"arch-linux",level:3},{value:"Compiling",id:"compiling",level:3},{value:"Usage",id:"usage",level:2},{value:"aomdec",id:"aomdec",level:2}];function a(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"avm",children:"AVM"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/avm",children:"AVM"}),", or ",(0,s.jsx)(n.strong,{children:"A"}),"OM ",(0,s.jsx)(n.strong,{children:"V"}),"ideo ",(0,s.jsx)(n.strong,{children:"M"}),"odel is the reference implementation for a future codec from the Alliance for Open Media, the organization behind ",(0,s.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"}),".\nThe codebase is under the Clear BSD license and currently only produces ",(0,s.jsx)(n.code,{children:"av01"})," bitstreams."]}),"\n",(0,s.jsx)(n.p,{children:"The AVM codec is currently in development and is not yet ready for production use. Not much has been documented or tested."}),"\n",(0,s.jsx)(n.h2,{id:"rumors",children:"Rumors"}),"\n",(0,s.jsx)(n.p,{children:"Some things about the new encoding implementation can be confirmed via the codebase, but none of those changes are final until the codec is standardized and officially released."}),"\n",(0,s.jsx)(n.p,{children:"Some rumors about the codec include:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The name of the codec is going to be AV2, superseding AV1"}),"\n",(0,s.jsx)(n.li,{children:"The codec will be based on AV1, with certain backwards compatibility features available"}),"\n",(0,s.jsx)(n.li,{children:"Hardware decoding implementations could be implemented at no cost (no royalties) by utilizing GPU shaders and existing AV1 decoding hardware."}),"\n",(0,s.jsxs)(n.li,{children:['AOM\'s strategy will be to release codecs "mid-cycle" relative to ISO/ITU\'s release schedule, meaning it is likely that "AV2" will compete with ',(0,s.jsx)(n.a,{href:"/docs/video/VVC",children:"VVC"}),", not ",(0,s.jsx)(n.a,{href:"/docs/video/ECM",children:"ECM"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"A quantizer scale of 0-255 will be standard."}),"\n",(0,s.jsxs)(n.li,{children:["AVM tries to address some issues with high-fidelity AV1 encoding by introducing a better denoiser to mitigate ",(0,s.jsx)(n.a,{href:"/docs/introduction/video-artifacts#mosquito-noise",children:"mosquito noise"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(n.h3,{id:"arch-linux",children:"Arch Linux"}),"\n",(0,s.jsxs)(n.p,{children:["AVM is available in the Arch User Repository (AUR) as ",(0,s.jsx)(n.code,{children:"avm"})," and ",(0,s.jsx)(n.code,{children:"avm-git"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"compiling",children:"Compiling"}),"\n",(0,s.jsxs)(n.p,{children:["Since this encoder is under heavy development, there are no pre-built binaries provided, so you will need to compile yourself.\nWindows users are recommended to compile via MinGW-W64 which comes with ",(0,s.jsx)(n.a,{href:"https://msys2.org/",children:"MSYS2"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsx)(n.p,{children:"Compilation requires CMake, Nasm, and Perl."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/avm.git\ncd avm/build\ncmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0\nmake -j$(nproc)\n"})}),"\n",(0,s.jsx)(n.p,{children:"Since this is a huge project, compiling will take a while depending on your CPU."}),"\n",(0,s.jsxs)(n.p,{children:["The resulting binary will be called ",(0,s.jsx)(n.code,{children:"aomenc"}),", the same name that encodes content to AV1.\nIt will be available in the same folder (",(0,s.jsx)(n.code,{children:"build"}),"), or you can run ",(0,s.jsx)(n.code,{children:"make install"})," on Linux to install (May need elevated permissions)."]}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["To convert ",(0,s.jsx)(n.code,{children:"cq-level"})," in aomenc and ",(0,s.jsx)(n.code,{children:"crf"})," in SVT-AV1 to AVM's QP values, multiply by 4. For example, ",(0,s.jsx)(n.code,{children:"--cq-level 20"})," equals to ",(0,s.jsx)(n.code,{children:"--quantizer 60"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["Simple Y4M input with QP 65, and ",(0,s.jsx)(n.code,{children:"ivf"})," output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"aomenc --qp=65 -o output.ivf input.y4m\n"})}),"\n",(0,s.jsx)(n.p,{children:"Preset level 6 (higher is faster), QP 65, Y4M input:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"aomenc --qp=65 --cpu-used=6 -o output.ivf input.y4m\n"})}),"\n",(0,s.jsx)(n.p,{children:"FFmpeg piping:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc --qp=65 --cpu-used=6 -o output.ivf -\n"})}),"\n",(0,s.jsx)(n.h2,{id:"aomdec",children:"aomdec"}),"\n",(0,s.jsxs)(n.p,{children:["You will need the ",(0,s.jsx)(n.code,{children:"aomdec"})," binary you also compiled to be able to play your encoded video, as there are ",(0,s.jsx)(n.strong,{children:"zero"})," video players currently in the whole world that can play your encoded content."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>c});var o=i(6540);const s={},r=o.createContext(s);function t(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8eb2df80.1b3bf215.js b/assets/js/8eb2df80.1b3bf215.js new file mode 100644 index 000000000..83b81ffac --- /dev/null +++ b/assets/js/8eb2df80.1b3bf215.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7796],{1683:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"utilities/rav1ator-cli","title":"rav1ator-cli","description":"rAV1ator CLI, or just rav1ator-cli, is a TUI tool that provides an interactive command line interface for encoding videos with Av1an using various different encoders including rav1e, aomenc (specifically aom-av1-lavish, as mentioned in the aomenc page), SVT-AV1, x265, and x264.","source":"@site/docs/utilities/rav1ator-cli.mdx","sourceDirName":"utilities","slug":"/utilities/rav1ator-cli","permalink":"/docs/utilities/rav1ator-cli","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rav1ator-cli.mdx","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"rav1ator-cli","sidebar_position":6,"templating":true},"sidebar":"tutorialSidebar","previous":{"title":"rAV1ator","permalink":"/docs/utilities/rAV1ator"},"next":{"title":"NMKODER","permalink":"/docs/utilities/nmkoder"}}');var r=t(4848),s=t(8453);t(1470),t(9365);const a={title:"rav1ator-cli",sidebar_position:6,templating:!0},o="rAV1ator CLI",l={},c=[{value:"Installation",id:"installation",level:2},{value:"Linux (Arch)",id:"linux-arch",level:2},{value:"Linux (Other)",id:"linux-other",level:2},{value:"Windows",id:"windows",level:2},{value:"Basic installtion",id:"basic-installtion",level:3},{value:"After the Installation and Cleanup, How Do I Start Arch?",id:"after-the-installation-and-cleanup-how-do-i-start-arch",level:3},{value:"Unlock WSL RAM Usage (Optional)",id:"unlock-wsl-ram-usage-optional",level:3},{value:"macOS",id:"macos",level:2},{value:"Troubleshooting",id:"troubleshooting",level:3}];function h(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"rav1ator-cli",children:"rAV1ator CLI"})}),"\n",(0,r.jsxs)(n.p,{children:["rAV1ator CLI, or just ",(0,r.jsx)(n.code,{children:"rav1ator-cli"}),", is a TUI tool that provides an interactive command line interface for encoding videos with ",(0,r.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," using various different encoders including ",(0,r.jsx)(n.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", ",(0,r.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc"})," (specifically aom-av1-lavish, as mentioned in the aomenc page), ",(0,r.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,r.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),", and ",(0,r.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'~ > rav1ator-cli -h\nrAV1ator: CLI Edition_ v0.2.0\n\nUsage:\n\trav1ator-cli [input] [output] [--offline]\n\nDependencies (Arch): \n\trust ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n\nOptions: (Currently, only one option is useful at a time)\n\t-h, --help\t\t\tPrint this help section\n\t-l, --last-used\t\tPrint last used encode settings from history\n\t-f, --full-history\tPrint full history from ".rav1ator-cli-history" file\n\t-b, --binaries\t\tJust install binaries, then exit\n\t-x, --offline\t\tDon\'t check for updates.\n\t-a, --batch\t\t\tBatch encode. All video files in a directory specified after this flag are encoded.\n'})}),"\n",(0,r.jsx)(n.p,{children:"rAV1ator CLI can:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Check if it is installed & up to date on its own without a package manager"}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Download AVX2-optimized encoder binaries compiled with -O3 -flto in most cases & allow the user to install them with detailed instructions"}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remember encoding history and let you view your whole history or your most recent command"}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Allow you to encode an entire directory of video files with the same settings"}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Encode with x264, x265, aomenc, SVT-AV1, or rav1e, set a speed preset, CRF/quality value, FFmpeg parameters, and encoder parameters"}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Generate Av1an encoding commands with the user's chosen settings & run them to encode a provided input video to an MKV output."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Encode from scratch, or resume a previous rAV1ator CLI encode"}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Engage with rich interactivity features like spinners, prompts, & dropdowns"}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Automatically error check binaries with SHA256 hashes for security & convenience"}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Overall, it aims to provide an easy way to encode videos on the command line with helpful visual feedback. The interactive prompts help users pick encoding settings without needing deep encoding knowledge."}),"\n",(0,r.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo1.avif",alt:"rAV1ator-cli: Demo 1"}),"\n",(0,r.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo2.avif",alt:"rAV1ator-cli: Demo 2"}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.p,{children:"rAV1ator CLI is natively supported on Linux, & is supported on Windows via WSL2. A tutorial for setting up WSL2 is provided below. macOS is not supported."}),"\n",(0,r.jsx)(n.h2,{id:"linux-arch",children:"Linux (Arch)"}),"\n",(0,r.jsxs)(n.p,{children:["These instructions are for Arch Linux specifically. Other distros should be very similar, and packages that are Arch-specific will be labelled. If you're on Ubuntu, you should see the relevant section of the ",(0,r.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site."]}),"\n",(0,r.jsxs)(n.p,{children:["If you're on another distro and you want to be able to follow these instructions specifically, see the ",(0,r.jsx)(n.a,{href:"#linux-other",children:"Linux (Other)"})," section."]}),"\n",(0,r.jsxs)(n.ol,{start:"0",children:["\n",(0,r.jsx)(n.li,{children:"Update your system before doing anything. On Arch:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Install ",(0,r.jsx)(n.code,{children:"yay"})," (Arch only) by running the following commands:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S --needed base-devel git\ngit clone https://aur.archlinux.org/yay.git\ncd yay && makepkg -si\n"})}),"\n",(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsx)(n.li,{children:"Next, you'll want to install all of rav1ator-cli's dependencies. You can do that by running:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"yay -Syu openssl ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n"})}),"\n",(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsx)(n.li,{children:"Install rav1ator-cli:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli\nsudo cp rav1ator-cli /usr/local/bin\n"})}),"\n",(0,r.jsxs)(n.p,{children:["You're done! Run ",(0,r.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,r.jsx)(n.h2,{id:"linux-other",children:"Linux (Other)"}),"\n",(0,r.jsxs)(n.p,{children:["If you're on Ubuntu, you can see the relevant section of the ",(0,r.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site for more information about doing this ",(0,r.jsx)(n.em,{children:"without"})," a distrobox. However, a distrobox is valuable because you can use Arch's fast-paced package management on other distros. Distroboxes are generally easier than Docker for beginners, and use Docker or Podman behind the scenes anyway. This tutorial will focus on using Distrobox with Podman."]}),"\n",(0,r.jsxs)(n.ol,{start:"0",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Install Distrobox and Podman on your distro of choice. Please look up how to do this for your respective distro, and how to get everything set up properly."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["If you already use Podman, are re-creating a Distrobox, or you already have other Distroboxes running from long enough ago where your Arch image is outdated, you might want to run ",(0,r.jsx)(n.code,{children:"podman image rm docker.io/archlinux/archlinux:latest"}),". It won't hurt to run it anyway if you're not sure. ",(0,r.jsx)(n.strong,{children:"Do this every time you make a new Distrobox if you're experiencing issues with Distrobox creation"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Now, run ",(0,r.jsx)(n.code,{children:"distrobox-create --name rvcli-box --image archlinux:latest"}),". You do not need to name yours \"rvcli-box\", but that's what we're going to call the box in this tutorial."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"distrobox enter rvcli-box"})," to go inside. You are now using Arch Linux from within your existing distro!"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["First, run ",(0,r.jsx)(n.code,{children:"sudo pacman -Syu"})," to update your system."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Next, run ",(0,r.jsx)(n.code,{children:"sudo pacman -S --needed base-devel git && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Finally, ",(0,r.jsx)(n.code,{children:"yay -Syu openssl ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2"})," to install the necessary dependencies."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Download rav1ator-cli: ",(0,r.jsx)(n.code,{children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli"})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Copy rav1ator-cli to your /usr/local/bin: ",(0,r.jsx)(n.code,{children:"sudo cp rav1ator-cli /usr/local/bin"})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["If you'd like to exit the distrobox, just do ",(0,r.jsx)(n.code,{children:"Ctrl"})," + ",(0,r.jsx)(n.code,{children:"D"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You're done! Run ",(0,r.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,r.jsx)(n.h2,{id:"windows",children:"Windows"}),"\n",(0,r.jsx)(n.admonition,{title:"Windows",type:"note",children:(0,r.jsxs)(n.p,{children:["The content in this entry was written by pat-e, or ",(0,r.jsx)(n.code,{children:"pate"})," on Discord. This tutorial focuses on Windows 11."]})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:'Enable WSL2 on Windows 11 and Install "ArchWSL2"'})," by pat-e"]}),"\n",(0,r.jsx)(n.h3,{id:"basic-installtion",children:"Basic installtion"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Open the Terminal as Administrator:",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/01_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"In the Command-Prompt, enter the following to install WSL:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-pwsh",children:"wsl.exe --install --no-distribution\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/02_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsxs)(n.p,{children:['If the "Host Process for Windows Services" asks for allowing changes, approve it (Press "Yes"):',(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/03_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Once the installation of WSL is finished, restart your Computer:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-pwsh",children:"shutdown -r -f -t 1\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/04_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["From ",(0,r.jsx)(n.a,{href:"https://github.com/sileshn/ArchWSL2",children:"This GitHub link"}),", download the latest release of ArchWSL2 in the Releases section:",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/06_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["On your SSD, create a folder where we will place the ArchWSL2 files. This folder ",(0,r.jsx)(n.strong,{children:"must be kept and never deleted"})," as this will contain the base files for this distribution. It is advised to use an SSD instead of an HDD. The storage must be local storage, not a network-share or a removable disk. In our example, we will create a folder located at C:\\Stuff\\ArchWSL2;",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/07_wsl_rv-cli.avif",alt:""})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/08_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'Extract the downloaded ZIP of "ArchWSL2" into your newly created folder:'}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/09_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'Once extracted, start the extracted "Arch.exe":'}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/10_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'On first start, the program will create a virtual disk (VHDx). Once finished, press "Enter" to continue (it will close the window)'}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/11_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:['Once the virtual hard disk is created, restart the "arch.exe" again. It will finish some steps and ask for creating a new user-account. ',(0,r.jsx)(n.strong,{children:"This account is completely separate from your Windows user."})," Please remember the username and password you use."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/12_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/13_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"The Window will close and reopen again. As first step, update all packages. As your account you created earlier is in the sudo-group, you have to enter your password again as confirmation."}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/14_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsxs)(n.ol,{start:"11",children:["\n",(0,r.jsx)(n.li,{children:'Approve the installation of all the updates (Type "y"):'}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/15_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsxs)(n.ol,{start:"12",children:["\n",(0,r.jsx)(n.li,{children:"Done... You can now use ArchWSL2."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"after-the-installation-and-cleanup-how-do-i-start-arch",children:"After the Installation and Cleanup, How Do I Start Arch?"}),"\n",(0,r.jsx)(n.p,{children:"For the start of Arch, there are 2 steps possible:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'You can just start "wsl" form the command prompt, terminal or "Windows Search":'}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/20_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/21_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'As another option, you can create a Shortcut to the "arch.exe" in the Installation-Folder:'}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/22_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/23_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/24_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Hint"}),': When you open the "arch.exe", you will be placed into the directory where also the "arch.exe" is located. To change to your home directory, just enter the command below:']}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd ~\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/25_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsx)(n.h3,{id:"unlock-wsl-ram-usage-optional",children:"Unlock WSL RAM Usage (Optional)"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Hint"}),": WSL caps RAM usage at 50% of the total RAM available on your system."]}),"\n",(0,r.jsx)(n.p,{children:"When you start the VM, you will see that you only will only have 50% of your total memory available:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/26_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsx)(n.p,{children:"To allow more memory, you need to place a config-file in your profile-folder in Windows. See the instructions below:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'Open "notepad.exe" and enter the following:'}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-txt",children:"[wsl2]\nmemory=12GB\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/27_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"The amount of memory should never be more than current memory. Set it to total memory minus 4GB to leave enough left over for Windows. In my example, Windows has 16GB of RAM available, so I select the memory to be 12GB."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"When saving the file, enter the following as filename:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"%userprofile%"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/28_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"When pressing enter, the directory will switch to your user-profile folder:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/29_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'Select the "Save as type" to "All files (*.*)" and save as the following filename:'}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:".wslconfig"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/30_wsl_rv-cli.avif",alt:""})}),"\n",(0,r.jsxs)(n.p,{children:["Make sure the file is saved as ",(0,r.jsx)(n.code,{children:".wslconfig"}),". Then exit notepad."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Exit any current running WSL / Arch (exit):"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/31_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'Open the Terminal as Administrator and "shutdown" any running WSL:'}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-pwsh",children:"wsl --shutdown\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/32_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Restart WSL again and check the memory settings from within Arch by running the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"free -h\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/33_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If you've made it this far, you should be more than ready to encode. We hope you enjoy rAV1ator CLI!"}),"\n",(0,r.jsx)(n.h2,{id:"macos",children:"macOS"}),"\n",(0,r.jsx)(n.p,{children:"No macOS support is provided at this time. It is definitely technically feasible, and I may produce a separate tool in the future with proper macOS binaries, though this would be a burden to keep up considering I don't currently see any demand for a port."}),"\n",(0,r.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["If your encode features a grey screen flashing occaisonally in the output, create a lossless intermediary of your source with x264 ",(0,r.jsx)(n.code,{children:"-qp 0"}),". This happens because of VC-1 decoding errors, and is not something I can fix."]}),"\n",(0,r.jsxs)(n.li,{children:["If you have any more questions, please join the ",(0,r.jsx)(n.a,{href:"https://discord.gg/bbQD5MjDr3",children:"AV1 for Dummies Discord server"}),". There is a rAV1ator CLI channel over there, and I am always happy to talk!"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var i=t(4164);const r={tabItem:"tabItem_Ymn6"};var s=t(4848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,i.A)(r.tabItem,a),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>w});var i=t(6540),r=t(4164),s=t(3104),a=t(6347),o=t(205),l=t(7485),c=t(1682),h=t(679);function d(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:t}=e;return(0,i.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:i,default:r}}=e;return{value:n,label:t,attributes:i,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const r=(0,a.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(s),(0,i.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})}),[s,r])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=u(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=t.find((e=>e.default))??t[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:s}))),[c,d]=p({queryString:t,groupId:r}),[x,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,s]=(0,h.Dv)(t);return[r,(0,i.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:r}),v=(()=>{const e=c??x;return m({value:e,tabValues:s})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,s]),tabValues:s}}var g=t(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=t(4848);function f(e){let{className:n,block:t,selectedValue:i,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),h=e=>{const n=e.currentTarget,t=l.indexOf(n),r=o[t].value;r!==i&&(c(n),a(r))},d=e=>{let n=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:i===n?0:-1,"aria-selected":i===n,ref:e=>l.push(e),onKeyDown:d,onClick:h,...s,className:(0,r.A)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":i===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:s}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===s));return e?(0,i.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function y(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,r.A)("tabs-container",v.tabList),children:[(0,j.jsx)(f,{...n,...e}),(0,j.jsx)(b,{...n,...e})]})}function w(e){const n=(0,g.A)();return(0,j.jsx)(y,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var i=t(6540);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8eb2df80.251d8abd.js b/assets/js/8eb2df80.251d8abd.js deleted file mode 100644 index 81714876f..000000000 --- a/assets/js/8eb2df80.251d8abd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7796],{5101:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=t(4848),r=t(8453);t(1470),t(9365);const s={title:"rav1ator-cli",sidebar_position:6,templating:!0},a="rAV1ator CLI",o={id:"utilities/rav1ator-cli",title:"rav1ator-cli",description:"rAV1ator CLI, or just rav1ator-cli, is a TUI tool that provides an interactive command line interface for encoding videos with Av1an using various different encoders including rav1e, aomenc (specifically aom-av1-lavish, as mentioned in the aomenc page), SVT-AV1, x265, and x264.",source:"@site/docs/utilities/rav1ator-cli.mdx",sourceDirName:"utilities",slug:"/utilities/rav1ator-cli",permalink:"/docs/utilities/rav1ator-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rav1ator-cli.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"rav1ator-cli",sidebar_position:6,templating:!0},sidebar:"tutorialSidebar",previous:{title:"rAV1ator",permalink:"/docs/utilities/rAV1ator"},next:{title:"NMKODER",permalink:"/docs/utilities/nmkoder"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Linux (Arch)",id:"linux-arch",level:2},{value:"Linux (Other)",id:"linux-other",level:2},{value:"Windows",id:"windows",level:2},{value:"Basic installtion",id:"basic-installtion",level:3},{value:"After the Installation and Cleanup, How Do I Start Arch?",id:"after-the-installation-and-cleanup-how-do-i-start-arch",level:3},{value:"Unlock WSL RAM Usage (Optional)",id:"unlock-wsl-ram-usage-optional",level:3},{value:"macOS",id:"macos",level:2},{value:"Troubleshooting",id:"troubleshooting",level:3}];function h(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"rav1ator-cli",children:"rAV1ator CLI"})}),"\n",(0,i.jsxs)(n.p,{children:["rAV1ator CLI, or just ",(0,i.jsx)(n.code,{children:"rav1ator-cli"}),", is a TUI tool that provides an interactive command line interface for encoding videos with ",(0,i.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," using various different encoders including ",(0,i.jsx)(n.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc"})," (specifically aom-av1-lavish, as mentioned in the aomenc page), ",(0,i.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),", and ",(0,i.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'~ > rav1ator-cli -h\nrAV1ator: CLI Edition_ v0.2.0\n\nUsage:\n\trav1ator-cli [input] [output] [--offline]\n\nDependencies (Arch): \n\trust ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n\nOptions: (Currently, only one option is useful at a time)\n\t-h, --help\t\t\tPrint this help section\n\t-l, --last-used\t\tPrint last used encode settings from history\n\t-f, --full-history\tPrint full history from ".rav1ator-cli-history" file\n\t-b, --binaries\t\tJust install binaries, then exit\n\t-x, --offline\t\tDon\'t check for updates.\n\t-a, --batch\t\t\tBatch encode. All video files in a directory specified after this flag are encoded.\n'})}),"\n",(0,i.jsx)(n.p,{children:"rAV1ator CLI can:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check if it is installed & up to date on its own without a package manager"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Download AVX2-optimized encoder binaries compiled with -O3 -flto in most cases & allow the user to install them with detailed instructions"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Remember encoding history and let you view your whole history or your most recent command"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Allow you to encode an entire directory of video files with the same settings"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Encode with x264, x265, aomenc, SVT-AV1, or rav1e, set a speed preset, CRF/quality value, FFmpeg parameters, and encoder parameters"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Generate Av1an encoding commands with the user's chosen settings & run them to encode a provided input video to an MKV output."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Encode from scratch, or resume a previous rAV1ator CLI encode"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Engage with rich interactivity features like spinners, prompts, & dropdowns"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Automatically error check binaries with SHA256 hashes for security & convenience"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Overall, it aims to provide an easy way to encode videos on the command line with helpful visual feedback. The interactive prompts help users pick encoding settings without needing deep encoding knowledge."}),"\n",(0,i.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo1.avif",alt:"rAV1ator-cli: Demo 1"}),"\n",(0,i.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo2.avif",alt:"rAV1ator-cli: Demo 2"}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"rAV1ator CLI is natively supported on Linux, & is supported on Windows via WSL2. A tutorial for setting up WSL2 is provided below. macOS is not supported."}),"\n",(0,i.jsx)(n.h2,{id:"linux-arch",children:"Linux (Arch)"}),"\n",(0,i.jsxs)(n.p,{children:["These instructions are for Arch Linux specifically. Other distros should be very similar, and packages that are Arch-specific will be labelled. If you're on Ubuntu, you should see the relevant section of the ",(0,i.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site."]}),"\n",(0,i.jsxs)(n.p,{children:["If you're on another distro and you want to be able to follow these instructions specifically, see the ",(0,i.jsx)(n.a,{href:"#linux-other",children:"Linux (Other)"})," section."]}),"\n",(0,i.jsxs)(n.ol,{start:"0",children:["\n",(0,i.jsx)(n.li,{children:"Update your system before doing anything. On Arch:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.code,{children:"yay"})," (Arch only) by running the following commands:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S --needed base-devel git\ngit clone https://aur.archlinux.org/yay.git\ncd yay && makepkg -si\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Next, you'll want to install all of rav1ator-cli's dependencies. You can do that by running:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"yay -Syu openssl ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Install rav1ator-cli:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli\nsudo cp rav1ator-cli /usr/local/bin\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You're done! Run ",(0,i.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,i.jsx)(n.h2,{id:"linux-other",children:"Linux (Other)"}),"\n",(0,i.jsxs)(n.p,{children:["If you're on Ubuntu, you can see the relevant section of the ",(0,i.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site for more information about doing this ",(0,i.jsx)(n.em,{children:"without"})," a distrobox. However, a distrobox is valuable because you can use Arch's fast-paced package management on other distros. Distroboxes are generally easier than Docker for beginners, and use Docker or Podman behind the scenes anyway. This tutorial will focus on using Distrobox with Podman."]}),"\n",(0,i.jsxs)(n.ol,{start:"0",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Install Distrobox and Podman on your distro of choice. Please look up how to do this for your respective distro, and how to get everything set up properly."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you already use Podman, are re-creating a Distrobox, or you already have other Distroboxes running from long enough ago where your Arch image is outdated, you might want to run ",(0,i.jsx)(n.code,{children:"podman image rm docker.io/archlinux/archlinux:latest"}),". It won't hurt to run it anyway if you're not sure. ",(0,i.jsx)(n.strong,{children:"Do this every time you make a new Distrobox if you're experiencing issues with Distrobox creation"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Now, run ",(0,i.jsx)(n.code,{children:"distrobox-create --name rvcli-box --image archlinux:latest"}),". You do not need to name yours \"rvcli-box\", but that's what we're going to call the box in this tutorial."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"distrobox enter rvcli-box"})," to go inside. You are now using Arch Linux from within your existing distro!"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["First, run ",(0,i.jsx)(n.code,{children:"sudo pacman -Syu"})," to update your system."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Next, run ",(0,i.jsx)(n.code,{children:"sudo pacman -S --needed base-devel git && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Finally, ",(0,i.jsx)(n.code,{children:"yay -Syu openssl ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2"})," to install the necessary dependencies."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Download rav1ator-cli: ",(0,i.jsx)(n.code,{children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Copy rav1ator-cli to your /usr/local/bin: ",(0,i.jsx)(n.code,{children:"sudo cp rav1ator-cli /usr/local/bin"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you'd like to exit the distrobox, just do ",(0,i.jsx)(n.code,{children:"Ctrl"})," + ",(0,i.jsx)(n.code,{children:"D"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You're done! Run ",(0,i.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,i.jsx)(n.h2,{id:"windows",children:"Windows"}),"\n",(0,i.jsx)(n.admonition,{title:"Windows",type:"note",children:(0,i.jsxs)(n.p,{children:["The content in this entry was written by pat-e, or ",(0,i.jsx)(n.code,{children:"pate"})," on Discord. This tutorial focuses on Windows 11."]})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:'Enable WSL2 on Windows 11 and Install "ArchWSL2"'})," by pat-e"]}),"\n",(0,i.jsx)(n.h3,{id:"basic-installtion",children:"Basic installtion"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Open the Terminal as Administrator:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/01_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"In the Command-Prompt, enter the following to install WSL:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl.exe --install --no-distribution\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/02_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.p,{children:['If the "Host Process for Windows Services" asks for allowing changes, approve it (Press "Yes"):',(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/03_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Once the installation of WSL is finished, restart your Computer:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"shutdown -r -f -t 1\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/04_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["From ",(0,i.jsx)(n.a,{href:"https://github.com/sileshn/ArchWSL2",children:"This GitHub link"}),", download the latest release of ArchWSL2 in the Releases section:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/06_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["On your SSD, create a folder where we will place the ArchWSL2 files. This folder ",(0,i.jsx)(n.strong,{children:"must be kept and never deleted"})," as this will contain the base files for this distribution. It is advised to use an SSD instead of an HDD. The storage must be local storage, not a network-share or a removable disk. In our example, we will create a folder located at C:\\Stuff\\ArchWSL2;",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/07_wsl_rv-cli.avif",alt:""})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/08_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Extract the downloaded ZIP of "ArchWSL2" into your newly created folder:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/09_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Once extracted, start the extracted "Arch.exe":'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/10_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'On first start, the program will create a virtual disk (VHDx). Once finished, press "Enter" to continue (it will close the window)'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/11_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:['Once the virtual hard disk is created, restart the "arch.exe" again. It will finish some steps and ask for creating a new user-account. ',(0,i.jsx)(n.strong,{children:"This account is completely separate from your Windows user."})," Please remember the username and password you use."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/12_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/13_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"The Window will close and reopen again. As first step, update all packages. As your account you created earlier is in the sudo-group, you have to enter your password again as confirmation."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/14_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"11",children:["\n",(0,i.jsx)(n.li,{children:'Approve the installation of all the updates (Type "y"):'}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/15_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"12",children:["\n",(0,i.jsx)(n.li,{children:"Done... You can now use ArchWSL2."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"after-the-installation-and-cleanup-how-do-i-start-arch",children:"After the Installation and Cleanup, How Do I Start Arch?"}),"\n",(0,i.jsx)(n.p,{children:"For the start of Arch, there are 2 steps possible:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'You can just start "wsl" form the command prompt, terminal or "Windows Search":'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/20_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/21_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'As another option, you can create a Shortcut to the "arch.exe" in the Installation-Folder:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/22_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/23_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/24_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Hint"}),': When you open the "arch.exe", you will be placed into the directory where also the "arch.exe" is located. To change to your home directory, just enter the command below:']}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/25_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.h3,{id:"unlock-wsl-ram-usage-optional",children:"Unlock WSL RAM Usage (Optional)"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Hint"}),": WSL caps RAM usage at 50% of the total RAM available on your system."]}),"\n",(0,i.jsx)(n.p,{children:"When you start the VM, you will see that you only will only have 50% of your total memory available:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/26_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:"To allow more memory, you need to place a config-file in your profile-folder in Windows. See the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Open "notepad.exe" and enter the following:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",children:"[wsl2]\nmemory=12GB\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/27_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"The amount of memory should never be more than current memory. Set it to total memory minus 4GB to leave enough left over for Windows. In my example, Windows has 16GB of RAM available, so I select the memory to be 12GB."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When saving the file, enter the following as filename:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"%userprofile%"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/28_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When pressing enter, the directory will switch to your user-profile folder:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/29_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Select the "Save as type" to "All files (*.*)" and save as the following filename:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:".wslconfig"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/30_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.p,{children:["Make sure the file is saved as ",(0,i.jsx)(n.code,{children:".wslconfig"}),". Then exit notepad."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Exit any current running WSL / Arch (exit):"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/31_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Open the Terminal as Administrator and "shutdown" any running WSL:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --shutdown\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/32_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Restart WSL again and check the memory settings from within Arch by running the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"free -h\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/33_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you've made it this far, you should be more than ready to encode. We hope you enjoy rAV1ator CLI!"}),"\n",(0,i.jsx)(n.h2,{id:"macos",children:"macOS"}),"\n",(0,i.jsx)(n.p,{children:"No macOS support is provided at this time. It is definitely technically feasible, and I may produce a separate tool in the future with proper macOS binaries, though this would be a burden to keep up considering I don't currently see any demand for a port."}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["If your encode features a grey screen flashing occaisonally in the output, create a lossless intermediary of your source with x264 ",(0,i.jsx)(n.code,{children:"-qp 0"}),". This happens because of VC-1 decoding errors, and is not something I can fix."]}),"\n",(0,i.jsxs)(n.li,{children:["If you have any more questions, please join the ",(0,i.jsx)(n.a,{href:"https://discord.gg/bbQD5MjDr3",children:"AV1 for Dummies Discord server"}),". There is a rAV1ator CLI channel over there, and I am always happy to talk!"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var i=t(4164);const r={tabItem:"tabItem_Ymn6"};var s=t(4848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,i.A)(r.tabItem,a),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>w});var i=t(6540),r=t(4164),s=t(3104),a=t(6347),o=t(205),l=t(7485),c=t(1682),h=t(679);function d(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:t}=e;return(0,i.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:i,default:r}}=e;return{value:n,label:t,attributes:i,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const r=(0,a.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(s),(0,i.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})}),[s,r])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=u(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=t.find((e=>e.default))??t[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:s}))),[c,d]=p({queryString:t,groupId:r}),[x,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,s]=(0,h.Dv)(t);return[r,(0,i.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:r}),v=(()=>{const e=c??x;return m({value:e,tabValues:s})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,s]),tabValues:s}}var g=t(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=t(4848);function f(e){let{className:n,block:t,selectedValue:i,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),h=e=>{const n=e.currentTarget,t=l.indexOf(n),r=o[t].value;r!==i&&(c(n),a(r))},d=e=>{let n=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:i===n?0:-1,"aria-selected":i===n,ref:e=>l.push(e),onKeyDown:d,onClick:h,...s,className:(0,r.A)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":i===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:s}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===s));return e?(0,i.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function y(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,r.A)("tabs-container",v.tabList),children:[(0,j.jsx)(f,{...n,...e}),(0,j.jsx)(b,{...n,...e})]})}function w(e){const n=(0,g.A)();return(0,j.jsx)(y,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var i=t(6540);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8ee2fdd1.82e49d7c.js b/assets/js/8ee2fdd1.82e49d7c.js new file mode 100644 index 000000000..1ad3ac2ee --- /dev/null +++ b/assets/js/8ee2fdd1.82e49d7c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8420],{4954:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>h});const s=JSON.parse('{"id":"encoders/aom-av1-lavish","title":"aom-av1-lavish","description":"This entry is about a fork of aomenc called aom-psy101. If you\'d like to learn about the mainline aomenc encoder before reading, visit our aomenc wiki entry.","source":"@site/docs/encoders/aom-av1-lavish.mdx","sourceDirName":"encoders","slug":"/encoders/aom-av1-lavish","permalink":"/docs/encoders/aom-av1-lavish","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aom-av1-lavish.mdx","tags":[],"version":"current","sidebarPosition":18,"frontMatter":{"title":"aom-av1-lavish","sidebar_position":18,"keywords":["AV1","encoding","video encoding","AOM AV1"]},"sidebar":"tutorialSidebar","previous":{"title":"JM","permalink":"/docs/encoders/JM"},"next":{"title":"aom-psy101","permalink":"/docs/encoders/aom-psy101"}}');var a=i(4848),t=i(8453),o=i(1470),l=i(9365);const r={title:"aom-av1-lavish",sidebar_position:18,keywords:["AV1","encoding","video encoding","AOM AV1"]},c="aom-av1-lavish",d={},h=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"AV1 Encoding",id:"av1-encoding",level:3},{value:"AVIF Encoding",id:"avif-encoding",level:3},{value:"Recommendations",id:"recommendations",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"aom-av1-lavish",children:"aom-av1-lavish"})}),"\n",(0,a.jsx)(n.admonition,{title:"Community Fork",type:"info",children:(0,a.jsxs)(n.p,{children:["This entry is about a fork of aomenc called aom-psy101. If you'd like to learn about the mainline aomenc encoder before reading, visit our ",(0,a.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc wiki entry"}),"."]})}),"\n",(0,a.jsxs)(n.p,{children:["Mainline aomenc is unfortunately not perfect. It suffers from bad defaults, a heavy focus on the perceptually flawed ",(0,a.jsx)(n.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," metric, misleading settings, and other issues. Fortunately, there are a couple of forks developed by the encoding community that were created to combat aomenc's underlying issues."]}),"\n",(0,a.jsx)(n.admonition,{title:"No Longer Maintained",type:"warning",children:(0,a.jsx)(n.p,{children:"aom-av1-lavish is no longer maintained as of 4th June 2024. The information in this entry is unaffected by this, but the fact that the project is no longer maintained should be taken into consideration as a user."})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"})," ",(0,a.jsx)(n.em,{children:"No longer maintained as of 13th January 2023"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"})," ",(0,a.jsx)(n.em,{children:"No longer maintained as of 4th June 2024"})]}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"/docs/encoders/aom-psy101",children:"aom-psy101"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://github.com/porcino/aom-av1ador",children:"aom-av1ador"})}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"These forks fix up the poor decisions made by the original AOM devs and most importantly introduce new parameters and tunes to help fine-tune the encoder even more."}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"})," is a fork of aomenc that aims to improve the encoding quality and speed of AV1. It is developed by ",(0,a.jsx)(n.a,{href:"https://github.com/Clybius",children:"Clybius"}),", a talented AV1 community developer also well-known for working on ",(0,a.jsx)(n.a,{href:"/docs/encoders/SVT-AV1-PSY",children:"SVT-AV1-PSY"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,a.jsxs)(n.p,{children:["aomenc is available in FFmpeg via ",(0,a.jsx)(n.code,{children:"libaom-av1"}),", check if you have it by running ",(0,a.jsx)(n.code,{children:"ffmpeg -h encoder=libaom-av1"}),". You can input non-FFmpeg standard aomenc parameters via ",(0,a.jsx)(n.code,{children:"-aom-params"}),"."]}),"\n",(0,a.jsx)(n.admonition,{title:"Mainline aomenc",type:"caution",children:(0,a.jsx)(n.p,{children:"Unless you compile FFmpeg yourself with aom-av1-lavish, you will be using the mainline aomenc. Compiling from source yourself with the aomenc libraries provided by aom-av1-lavish is the only way to use it with FFmpeg."})}),"\n",(0,a.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsxs)(o.A,{children:[(0,a.jsxs)(l.A,{value:"linux",label:"Linux",default:!0,children:[(0,a.jsx)(n.p,{children:(0,a.jsxs)(n.em,{children:["A precompiled AVX2-optimized binary of aom-av1-lavish can be installed for x86_64 Linux via ",(0,a.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,a.jsx)(n.p,{children:"But if you want to compile the community forks, you can also do that. CMake, Perl, GNU Make, and nasm (assuming x64, if x86 use yasm) will be needed for compilation."}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the aom-av1-lavish repo Endless_Merging branch, cd and create build folder"',children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",metastring:'title="CMake configuration"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\n'})}),(0,a.jsx)(n.p,{children:"The CMake config above will statically build aomenc while disabling docs (which requires Doxygen), extra tunes, tests, and decoders. While also applying native CPU optimizations to help speed up the encoder."}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",metastring:'title="Compile the encoder"',children:"make -j$(nproc)\n"})}),(0,a.jsxs)(n.p,{children:["The resulting binary will be in the same folder you are on (",(0,a.jsx)(n.code,{children:"aom_build"}),")."]}),(0,a.jsx)(n.p,{children:"Or, optionally, you can install it to your system, which may need elevated permissions."}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"make install\n"})})]}),(0,a.jsxs)(l.A,{value:"mac",label:"macOS",children:[(0,a.jsxs)(n.p,{children:["macOS is very similar to Linux. Note that some commands may have to be run with ",(0,a.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]}),(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Homebrew"})}),(0,a.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),(0,a.jsx)(n.p,{children:"Installing mainline libaom is as simple as running the following:"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install aom\n"})}),(0,a.jsx)(n.p,{children:"FFmpeg can also be installed via brew."}),(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Building From Source"})}),(0,a.jsx)(n.p,{children:"If you want aom-av1-lavish instead of mainline, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,a.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,a.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:["Homebrew installs ",(0,a.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from libvmaf, libjxl, etc, make sure to copy them from ",(0,a.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,a.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,a.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,a.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. aom-av1-lavish requires some additional steps, though."}),"\n"]}),(0,a.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch, which contains all of the latest lavish improvements:"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),(0,a.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until ",(0,a.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"})," is merged to fix build errors."]}),(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Add the line ",(0,a.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,a.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,a.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,a.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,a.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,a.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),(0,a.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools. While still in the ",(0,a.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root. If it doesn\'t work properly, you can always copy the binary into /usr/local/bin manually:\nmake install\n'})}),(0,a.jsxs)(n.p,{children:["Now you can run ",(0,a.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,a.jsx)(n.code,{children:"aomenc"})," executable to ",(0,a.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,a.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,a.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),(0,a.jsxs)(n.p,{children:["Notice how it says ",(0,a.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,a.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish."]})]}),(0,a.jsxs)(l.A,{value:"wind",label:"Windows",children:[(0,a.jsx)(n.p,{children:"You can download the pre-built versions, which can be found below (Current as of Sept 6, 2023):"}),(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28"})}),(0,a.jsxs)(n.p,{children:["Join the ",(0,a.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," and head to #community-builds for updated versions, you can opt to compile it yourself with the instructions below."]}),(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"The Compiling Route:"})}),(0,a.jsxs)(n.p,{children:["Full credits to u/Turbulent-Bend-7416 on Reddit for ",(0,a.jsx)(n.a,{href:"https://www.reddit.com/r/AV1/comments/s6eh5f/how_to_compile_av1_in_windows_without_crying",children:"this post"})," on how to compile aomenc."]}),(0,a.jsxs)(n.p,{children:["This guide requires ",(0,a.jsx)(n.strong,{children:"MSYS2"}),", specifically ",(0,a.jsx)(n.strong,{children:"MinGW-W64"}),". Install it if you haven't yet."]}),(0,a.jsx)(n.p,{children:"First, install the required dependencies:"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"pacman -S cmake git perl yasm nasm python3 doxygen mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel\n"})}),(0,a.jsx)(n.p,{children:"Now, clone the aom-av1-lavish repo in the Endless_Merging branch and create the folders:"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n"})}),(0,a.jsx)(n.p,{children:"Then we can start compiling with some build optimizations for your CPU:"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n'})}),(0,a.jsxs)(n.p,{children:["The resulting binary will be available within your home folder of the location where you installed MSYS2 (usually ",(0,a.jsx)(n.code,{children:"C:"}),"), navigate there and the to the aom-av1-lavish folder and it should be there."]}),(0,a.jsx)(n.p,{children:'Built files should be in the "Debug" folder'}),(0,a.jsx)(n.p,{children:"Don't share binaries compiled with native CPU optimizations unless the person you're sharing to has the same CPU architecture, as this will lead to missing instructions being used and slowing down encode speeds."})]})]}),"\n",(0,a.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsx)(n.h3,{id:"av1-encoding",children:"AV1 Encoding"}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsx)(n.p,{children:"The way aomenc was developed requires 2-pass to take full advantage of its efficiency which include better rate controls and encoding features. So always use 2 passes when encoding."})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",metastring:'title="Simple Y4M input with CQ 22, 1 pass, and raw ivf bitstream output"',children:"aomenc --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf input.y4m\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 1"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=1 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 2"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=2 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,a.jsx)(n.h3,{id:"avif-encoding",children:"AVIF Encoding"}),"\n",(0,a.jsx)(n.p,{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders. A sample command for encoding AVIF looks like this:"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),"\n",(0,a.jsx)(n.p,{children:"Where:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"-c aom"})," is the encoder"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't parallelize perfectly. Test using a speed benchmark to verify which value works best for you."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8-bit source image."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,a.jsx)(n.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,a.jsxs)(n.p,{children:["aomenc unfortunately lacks the ability to take advantage of multiple threads, so therefore a tool like ",(0,a.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," will be needed for parallelization. The parameters shown will be biased towards Av1an and aom-av1-lavish usage, so if you plan on using standalone aomenc then adjust as needed."]}),"\n",(0,a.jsx)(n.p,{children:"Here are some recommended parameters:"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"--bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 --denoise-noise-level=8"})}),"\n",(0,a.jsx)(n.p,{children:"Now let's break it down."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because weird linear algebra allows the video to become smaller and reduces banding."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster. See the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)("picture",{children:[(0,a.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,a.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",loading:"lazy"})]}),"\n",(0,a.jsxs)(n.admonition,{title:"Tile usage",type:"note",children:[(0,a.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,a.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,a.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,a.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)."]}),(0,a.jsxs)(n.p,{children:["If you would like an easy way to calculate the necessary number of tiles for your video, you can use ",(0,a.jsx)(n.a,{href:"https://autocompressor.net/tools/av1-calculator",children:"the AV1 Encoding Calculator"})," online or run ",(0,a.jsx)(n.a,{href:"https://github.com/gianni-rosato/av1-tile-calc",children:"this local tile calculator"}),"."]})]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,a.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--aq-mode=0"})," adaptive quantization mode, a mostly debatable area nowadays. 0 is better most of the time but some say 1 is also good."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst."]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["Do not use ",(0,a.jsx)(n.code,{children:"tune-content=psy"})," if you encode live action above ",(0,a.jsx)(n.code,{children:"cq-level=30"}),"."]})}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["If you use any of the VMAF tunes, you need to specify ",(0,a.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put VMAF models in."]})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg can't input it."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--deltaq-mode=0"})," set to 0 b its better"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering (smoothing) will be, always been a hot topic. Most agree on the default of 4. Others think 1 is good for 3D Pixar CGI-like and 2D animation and 4 for live action content, and a higher value for lower bitrate encodes."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause Av1an already did scene detection, so we wont have to. Plus it speeds things up."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since Av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--enable-chroma-deltaq=1"})," --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost, ignore it."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well (NLMeans is the denoiser used)."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"--denoise-noise-level=8"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness). Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["You can use photon noise tables as an alternative via ",(0,a.jsx)(n.code,{children:"--film-grain-table"}),", which is also conveniently available in Av1an as ",(0,a.jsx)(n.code,{children:"--photon-noise=X"})]})}),"\n",(0,a.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Use ",(0,a.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes to speed it up without much losses (lavish, butteraugli) and ",(0,a.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n",(0,a.jsxs)(n.li,{children:["Use ",(0,a.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]})]})}function m(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>o});i(6540);var s=i(4164);const a={tabItem:"tabItem_Ymn6"};var t=i(4848);function o(e){let{children:n,hidden:i,className:o}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,s.A)(a.tabItem,o),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>w});var s=i(6540),a=i(4164),t=i(3104),o=i(6347),l=i(205),r=i(7485),c=i(1682),d=i(679);function h(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:s,default:a}}=e;return{value:n,label:i,attributes:s,default:a}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const a=(0,o.W6)(),t=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,r.aZ)(t),(0,s.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(a.location.search);n.set(t,e),a.replace({...a.location,search:n.toString()})}),[t,a])]}function f(e){const{defaultValue:n,queryString:i=!1,groupId:a}=e,t=u(e),[o,r]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=i.find((e=>e.default))??i[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:t}))),[c,h]=p({queryString:i,groupId:a}),[f,g]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,t]=(0,d.Dv)(i);return[a,(0,s.useCallback)((e=>{i&&t.set(e)}),[i,t])]}({groupId:a}),b=(()=>{const e=c??f;return m({value:e,tabValues:t})?e:null})();(0,l.A)((()=>{b&&r(b)}),[b]);return{selectedValue:o,selectValue:(0,s.useCallback)((e=>{if(!m({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);r(e),h(e),g(e)}),[h,g,t]),tabValues:t}}var g=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function v(e){let{className:n,block:i,selectedValue:s,selectValue:o,tabValues:l}=e;const r=[],{blockElementScrollPositionUntilNextRender:c}=(0,t.a_)(),d=e=>{const n=e.currentTarget,i=r.indexOf(n),a=l[i].value;a!==s&&(c(n),o(a))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=r.indexOf(e.currentTarget)+1;n=r[i]??r[0];break}case"ArrowLeft":{const i=r.indexOf(e.currentTarget)-1;n=r[i]??r[r.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:t}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>r.push(e),onKeyDown:h,onClick:d,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":s===n}),children:i??n},n)}))})}function j(e){let{lazy:n,children:i,selectedValue:t}=e;const o=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===t));return e?(0,s.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==t})))})}function y(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(v,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,g.A)();return(0,x.jsx)(y,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const a={},t=s.createContext(a);function o(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8ee2fdd1.a6b4589f.js b/assets/js/8ee2fdd1.a6b4589f.js deleted file mode 100644 index 1413bbf13..000000000 --- a/assets/js/8ee2fdd1.a6b4589f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8420],{4335:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>h});var s=i(4848),a=i(8453),t=i(1470),o=i(9365);const l={title:"aom-av1-lavish",sidebar_position:18,keywords:["AV1","encoding","video encoding","AOM AV1"]},r="aom-av1-lavish",c={id:"encoders/aom-av1-lavish",title:"aom-av1-lavish",description:"This entry is about a fork of aomenc called aom-psy101. If you'd like to learn about the mainline aomenc encoder before reading, visit our aomenc wiki entry.",source:"@site/docs/encoders/aom-av1-lavish.mdx",sourceDirName:"encoders",slug:"/encoders/aom-av1-lavish",permalink:"/docs/encoders/aom-av1-lavish",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aom-av1-lavish.mdx",tags:[],version:"current",sidebarPosition:18,frontMatter:{title:"aom-av1-lavish",sidebar_position:18,keywords:["AV1","encoding","video encoding","AOM AV1"]},sidebar:"tutorialSidebar",previous:{title:"JM",permalink:"/docs/encoders/JM"},next:{title:"aom-psy101",permalink:"/docs/encoders/aom-psy101"}},d={},h=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"AV1 Encoding",id:"av1-encoding",level:3},{value:"AVIF Encoding",id:"avif-encoding",level:3},{value:"Recommendations",id:"recommendations",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"aom-av1-lavish",children:"aom-av1-lavish"})}),"\n",(0,s.jsx)(n.admonition,{title:"Community Fork",type:"info",children:(0,s.jsxs)(n.p,{children:["This entry is about a fork of aomenc called aom-psy101. If you'd like to learn about the mainline aomenc encoder before reading, visit our ",(0,s.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc wiki entry"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["Mainline aomenc is unfortunately not perfect. It suffers from bad defaults, a heavy focus on the perceptually flawed ",(0,s.jsx)(n.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," metric, misleading settings, and other issues. Fortunately, there are a couple of forks developed by the encoding community that were created to combat aomenc's underlying issues."]}),"\n",(0,s.jsx)(n.admonition,{title:"No Longer Maintained",type:"warning",children:(0,s.jsx)(n.p,{children:"aom-av1-lavish is no longer maintained as of 4th June 2024. The information in this entry is unaffected by this, but the fact that the project is no longer maintained should be taken into consideration as a user."})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"})," ",(0,s.jsx)(n.em,{children:"No longer maintained as of 13th January 2023"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"})," ",(0,s.jsx)(n.em,{children:"No longer maintained as of 4th June 2024"})]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/docs/encoders/aom-psy101",children:"aom-psy101"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/porcino/aom-av1ador",children:"aom-av1ador"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"These forks fix up the poor decisions made by the original AOM devs and most importantly introduce new parameters and tunes to help fine-tune the encoder even more."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"})," is a fork of aomenc that aims to improve the encoding quality and speed of AV1. It is developed by ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius",children:"Clybius"}),", a talented AV1 community developer also well-known for working on ",(0,s.jsx)(n.a,{href:"/docs/encoders/SVT-AV1-PSY",children:"SVT-AV1-PSY"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc is available in FFmpeg via ",(0,s.jsx)(n.code,{children:"libaom-av1"}),", check if you have it by running ",(0,s.jsx)(n.code,{children:"ffmpeg -h encoder=libaom-av1"}),". You can input non-FFmpeg standard aomenc parameters via ",(0,s.jsx)(n.code,{children:"-aom-params"}),"."]}),"\n",(0,s.jsx)(n.admonition,{title:"Mainline aomenc",type:"caution",children:(0,s.jsx)(n.p,{children:"Unless you compile FFmpeg yourself with aom-av1-lavish, you will be using the mainline aomenc. Compiling from source yourself with the aomenc libraries provided by aom-av1-lavish is the only way to use it with FFmpeg."})}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(t.A,{children:[(0,s.jsxs)(o.A,{value:"linux",label:"Linux",default:!0,children:[(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.em,{children:["A precompiled AVX2-optimized binary of aom-av1-lavish can be installed for x86_64 Linux via ",(0,s.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,s.jsx)(n.p,{children:"But if you want to compile the community forks, you can also do that. CMake, Perl, GNU Make, and nasm (assuming x64, if x86 use yasm) will be needed for compilation."}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the aom-av1-lavish repo Endless_Merging branch, cd and create build folder"',children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n"})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="CMake configuration"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\n'})}),(0,s.jsx)(n.p,{children:"The CMake config above will statically build aomenc while disabling docs (which requires Doxygen), extra tunes, tests, and decoders. While also applying native CPU optimizations to help speed up the encoder."}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Compile the encoder"',children:"make -j$(nproc)\n"})}),(0,s.jsxs)(n.p,{children:["The resulting binary will be in the same folder you are on (",(0,s.jsx)(n.code,{children:"aom_build"}),")."]}),(0,s.jsx)(n.p,{children:"Or, optionally, you can install it to your system, which may need elevated permissions."}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"make install\n"})})]}),(0,s.jsxs)(o.A,{value:"mac",label:"macOS",children:[(0,s.jsxs)(n.p,{children:["macOS is very similar to Linux. Note that some commands may have to be run with ",(0,s.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Homebrew"})}),(0,s.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),(0,s.jsx)(n.p,{children:"Installing mainline libaom is as simple as running the following:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install aom\n"})}),(0,s.jsx)(n.p,{children:"FFmpeg can also be installed via brew."}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Building From Source"})}),(0,s.jsx)(n.p,{children:"If you want aom-av1-lavish instead of mainline, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,s.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Homebrew installs ",(0,s.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from libvmaf, libjxl, etc, make sure to copy them from ",(0,s.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,s.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,s.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,s.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. aom-av1-lavish requires some additional steps, though."}),"\n"]}),(0,s.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch, which contains all of the latest lavish improvements:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),(0,s.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"})," is merged to fix build errors."]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the line ",(0,s.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,s.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,s.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,s.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,s.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,s.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),(0,s.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools. While still in the ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root. If it doesn\'t work properly, you can always copy the binary into /usr/local/bin manually:\nmake install\n'})}),(0,s.jsxs)(n.p,{children:["Now you can run ",(0,s.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,s.jsx)(n.code,{children:"aomenc"})," executable to ",(0,s.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,s.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,s.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),(0,s.jsxs)(n.p,{children:["Notice how it says ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish."]})]}),(0,s.jsxs)(o.A,{value:"wind",label:"Windows",children:[(0,s.jsx)(n.p,{children:"You can download the pre-built versions, which can be found below (Current as of Sept 6, 2023):"}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28"})}),(0,s.jsxs)(n.p,{children:["Join the ",(0,s.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," and head to #community-builds for updated versions, you can opt to compile it yourself with the instructions below."]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"The Compiling Route:"})}),(0,s.jsxs)(n.p,{children:["Full credits to u/Turbulent-Bend-7416 on Reddit for ",(0,s.jsx)(n.a,{href:"https://www.reddit.com/r/AV1/comments/s6eh5f/how_to_compile_av1_in_windows_without_crying",children:"this post"})," on how to compile aomenc."]}),(0,s.jsxs)(n.p,{children:["This guide requires ",(0,s.jsx)(n.strong,{children:"MSYS2"}),", specifically ",(0,s.jsx)(n.strong,{children:"MinGW-W64"}),". Install it if you haven't yet."]}),(0,s.jsx)(n.p,{children:"First, install the required dependencies:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pacman -S cmake git perl yasm nasm python3 doxygen mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel\n"})}),(0,s.jsx)(n.p,{children:"Now, clone the aom-av1-lavish repo in the Endless_Merging branch and create the folders:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n"})}),(0,s.jsx)(n.p,{children:"Then we can start compiling with some build optimizations for your CPU:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n'})}),(0,s.jsxs)(n.p,{children:["The resulting binary will be available within your home folder of the location where you installed MSYS2 (usually ",(0,s.jsx)(n.code,{children:"C:"}),"), navigate there and the to the aom-av1-lavish folder and it should be there."]}),(0,s.jsx)(n.p,{children:'Built files should be in the "Debug" folder'}),(0,s.jsx)(n.p,{children:"Don't share binaries compiled with native CPU optimizations unless the person you're sharing to has the same CPU architecture, as this will lead to missing instructions being used and slowing down encode speeds."})]})]}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.h3,{id:"av1-encoding",children:"AV1 Encoding"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"The way aomenc was developed requires 2-pass to take full advantage of its efficiency which include better rate controls and encoding features. So always use 2 passes when encoding."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Simple Y4M input with CQ 22, 1 pass, and raw ivf bitstream output"',children:"aomenc --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf input.y4m\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 1"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=1 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 2"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=2 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.h3,{id:"avif-encoding",children:"AVIF Encoding"}),"\n",(0,s.jsx)(n.p,{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders. A sample command for encoding AVIF looks like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),"\n",(0,s.jsx)(n.p,{children:"Where:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-c aom"})," is the encoder"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't parallelize perfectly. Test using a speed benchmark to verify which value works best for you."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8-bit source image."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,s.jsx)(n.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc unfortunately lacks the ability to take advantage of multiple threads, so therefore a tool like ",(0,s.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," will be needed for parallelization. The parameters shown will be biased towards Av1an and aom-av1-lavish usage, so if you plan on using standalone aomenc then adjust as needed."]}),"\n",(0,s.jsx)(n.p,{children:"Here are some recommended parameters:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 --denoise-noise-level=8"})}),"\n",(0,s.jsx)(n.p,{children:"Now let's break it down."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because weird linear algebra allows the video to become smaller and reduces banding."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster. See the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",loading:"lazy"})]}),"\n",(0,s.jsxs)(n.admonition,{title:"Tile usage",type:"note",children:[(0,s.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,s.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,s.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,s.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)."]}),(0,s.jsxs)(n.p,{children:["If you would like an easy way to calculate the necessary number of tiles for your video, you can use ",(0,s.jsx)(n.a,{href:"https://autocompressor.net/tools/av1-calculator",children:"the AV1 Encoding Calculator"})," online or run ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/av1-tile-calc",children:"this local tile calculator"}),"."]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,s.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--aq-mode=0"})," adaptive quantization mode, a mostly debatable area nowadays. 0 is better most of the time but some say 1 is also good."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["Do not use ",(0,s.jsx)(n.code,{children:"tune-content=psy"})," if you encode live action above ",(0,s.jsx)(n.code,{children:"cq-level=30"}),"."]})}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["If you use any of the VMAF tunes, you need to specify ",(0,s.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put VMAF models in."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg can't input it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--deltaq-mode=0"})," set to 0 b its better"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering (smoothing) will be, always been a hot topic. Most agree on the default of 4. Others think 1 is good for 3D Pixar CGI-like and 2D animation and 4 for live action content, and a higher value for lower bitrate encodes."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause Av1an already did scene detection, so we wont have to. Plus it speeds things up."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since Av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-chroma-deltaq=1"})," --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost, ignore it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well (NLMeans is the denoiser used)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--denoise-noise-level=8"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness). Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["You can use photon noise tables as an alternative via ",(0,s.jsx)(n.code,{children:"--film-grain-table"}),", which is also conveniently available in Av1an as ",(0,s.jsx)(n.code,{children:"--photon-noise=X"})]})}),"\n",(0,s.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Use ",(0,s.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes to speed it up without much losses (lavish, butteraugli) and ",(0,s.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n",(0,s.jsxs)(n.li,{children:["Use ",(0,s.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]})]})}function m(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>o});i(6540);var s=i(4164);const a={tabItem:"tabItem_Ymn6"};var t=i(4848);function o(e){let{children:n,hidden:i,className:o}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,s.A)(a.tabItem,o),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>w});var s=i(6540),a=i(4164),t=i(3104),o=i(6347),l=i(205),r=i(7485),c=i(1682),d=i(679);function h(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:s,default:a}}=e;return{value:n,label:i,attributes:s,default:a}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const a=(0,o.W6)(),t=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,r.aZ)(t),(0,s.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(a.location.search);n.set(t,e),a.replace({...a.location,search:n.toString()})}),[t,a])]}function f(e){const{defaultValue:n,queryString:i=!1,groupId:a}=e,t=u(e),[o,r]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=i.find((e=>e.default))??i[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:t}))),[c,h]=p({queryString:i,groupId:a}),[f,g]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,t]=(0,d.Dv)(i);return[a,(0,s.useCallback)((e=>{i&&t.set(e)}),[i,t])]}({groupId:a}),b=(()=>{const e=c??f;return m({value:e,tabValues:t})?e:null})();(0,l.A)((()=>{b&&r(b)}),[b]);return{selectedValue:o,selectValue:(0,s.useCallback)((e=>{if(!m({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);r(e),h(e),g(e)}),[h,g,t]),tabValues:t}}var g=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function v(e){let{className:n,block:i,selectedValue:s,selectValue:o,tabValues:l}=e;const r=[],{blockElementScrollPositionUntilNextRender:c}=(0,t.a_)(),d=e=>{const n=e.currentTarget,i=r.indexOf(n),a=l[i].value;a!==s&&(c(n),o(a))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=r.indexOf(e.currentTarget)+1;n=r[i]??r[0];break}case"ArrowLeft":{const i=r.indexOf(e.currentTarget)-1;n=r[i]??r[r.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:t}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>r.push(e),onKeyDown:h,onClick:d,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":s===n}),children:i??n},n)}))})}function j(e){let{lazy:n,children:i,selectedValue:t}=e;const o=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===t));return e?(0,s.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==t})))})}function y(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(v,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,g.A)();return(0,x.jsx)(y,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const a={},t=s.createContext(a);function o(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8f6f5e4c.428525cb.js b/assets/js/8f6f5e4c.428525cb.js deleted file mode 100644 index 702117a6b..000000000 --- a/assets/js/8f6f5e4c.428525cb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8760],{4216:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=r(4848),s=r(8453);const i={title:"Color Formats",sidebar_position:2},t="Color Formats",l={id:"colorimetry/format",title:"Color Formats",description:"To represent color values, a format is agreed upon. Color formats are",source:"@site/docs/colorimetry/format.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/format",permalink:"/docs/colorimetry/format",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/format.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Color Formats",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Intro",permalink:"/docs/colorimetry/intro"},next:{title:"Color Range",permalink:"/docs/colorimetry/range"}},a={},d=[{value:"Color Models",id:"color-models",level:2},{value:"RGB",id:"rgb",level:3},{value:"YUV",id:"yuv",level:3},{value:"Component order",id:"component-order",level:3},{value:"Bit depth",id:"bit-depth",level:2},{value:"Packed vs planar",id:"packed-vs-planar",level:2},{value:"Endianness",id:"endianness",level:2},{value:"Chroma subsampling",id:"chroma-subsampling",level:2},{value:"Common formats",id:"common-formats",level:2},{value:"References",id:"references",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",section:"section",sup:"sup",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"color-formats",children:"Color Formats"})}),"\n",(0,o.jsxs)(n.p,{children:["To represent color values, a format is agreed upon. Color formats are\nmade up of three things, the ",(0,o.jsx)(n.a,{href:"#color-models",children:"color model"}),"--which includes the\n",(0,o.jsx)(n.a,{href:"#component-order",children:"order of the components"})," and sometimes ",(0,o.jsx)(n.a,{href:"#chroma-subsampling",children:"chroma subsampling"}),"--\nthe ",(0,o.jsx)(n.a,{href:"#bit-depth",children:"bit depth"}),", and whether it is a ",(0,o.jsx)(n.a,{href:"#packed-vs-planar",children:"packed or a planar format"}),".\nIn some cases, ",(0,o.jsx)(n.a,{href:"#endianness",children:"endianness"})," may be important."]}),"\n",(0,o.jsx)(n.h2,{id:"color-models",children:"Color Models"}),"\n",(0,o.jsx)(n.p,{children:"A color model is a method of representing colors in a video or image using data.\nDifferent color models store color and brightness information in different ways.\nThere are many different color models, but this section will cover the\nmodels most commonly used for images and video."}),"\n",(0,o.jsx)(n.h3,{id:"rgb",children:"RGB"}),"\n",(0,o.jsx)(n.p,{children:"RGB is probably the most well-known color model, and is primarily used\nin image encoding. RGB consists of three color channels, Red, Green,\nand Blue, which are then combined to determine the final color of each\npixel. Typically, RGB is the final model that a monitor or TV\nwill use to display images, because the pixels on a screen are made up\nof red, green, and blue LEDs, although it is not commonly used for video\nencoding because other models can provide better compression."}),"\n",(0,o.jsx)(n.h3,{id:"yuv",children:"YUV"}),"\n",(0,o.jsx)(n.p,{children:"YUV, also known as YCbCr, is the most widely used color model for\nvideo encoding. It consists of three components: Y aka Luma, which\nrepresents luminance or brightness, and two chroma planes, which\nrepresent color. Generally a video player will have to convert a YUV\nvideo into RGB before it can be rendered, but there are significant\ncompression benefits to using YUV over RGB for video."}),"\n",(0,o.jsxs)(n.p,{children:["The most notable reason to use YCbCr is an optimization called chroma\nsubsampling. This means that the chroma components can be encoded at a\nlower resolution than the luma components, which results in a smaller\noutput file. You can read more about chroma subsampling ",(0,o.jsx)(n.a,{href:"#chroma-subsampling",children:"further below"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"component-order",children:"Component order"}),"\n",(0,o.jsxs)(n.p,{children:["The order in which the components in a color model are arranged is simply\nrepresented by writing them out. For example, ",(0,o.jsx)(n.code,{children:"RGB"})," for red first,\nthen green, then blue, or ",(0,o.jsx)(n.code,{children:"BGR"})," for blue, green, red."]}),"\n",(0,o.jsx)(n.h2,{id:"bit-depth",children:"Bit depth"}),"\n",(0,o.jsx)(n.p,{children:"A bit depth is how many bits are available to store the sample\nvalue. There are two main ways to specify the bit depth in a :"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["bits per component. Here, ",(0,o.jsx)(n.code,{children:"RGB888"})," reads as ",(0,o.jsx)(n.code,{children:"RGB color model, with 8 bits for the red component, 8 bits for the green component, and 8 bits for the blue component"})," and ",(0,o.jsx)(n.code,{children:"RGB565"})," reads as ",(0,o.jsx)(n.code,{children:"RGB color model, with 5 bits for the red component, 6 bits for the green component, and 5 bits for the blue component"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["bits per sample. Here, ",(0,o.jsx)(n.code,{children:"RGB24"})," reads as ",(0,o.jsx)(n.code,{children:"RGB color model, with 24 bits in total for the red, green, and blue components"}),". This is\nambiguous, because one does not know exactly how many bits are\nallocated to each component. ",(0,o.jsx)(n.code,{children:"RGB565"}),", ",(0,o.jsx)(n.code,{children:"RGB556"}),", and ",(0,o.jsx)(n.code,{children:"RGB655"})," (even\nthough the latter ones do not make much sense as the eye is most\nsensitive to green light) all become ",(0,o.jsx)(n.code,{children:"RGB16"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"packed-vs-planar",children:"Packed vs planar"}),"\n",(0,o.jsxs)(n.p,{children:["Components can be stored either packed, where all\ncomponents are interleaved (here, ",(0,o.jsx)(n.code,{children:"RGB"}),"):"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Sample number: 1 2 3 4 5\nData: RGB RGB RGB RGB RGB\n"})}),"\n",(0,o.jsx)(n.p,{children:"or stored separately for each component:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Sample number: 1 2 3 4 5\nData: R R R R R...\nData: G G G G G...\nData: B B B B B...\n"})}),"\n",(0,o.jsxs)(n.p,{children:["In planar formats, many operations can be easier to implement, as it\nis possible to implement the algorithm once and then operate on all\nplanes. On the other hand, packed formats are simpler and often used\nin hardware.",(0,o.jsx)(n.sup,{children:(0,o.jsx)(n.a,{href:"#user-content-fn-vlc-wiki-yuv",id:"user-content-fnref-vlc-wiki-yuv","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})})]}),"\n",(0,o.jsx)(n.h2,{id:"endianness",children:"Endianness"}),"\n",(0,o.jsxs)(n.p,{children:["Different computer architectures store numbers differently. For more\ninformation, visit ",(0,o.jsx)(n.a,{href:"//wikipedia.org/wiki/Endianness",children:"the Wikipedia article on\nendianness"}),". There are two main ways\nto store numbers with more than 8 bits (1 is the least significant\nbyte and 4 is the most significant byte, here 4 bytes):"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Most significant byte first, little endian, ",(0,o.jsx)(n.code,{children:"4321"}),". This is what\nx86-family processors use."]}),"\n",(0,o.jsxs)(n.li,{children:["Least significant byte first, big endian, ",(0,o.jsx)(n.code,{children:"1234"}),". This is what\nPowerPC-family processors use."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"This can be important for color formats, as some computers might store\nit in their native endianness. VapourSynth doesn't seem to care about\nendianness, but FFmpeg does."}),"\n",(0,o.jsxs)(n.p,{children:["For example, ",(0,o.jsx)(n.code,{children:"RGB565"})," might store its two bytes in ",(0,o.jsx)(n.code,{children:"12"})," or ",(0,o.jsx)(n.code,{children:"21"})," order,\nand if they are read in the wrong order, it will produce garbage."]}),"\n",(0,o.jsx)(n.h2,{id:"chroma-subsampling",children:"Chroma subsampling"}),"\n",(0,o.jsxs)(n.p,{children:["In ",(0,o.jsx)(n.a,{href:"#yuv",children:"Y'CbCr"})," signals, there are three widely used\nvariants of chroma subsampling:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"4:2:0 which has half the vertical and horizontal chroma resolution"}),"\n",(0,o.jsx)(n.li,{children:"4:2:2 which has half the horizontal chroma resolution but full\nvertical resolution"}),"\n",(0,o.jsx)(n.li,{children:"4:4:4 which has full chroma resolution (no subsampling)"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"4:2:2 is not particularly useful over the other options, so this guide\nwill focus on 4:2:0 and 4:4:4."}),"\n",(0,o.jsx)(n.p,{children:"4:2:0 is the most commonly used format for videos. Nearly every DVD,\nblu-ray, camera recording, etc. uses 4:2:0 subsampling. This is because,\nin the majority of cases, human eyes do not notice the reduction in\nchroma resolution. There is very little benefit to using 4:4:4 in the\naverage case."}),"\n",(0,o.jsx)(n.p,{children:"However, there are some exceptions. The most notable is screen\nrecordings. Things like text overlays, video game UI overlays,\netc. have very fine, color-dependent detail that can be destroyed by\nchroma subsampling and result in an aliased look to the\nvideo. Therefore, it is recommended to use 4:4:4 subsampling when\nrecording your screen, and 4:2:0 subsampling in most other cases."}),"\n",(0,o.jsx)(n.h2,{id:"common-formats",children:"Common formats"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"VS name"}),(0,o.jsx)(n.th,{children:"FFmpeg name"}),(0,o.jsx)(n.th,{children:"Meaning"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"GRAY8"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"gray8"})}),(0,o.jsx)(n.td,{children:"Brightness only, 8 bits, packed"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"GRAY16"})}),(0,o.jsxs)(n.td,{children:[(0,o.jsx)(n.code,{children:"gray16le"}),", ",(0,o.jsx)(n.code,{children:"gray16be"})," (the suffix specifies the ",(0,o.jsx)(n.a,{href:"#endianness",children:"endianness"}),")"]}),(0,o.jsx)(n.td,{children:"Brightness only, 16 bits"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"RGB888"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"rgb24"})}),(0,o.jsx)(n.td,{children:"red, green, blue, 8 bits per component"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV420P8"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"yuv420p"})}),(0,o.jsxs)(n.td,{children:["luma, chroma blue, chroma red, 8 bits per component, planar, 4:2:0 ",(0,o.jsx)(n.a,{href:"#chroma-subsampling",children:"subsampling"})]})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV422P8"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"yuv422p"})}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 8 bits per component, planar, 4:2:2 subsampling"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV444P8"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"yuv444p"})}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 8 bits per component, planar, no subsampling"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV420P10"})}),(0,o.jsxs)(n.td,{children:[(0,o.jsx)(n.code,{children:"yuv420p10le"}),", ",(0,o.jsx)(n.code,{children:"yuv420p10le"})]}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 10 bits per component, planar, 4:2:0 subsampling"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV422P10"})}),(0,o.jsxs)(n.td,{children:[(0,o.jsx)(n.code,{children:"yuv422p10le"}),", ",(0,o.jsx)(n.code,{children:"yuv422p10le"})]}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 10 bits per component, planar, 4:2:2 subsampling"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV444P10"})}),(0,o.jsxs)(n.td,{children:[(0,o.jsx)(n.code,{children:"yuv444p10le"}),", ",(0,o.jsx)(n.code,{children:"yuv444p10le"})]}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 10 bits per component, planar, no subsampling"})]})]})]}),"\n",(0,o.jsx)(n.h2,{id:"references",children:"References"}),"\n","\n",(0,o.jsxs)(n.section,{"data-footnotes":!0,className:"footnotes",children:[(0,o.jsx)(n.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{id:"user-content-fn-vlc-wiki-yuv",children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://wiki.videolan.org/YUV/#Packed_formats",children:"YUV - VideoLAN Wiki"})," ",(0,o.jsx)(n.a,{href:"#user-content-fnref-vlc-wiki-yuv","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>l});var o=r(6540);const s={},i=o.createContext(s);function t(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8f6f5e4c.7fa5ae9c.js b/assets/js/8f6f5e4c.7fa5ae9c.js new file mode 100644 index 000000000..015296d17 --- /dev/null +++ b/assets/js/8f6f5e4c.7fa5ae9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8760],{9600:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"colorimetry/format","title":"Color Formats","description":"To represent color values, a format is agreed upon. Color formats are","source":"@site/docs/colorimetry/format.mdx","sourceDirName":"colorimetry","slug":"/colorimetry/format","permalink":"/docs/colorimetry/format","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/format.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Color Formats","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Intro","permalink":"/docs/colorimetry/intro"},"next":{"title":"Color Range","permalink":"/docs/colorimetry/range"}}');var s=r(4848),i=r(8453);const t={title:"Color Formats",sidebar_position:2},l="Color Formats",a={},d=[{value:"Color Models",id:"color-models",level:2},{value:"RGB",id:"rgb",level:3},{value:"YUV",id:"yuv",level:3},{value:"Component order",id:"component-order",level:3},{value:"Bit depth",id:"bit-depth",level:2},{value:"Packed vs planar",id:"packed-vs-planar",level:2},{value:"Endianness",id:"endianness",level:2},{value:"Chroma subsampling",id:"chroma-subsampling",level:2},{value:"Common formats",id:"common-formats",level:2},{value:"References",id:"references",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",section:"section",sup:"sup",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"color-formats",children:"Color Formats"})}),"\n",(0,s.jsxs)(n.p,{children:["To represent color values, a format is agreed upon. Color formats are\nmade up of three things, the ",(0,s.jsx)(n.a,{href:"#color-models",children:"color model"}),"--which includes the\n",(0,s.jsx)(n.a,{href:"#component-order",children:"order of the components"})," and sometimes ",(0,s.jsx)(n.a,{href:"#chroma-subsampling",children:"chroma subsampling"}),"--\nthe ",(0,s.jsx)(n.a,{href:"#bit-depth",children:"bit depth"}),", and whether it is a ",(0,s.jsx)(n.a,{href:"#packed-vs-planar",children:"packed or a planar format"}),".\nIn some cases, ",(0,s.jsx)(n.a,{href:"#endianness",children:"endianness"})," may be important."]}),"\n",(0,s.jsx)(n.h2,{id:"color-models",children:"Color Models"}),"\n",(0,s.jsx)(n.p,{children:"A color model is a method of representing colors in a video or image using data.\nDifferent color models store color and brightness information in different ways.\nThere are many different color models, but this section will cover the\nmodels most commonly used for images and video."}),"\n",(0,s.jsx)(n.h3,{id:"rgb",children:"RGB"}),"\n",(0,s.jsx)(n.p,{children:"RGB is probably the most well-known color model, and is primarily used\nin image encoding. RGB consists of three color channels, Red, Green,\nand Blue, which are then combined to determine the final color of each\npixel. Typically, RGB is the final model that a monitor or TV\nwill use to display images, because the pixels on a screen are made up\nof red, green, and blue LEDs, although it is not commonly used for video\nencoding because other models can provide better compression."}),"\n",(0,s.jsx)(n.h3,{id:"yuv",children:"YUV"}),"\n",(0,s.jsx)(n.p,{children:"YUV, also known as YCbCr, is the most widely used color model for\nvideo encoding. It consists of three components: Y aka Luma, which\nrepresents luminance or brightness, and two chroma planes, which\nrepresent color. Generally a video player will have to convert a YUV\nvideo into RGB before it can be rendered, but there are significant\ncompression benefits to using YUV over RGB for video."}),"\n",(0,s.jsxs)(n.p,{children:["The most notable reason to use YCbCr is an optimization called chroma\nsubsampling. This means that the chroma components can be encoded at a\nlower resolution than the luma components, which results in a smaller\noutput file. You can read more about chroma subsampling ",(0,s.jsx)(n.a,{href:"#chroma-subsampling",children:"further below"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"component-order",children:"Component order"}),"\n",(0,s.jsxs)(n.p,{children:["The order in which the components in a color model are arranged is simply\nrepresented by writing them out. For example, ",(0,s.jsx)(n.code,{children:"RGB"})," for red first,\nthen green, then blue, or ",(0,s.jsx)(n.code,{children:"BGR"})," for blue, green, red."]}),"\n",(0,s.jsx)(n.h2,{id:"bit-depth",children:"Bit depth"}),"\n",(0,s.jsx)(n.p,{children:"A bit depth is how many bits are available to store the sample\nvalue. There are two main ways to specify the bit depth in a :"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["bits per component. Here, ",(0,s.jsx)(n.code,{children:"RGB888"})," reads as ",(0,s.jsx)(n.code,{children:"RGB color model, with 8 bits for the red component, 8 bits for the green component, and 8 bits for the blue component"})," and ",(0,s.jsx)(n.code,{children:"RGB565"})," reads as ",(0,s.jsx)(n.code,{children:"RGB color model, with 5 bits for the red component, 6 bits for the green component, and 5 bits for the blue component"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["bits per sample. Here, ",(0,s.jsx)(n.code,{children:"RGB24"})," reads as ",(0,s.jsx)(n.code,{children:"RGB color model, with 24 bits in total for the red, green, and blue components"}),". This is\nambiguous, because one does not know exactly how many bits are\nallocated to each component. ",(0,s.jsx)(n.code,{children:"RGB565"}),", ",(0,s.jsx)(n.code,{children:"RGB556"}),", and ",(0,s.jsx)(n.code,{children:"RGB655"})," (even\nthough the latter ones do not make much sense as the eye is most\nsensitive to green light) all become ",(0,s.jsx)(n.code,{children:"RGB16"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"packed-vs-planar",children:"Packed vs planar"}),"\n",(0,s.jsxs)(n.p,{children:["Components can be stored either packed, where all\ncomponents are interleaved (here, ",(0,s.jsx)(n.code,{children:"RGB"}),"):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Sample number: 1 2 3 4 5\nData: RGB RGB RGB RGB RGB\n"})}),"\n",(0,s.jsx)(n.p,{children:"or stored separately for each component:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Sample number: 1 2 3 4 5\nData: R R R R R...\nData: G G G G G...\nData: B B B B B...\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In planar formats, many operations can be easier to implement, as it\nis possible to implement the algorithm once and then operate on all\nplanes. On the other hand, packed formats are simpler and often used\nin hardware.",(0,s.jsx)(n.sup,{children:(0,s.jsx)(n.a,{href:"#user-content-fn-vlc-wiki-yuv",id:"user-content-fnref-vlc-wiki-yuv","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})})]}),"\n",(0,s.jsx)(n.h2,{id:"endianness",children:"Endianness"}),"\n",(0,s.jsxs)(n.p,{children:["Different computer architectures store numbers differently. For more\ninformation, visit ",(0,s.jsx)(n.a,{href:"//wikipedia.org/wiki/Endianness",children:"the Wikipedia article on\nendianness"}),". There are two main ways\nto store numbers with more than 8 bits (1 is the least significant\nbyte and 4 is the most significant byte, here 4 bytes):"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Most significant byte first, little endian, ",(0,s.jsx)(n.code,{children:"4321"}),". This is what\nx86-family processors use."]}),"\n",(0,s.jsxs)(n.li,{children:["Least significant byte first, big endian, ",(0,s.jsx)(n.code,{children:"1234"}),". This is what\nPowerPC-family processors use."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"This can be important for color formats, as some computers might store\nit in their native endianness. VapourSynth doesn't seem to care about\nendianness, but FFmpeg does."}),"\n",(0,s.jsxs)(n.p,{children:["For example, ",(0,s.jsx)(n.code,{children:"RGB565"})," might store its two bytes in ",(0,s.jsx)(n.code,{children:"12"})," or ",(0,s.jsx)(n.code,{children:"21"})," order,\nand if they are read in the wrong order, it will produce garbage."]}),"\n",(0,s.jsx)(n.h2,{id:"chroma-subsampling",children:"Chroma subsampling"}),"\n",(0,s.jsxs)(n.p,{children:["In ",(0,s.jsx)(n.a,{href:"#yuv",children:"Y'CbCr"})," signals, there are three widely used\nvariants of chroma subsampling:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"4:2:0 which has half the vertical and horizontal chroma resolution"}),"\n",(0,s.jsx)(n.li,{children:"4:2:2 which has half the horizontal chroma resolution but full\nvertical resolution"}),"\n",(0,s.jsx)(n.li,{children:"4:4:4 which has full chroma resolution (no subsampling)"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"4:2:2 is not particularly useful over the other options, so this guide\nwill focus on 4:2:0 and 4:4:4."}),"\n",(0,s.jsx)(n.p,{children:"4:2:0 is the most commonly used format for videos. Nearly every DVD,\nblu-ray, camera recording, etc. uses 4:2:0 subsampling. This is because,\nin the majority of cases, human eyes do not notice the reduction in\nchroma resolution. There is very little benefit to using 4:4:4 in the\naverage case."}),"\n",(0,s.jsx)(n.p,{children:"However, there are some exceptions. The most notable is screen\nrecordings. Things like text overlays, video game UI overlays,\netc. have very fine, color-dependent detail that can be destroyed by\nchroma subsampling and result in an aliased look to the\nvideo. Therefore, it is recommended to use 4:4:4 subsampling when\nrecording your screen, and 4:2:0 subsampling in most other cases."}),"\n",(0,s.jsx)(n.h2,{id:"common-formats",children:"Common formats"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"VS name"}),(0,s.jsx)(n.th,{children:"FFmpeg name"}),(0,s.jsx)(n.th,{children:"Meaning"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"GRAY8"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"gray8"})}),(0,s.jsx)(n.td,{children:"Brightness only, 8 bits, packed"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"GRAY16"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"gray16le"}),", ",(0,s.jsx)(n.code,{children:"gray16be"})," (the suffix specifies the ",(0,s.jsx)(n.a,{href:"#endianness",children:"endianness"}),")"]}),(0,s.jsx)(n.td,{children:"Brightness only, 16 bits"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"RGB888"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"rgb24"})}),(0,s.jsx)(n.td,{children:"red, green, blue, 8 bits per component"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YUV420P8"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"yuv420p"})}),(0,s.jsxs)(n.td,{children:["luma, chroma blue, chroma red, 8 bits per component, planar, 4:2:0 ",(0,s.jsx)(n.a,{href:"#chroma-subsampling",children:"subsampling"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YUV422P8"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"yuv422p"})}),(0,s.jsx)(n.td,{children:"luma, chroma blue, chroma red, 8 bits per component, planar, 4:2:2 subsampling"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YUV444P8"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"yuv444p"})}),(0,s.jsx)(n.td,{children:"luma, chroma blue, chroma red, 8 bits per component, planar, no subsampling"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YUV420P10"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"yuv420p10le"}),", ",(0,s.jsx)(n.code,{children:"yuv420p10le"})]}),(0,s.jsx)(n.td,{children:"luma, chroma blue, chroma red, 10 bits per component, planar, 4:2:0 subsampling"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YUV422P10"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"yuv422p10le"}),", ",(0,s.jsx)(n.code,{children:"yuv422p10le"})]}),(0,s.jsx)(n.td,{children:"luma, chroma blue, chroma red, 10 bits per component, planar, 4:2:2 subsampling"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YUV444P10"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"yuv444p10le"}),", ",(0,s.jsx)(n.code,{children:"yuv444p10le"})]}),(0,s.jsx)(n.td,{children:"luma, chroma blue, chroma red, 10 bits per component, planar, no subsampling"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"references",children:"References"}),"\n","\n",(0,s.jsxs)(n.section,{"data-footnotes":!0,className:"footnotes",children:[(0,s.jsx)(n.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{id:"user-content-fn-vlc-wiki-yuv",children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://wiki.videolan.org/YUV/#Packed_formats",children:"YUV - VideoLAN Wiki"})," ",(0,s.jsx)(n.a,{href:"#user-content-fnref-vlc-wiki-yuv","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>l});var o=r(6540);const s={},i=o.createContext(s);function t(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9060e84a.4d74a2c8.js b/assets/js/9060e84a.4d74a2c8.js deleted file mode 100644 index eed69cfb8..000000000 --- a/assets/js/9060e84a.4d74a2c8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8320],{4e3:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var t=i(4848),s=i(8453);const r={title:"HM",sidebar_position:16},o="HM",c={id:"encoders/HM",title:"HM",description:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.",source:"@site/docs/encoders/HM.mdx",sourceDirName:"encoders",slug:"/encoders/HM",permalink:"/docs/encoders/HM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/HM.mdx",tags:[],version:"current",sidebarPosition:16,frontMatter:{title:"HM",sidebar_position:16},sidebar:"tutorialSidebar",previous:{title:"AVM",permalink:"/docs/encoders/AVM"},next:{title:"JM",permalink:"/docs/encoders/JM"}},a={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"hm",children:"HM"})}),"\n",(0,t.jsx)(n.admonition,{title:"Pending Review",type:"caution",children:(0,t.jsx)(n.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,t.jsxs)(n.p,{children:["HM is the original ",(0,t.jsx)(n.a,{href:"/docs/video/HEVC",children:"H.265"})," reference encoder, predating alternatives like ",(0,t.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),". In the modern day, it joins other MPEG reference encoders such as ",(0,t.jsx)(n.a,{href:"/docs/encoders/JM",children:"JM"})," & ",(0,t.jsx)(n.a,{href:"/docs/encoders/VTM",children:"VTM"})," in their reputations for being highly niche offerings that are used rarely due to their usage complexity & speed disadvantages. x264 is more efficient than JM."]}),"\n",(0,t.jsxs)(n.p,{children:["HM is capable of producing higher quality streams than highly tuned x265, even at excruciatingly slow speeds. This is only a theoretical advantage, though, as HM is incapable of placing keyframes automatically with scene detection & would need a chunking too reminiscent of ",(0,t.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," to do this. For videos containing few enough frames where keyframe placement isn't a concern, HM is better in practice than x265 at the expense of a massive dropoff in speed. HM doesn't have any threading capabilities & is much slower than even x265 placebo."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"These build instructions are valid for Linux & macOS."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://vcgit.hhi.fraunhofer.de/jvet/HM\ncd HM/\nmkdir build && cd build\ncmake .. -DCMAKE_BUILD_TYPE=Release\nmake -j$(nproc)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The binary ",(0,t.jsx)(n.code,{children:"TAppEncoderStatic"})," or ",(0,t.jsx)(n.code,{children:"TAppEncoder"})," can be found within the cloned directories, & can be copied to ",(0,t.jsx)(n.code,{children:"/usr/local/bin"})," for encoding. Decoding & other functions of the reference codec implementation aren't covered in this entry."]}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsxs)(n.p,{children:["Here is a sample command: ",(0,t.jsx)(n.code,{children:"TAppEncoderStatic -i input.yuv -b out.265 -c ~/HM/cfg/encoder_randomaccess_main10.cfg -wdt 1280 -hgt 720 -fr 50 -f 500 -q 27 -xPS 0"})]}),"\n",(0,t.jsx)(n.p,{children:"Make sure only to use only YUV input when encoding with HM. Each parameter does the following:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-i input.yuv -b out.265"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Specifies a raw YUV input file & an output raw h265 bitstream. To mux into an MP4 container, it is recommended that you use ",(0,t.jsx)(n.a,{href:"/docs/utilities/mp4box",children:"mp4box"})," instead of muxing with ",(0,t.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-c [path/to/config]"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Specifies the desired path to your HM configuration file. This makes it easier to encode without having to manually specify a plethora of settings."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-wdt 1280 -hgt 720"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Sets the input & output width & height."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-fr 50 -f 500"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Sets the framerate (FPS) & the number of frames to encode. In this case, we are encoding 500 frames of a video that is to be played back at 50fps."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-q 27"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Sets a quality target for the encoder."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-xPS 0"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Zero clue what this does. If someone has an idea, please contribute!"})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>c});var t=i(6540);const s={},r=t.createContext(s);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9060e84a.d53e734a.js b/assets/js/9060e84a.d53e734a.js new file mode 100644 index 000000000..4b65794bc --- /dev/null +++ b/assets/js/9060e84a.d53e734a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8320],{7443:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"encoders/HM","title":"HM","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","source":"@site/docs/encoders/HM.mdx","sourceDirName":"encoders","slug":"/encoders/HM","permalink":"/docs/encoders/HM","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/HM.mdx","tags":[],"version":"current","sidebarPosition":16,"frontMatter":{"title":"HM","sidebar_position":16},"sidebar":"tutorialSidebar","previous":{"title":"AVM","permalink":"/docs/encoders/AVM"},"next":{"title":"JM","permalink":"/docs/encoders/JM"}}');var s=i(4848),r=i(8453);const o={title:"HM",sidebar_position:16},c="HM",a={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"hm",children:"HM"})}),"\n",(0,s.jsx)(n.admonition,{title:"Pending Review",type:"caution",children:(0,s.jsx)(n.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,s.jsxs)(n.p,{children:["HM is the original ",(0,s.jsx)(n.a,{href:"/docs/video/HEVC",children:"H.265"})," reference encoder, predating alternatives like ",(0,s.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),". In the modern day, it joins other MPEG reference encoders such as ",(0,s.jsx)(n.a,{href:"/docs/encoders/JM",children:"JM"})," & ",(0,s.jsx)(n.a,{href:"/docs/encoders/VTM",children:"VTM"})," in their reputations for being highly niche offerings that are used rarely due to their usage complexity & speed disadvantages. x264 is more efficient than JM."]}),"\n",(0,s.jsxs)(n.p,{children:["HM is capable of producing higher quality streams than highly tuned x265, even at excruciatingly slow speeds. This is only a theoretical advantage, though, as HM is incapable of placing keyframes automatically with scene detection & would need a chunking too reminiscent of ",(0,s.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," to do this. For videos containing few enough frames where keyframe placement isn't a concern, HM is better in practice than x265 at the expense of a massive dropoff in speed. HM doesn't have any threading capabilities & is much slower than even x265 placebo."]}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(n.p,{children:"These build instructions are valid for Linux & macOS."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://vcgit.hhi.fraunhofer.de/jvet/HM\ncd HM/\nmkdir build && cd build\ncmake .. -DCMAKE_BUILD_TYPE=Release\nmake -j$(nproc)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The binary ",(0,s.jsx)(n.code,{children:"TAppEncoderStatic"})," or ",(0,s.jsx)(n.code,{children:"TAppEncoder"})," can be found within the cloned directories, & can be copied to ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," for encoding. Decoding & other functions of the reference codec implementation aren't covered in this entry."]}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsxs)(n.p,{children:["Here is a sample command: ",(0,s.jsx)(n.code,{children:"TAppEncoderStatic -i input.yuv -b out.265 -c ~/HM/cfg/encoder_randomaccess_main10.cfg -wdt 1280 -hgt 720 -fr 50 -f 500 -q 27 -xPS 0"})]}),"\n",(0,s.jsx)(n.p,{children:"Make sure only to use only YUV input when encoding with HM. Each parameter does the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"-i input.yuv -b out.265"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Specifies a raw YUV input file & an output raw h265 bitstream. To mux into an MP4 container, it is recommended that you use ",(0,s.jsx)(n.a,{href:"/docs/utilities/mp4box",children:"mp4box"})," instead of muxing with ",(0,s.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"-c [path/to/config]"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Specifies the desired path to your HM configuration file. This makes it easier to encode without having to manually specify a plethora of settings."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"-wdt 1280 -hgt 720"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Sets the input & output width & height."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"-fr 50 -f 500"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Sets the framerate (FPS) & the number of frames to encode. In this case, we are encoding 500 frames of a video that is to be played back at 50fps."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"-q 27"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Sets a quality target for the encoder."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"-xPS 0"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Zero clue what this does. If someone has an idea, please contribute!"})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>c});var t=i(6540);const s={},r=t.createContext(s);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/90aedb84.6dac006e.js b/assets/js/90aedb84.6dac006e.js deleted file mode 100644 index 881d9e1e0..000000000 --- a/assets/js/90aedb84.6dac006e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1691],{8872:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=i(4848),o=i(8453);const s={sidebar_position:5},r="Psychovisual",c={id:"introduction/psychovisual",title:"Psychovisual",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/introduction/psychovisual.mdx",sourceDirName:"introduction",slug:"/introduction/psychovisual",permalink:"/docs/introduction/psychovisual",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/psychovisual.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Spotting Video Artifacts",permalink:"/docs/introduction/video-artifacts"},next:{title:"High Dynamic Range",permalink:"/docs/introduction/high-dynamic-range"}},a={},d=[{value:"Breakdown",id:"breakdown",level:2}];function l(e){const t={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"psychovisual",children:"Psychovisual"})}),"\n",(0,n.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsx)(t.admonition,{title:"Pending Review",type:"danger",children:(0,n.jsx)(t.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,n.jsxs)(t.p,{children:['"',(0,n.jsx)(t.em,{children:"Traditionally, the encoder tends to favor blurred reconstructed blocks over blocks which have wrong motion. The human eye generally prefers the wrong motion over the blur. Psycho-visual options combat this. While technically less \u201ccorrect\u201d, which is why they are disabled for research purposes, they should be enabled for content intended for \u201chuman eyes\u201d."}),' "']}),"\n",(0,n.jsxs)(t.p,{children:["-- Kokomins' x265 ",(0,n.jsx)(t.a,{href:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac",children:"guide"})]}),"\n",(0,n.jsx)(t.h2,{id:"breakdown",children:"Breakdown"}),"\n",(0,n.jsxs)(t.p,{children:["Traditionally, encoders prioritize blurring out fine details to maintain performance on simple metrics like ",(0,n.jsx)(t.a,{href:"/docs/metrics/PSNR",children:"PSNR"}),", but the human visual system is much more complex. This discrepancy can lead to encoders rejecting sharp blocks that don't fit perfectly with adjacent blocks, resulting in a loss of detail. Psychovisual options address this issue by providing the encoder with the necessary \"confidence\" to incorporate these sharper blocks, even if they don't strictly adhere to metric performance."]}),"\n",(0,n.jsx)(t.p,{children:"Blurring can be beneficial at lower bitrates to help reduce the visibility of blocking artifacts, and it is generally preferable to view a slightly blurry image rather than a blocky one with distracting artifacts. However, it is essential to strike a balance when setting psychovisual options, as over-reliance on these settings can also have negative consequences. Experimentation is key to finding the optimal sweet spot for specific types of content."})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>c});var n=i(6540);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/90aedb84.99d3ef73.js b/assets/js/90aedb84.99d3ef73.js new file mode 100644 index 000000000..896606f6e --- /dev/null +++ b/assets/js/90aedb84.99d3ef73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1691],{829:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"introduction/psychovisual","title":"Psychovisual","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/introduction/psychovisual.mdx","sourceDirName":"introduction","slug":"/introduction/psychovisual","permalink":"/docs/introduction/psychovisual","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/psychovisual.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Spotting Video Artifacts","permalink":"/docs/introduction/video-artifacts"},"next":{"title":"High Dynamic Range","permalink":"/docs/introduction/high-dynamic-range"}}');var o=i(4848),s=i(8453);const r={sidebar_position:5},c="Psychovisual",a={},d=[{value:"Breakdown",id:"breakdown",level:2}];function l(e){const t={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"psychovisual",children:"Psychovisual"})}),"\n",(0,o.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,o.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,o.jsx)(t.admonition,{title:"Pending Review",type:"danger",children:(0,o.jsx)(t.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,o.jsxs)(t.p,{children:['"',(0,o.jsx)(t.em,{children:"Traditionally, the encoder tends to favor blurred reconstructed blocks over blocks which have wrong motion. The human eye generally prefers the wrong motion over the blur. Psycho-visual options combat this. While technically less \u201ccorrect\u201d, which is why they are disabled for research purposes, they should be enabled for content intended for \u201chuman eyes\u201d."}),' "']}),"\n",(0,o.jsxs)(t.p,{children:["-- Kokomins' x265 ",(0,o.jsx)(t.a,{href:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac",children:"guide"})]}),"\n",(0,o.jsx)(t.h2,{id:"breakdown",children:"Breakdown"}),"\n",(0,o.jsxs)(t.p,{children:["Traditionally, encoders prioritize blurring out fine details to maintain performance on simple metrics like ",(0,o.jsx)(t.a,{href:"/docs/metrics/PSNR",children:"PSNR"}),", but the human visual system is much more complex. This discrepancy can lead to encoders rejecting sharp blocks that don't fit perfectly with adjacent blocks, resulting in a loss of detail. Psychovisual options address this issue by providing the encoder with the necessary \"confidence\" to incorporate these sharper blocks, even if they don't strictly adhere to metric performance."]}),"\n",(0,o.jsx)(t.p,{children:"Blurring can be beneficial at lower bitrates to help reduce the visibility of blocking artifacts, and it is generally preferable to view a slightly blurry image rather than a blocky one with distracting artifacts. However, it is essential to strike a balance when setting psychovisual options, as over-reliance on these settings can also have negative consequences. Experimentation is key to finding the optimal sweet spot for specific types of content."})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>c});var n=i(6540);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/915a111c.13149dda.js b/assets/js/915a111c.13149dda.js new file mode 100644 index 000000000..e828586d9 --- /dev/null +++ b/assets/js/915a111c.13149dda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5889],{608:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"filtering/dehalo","title":"Dehalo","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/filtering/dehalo.mdx","sourceDirName":"filtering","slug":"/filtering/dehalo","permalink":"/docs/filtering/dehalo","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/dehalo.mdx","tags":[],"version":"current","sidebarPosition":9,"frontMatter":{"title":"Dehalo","sidebar_position":9},"sidebar":"tutorialSidebar","previous":{"title":"Denoise","permalink":"/docs/filtering/denoise"},"next":{"title":"Antialiasing","permalink":"/docs/filtering/antialiasing"}}');var o=i(4848),r=i(8453);const s={title:"Dehalo",sidebar_position:9},a="Dehalo",c={},l=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"dehalo",children:"Dehalo"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/915a111c.2e85eec2.js b/assets/js/915a111c.2e85eec2.js deleted file mode 100644 index af1dff132..000000000 --- a/assets/js/915a111c.2e85eec2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5889],{1389:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=i(4848),o=i(8453);const r={title:"Dehalo",sidebar_position:9},s="Dehalo",a={id:"filtering/dehalo",title:"Dehalo",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/dehalo.mdx",sourceDirName:"filtering",slug:"/filtering/dehalo",permalink:"/docs/filtering/dehalo",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/dehalo.mdx",tags:[],version:"current",sidebarPosition:9,frontMatter:{title:"Dehalo",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"Denoise",permalink:"/docs/filtering/denoise"},next:{title:"Antialiasing",permalink:"/docs/filtering/antialiasing"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"dehalo",children:"Dehalo"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/939f23de.2a2acb57.js b/assets/js/939f23de.2a2acb57.js new file mode 100644 index 000000000..6a5378433 --- /dev/null +++ b/assets/js/939f23de.2a2acb57.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2590],{7848:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"filtering/basics","title":"Basics of Filtering","description":"Intro to Filters","source":"@site/docs/filtering/basics.mdx","sourceDirName":"filtering","slug":"/filtering/basics","permalink":"/docs/filtering/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/basics.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Basics of Filtering","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Vapoursynth","permalink":"/docs/filtering/vapoursynth"},"next":{"title":"Inverse Telecine","permalink":"/docs/filtering/ivtc"}}');var n=t(4848),o=t(8453);const a={title:"Basics of Filtering",sidebar_position:3},r="Basics of Filtering with Vapoursynth",c={},l=[{value:"Intro to Filters",id:"intro-to-filters",level:2},{value:"Filter Order",id:"filter-order",level:2},{value:"Bit Depth and Colorimetry",id:"bit-depth-and-colorimetry",level:2},{value:"Cropping",id:"cropping",level:2},{value:"Resizing",id:"resizing",level:2},{value:"Trimming",id:"trimming",level:2}];function h(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"basics-of-filtering-with-vapoursynth",children:"Basics of Filtering with Vapoursynth"})}),"\n",(0,n.jsx)(i.h2,{id:"intro-to-filters",children:"Intro to Filters"}),"\n",(0,n.jsx)(i.p,{children:"In order to do filtering, we are going to need some filters. Vapoursynth includes some basic filters, but there are a lot more useful filters\nbuilt by the community that can be incredibly useful to us."}),"\n",(0,n.jsxs)(i.p,{children:["For example, we are going to make use of some of the functions in ",(0,n.jsx)(i.a,{href:"https://github.com/Jaded-Encoding-Thaumaturgy/vs-tools",children:"vs-tools"}),".\nIf you are on Arch, the recommended way to install this is via the AUR, using the ",(0,n.jsx)(i.code,{children:"vapoursynth-plugin-vstools-git"})," package.\nFor other operating systems, it is simpler to install all of the JET plugins at once, using the ",(0,n.jsx)(i.a,{href:"https://github.com/Jaded-Encoding-Thaumaturgy/vs-jet",children:"vs-jet utility"}),".\nNote that these do require Python, which you should already have installed if you've installed Vapoursynth. You may have noticed in the previous section\nthat all Vapoursynth scripts use Python syntax. It is not necessary to know Python in order to write Vapoursynth scripts, although it can be helpful\nfor some more advanced techniques."]}),"\n",(0,n.jsx)(i.h2,{id:"filter-order",children:"Filter Order"}),"\n",(0,n.jsx)(i.p,{children:"Order matters when applying filters to a video. There are certain actions that must be taken at the very start, and certain actions that are better to be done\nlater in a filter chain. The following image shows a recommended order for many of the most common filter actions:"}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"filter chain",src:t(5090).A+"",width:"720",height:"409"})}),"\n",(0,n.jsx)(i.p,{children:"If this seems a bit complicated at first, that's okay. We will learn about each of these steps one at a time, and when\neach of these filters might be needed."}),"\n",(0,n.jsx)(i.h2,{id:"bit-depth-and-colorimetry",children:"Bit Depth and Colorimetry"}),"\n",(0,n.jsxs)(i.p,{children:["In most cases, the first action we want to take on a video is to ensure the correct ",(0,n.jsx)(i.a,{href:"/docs/colorimetry/intro",children:"matrix, primaries, and transfer characteristics"})," are set, and convert the video to 16-bit.\nThe colorimetry properties are important for ensuring accurate colors, and 16-bit helps filters to work in higher quality and create fewer artifacts."]}),"\n",(0,n.jsxs)(i.p,{children:["The currently recommended way to handle this is with the ",(0,n.jsx)(i.code,{children:"vstools.initialize_clip"})," function. This function will handle both ensuring that colorimetry is set, and converting to 16-bit with appropriate dithering if needed.\nWe can add it to a script in the following way:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\ncore = vs.core\nclip = core.lsmas.LWLibavSource(source="myinput.mkv")\n\nimport vstools\nclip = vstools.initialize_clip(clip)\n\nclip.set_output(0)\n'})}),"\n",(0,n.jsxs)(i.p,{children:["If the video has existing colorimetry data set on it, ",(0,n.jsx)(i.code,{children:"initialize_clip"})," will keep the existing data. Otherwise, it will assume colorimetry based on the video resolution.\nUsually, those assumptions will be correct. However, there may be cases where we know that the assumptions are incorrect, and we need to set them manually.\nFor example, we may have a 4k video that we know was upscaled from a 1080p video, and we want to force BT.709 colorimetry. In that case, we can specify the properties to ",(0,n.jsx)(i.code,{children:"initialize_clip"}),",\nand it will use the properties we specify instead of making guesses."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:"from vstools import Primaries, Matrix, Transfer\nclip = vstools.initialize_clip(clip, primaries=Primaries.BT709, matrix=Matrix.BT709, transfer=Transfer.BT709)\n"})}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"initialize_clip"})," also has a companion function called ",(0,n.jsx)(i.code,{children:"finalize_clip"})," which will, by default, convert the video down to 10-bit with dithering, and if the video is in limited color range,\nclip all pixels to fit within the limited color range (this would be done by the player on playback, but if we do it now, we can save a few bits for the encoder). The function also takes\na ",(0,n.jsx)(i.code,{children:"bits"})," parameter in case you would like to finalize to 8-bits instead."]}),"\n",(0,n.jsx)(i.p,{children:"As a result, a very basic template for a Vapoursynth script would be something like this:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\ncore = vs.core\nclip = core.lsmas.LWLibavSource(source="myinput.mkv")\n\nimport vstools\nclip = vstools.initialize_clip(clip)\n//\n// Add filters inside this section\n//\nclip = vstools.finalize_clip(clip)\n\n\nclip.set_output(0)\n'})}),"\n",(0,n.jsx)(i.h2,{id:"cropping",children:"Cropping"}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"screenshot",src:t(4312).A+"",width:"1920",height:"1080"})}),"\n",(0,n.jsx)(i.p,{children:'Sometimes, you may encounter a source that has black bars on the sides or on the top and bottom. Generally, we don\'t like to keep these, and want to remove them. This process is called "cropping".'}),"\n",(0,n.jsx)(i.p,{children:'First, we need to figure out how many pixels to crop from each side. Fortunately, vs-preview has a tool to make this easy. Using this tool, which is found under the "Misc" section in the bottom right\nof the app, allows us to experiment with crop values and find the correct ones without having to reload the Vapoursynth script.'}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"crop tool",src:t(9096).A+"",width:"789",height:"285"})}),"\n",(0,n.jsx)(i.p,{children:'Once we flip the tool to "On", we can adjust each of the dimensions until we see the black borders disappear. We want to try to get as exact as possible, although the crop values must be a multiple of 2\nwhen working with YUV420 video (which is the most common). In this case, we know we want to remove from the top and bottom, so we will adjust those values until we find the right ones. Note that the size of the bars\nmay often be the same on both sides, but not always, so do be careful to check both sides.'}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"zoom tool",src:t(489).A+"",width:"1241",height:"256"})}),"\n",(0,n.jsx)(i.p,{children:"vs-preview's zoom tool shown here can also be helpful to ensure we've gotten the right values."}),"\n",(0,n.jsx)(i.p,{children:'Once we\'ve found the correct values, we can click "Copy cropping command" to copy our value to the clipboard. We can then paste it into our Vapoursynth script, being sure to add the appropriate variable name for our clip.'}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:"clip = clip.std.Crop(0, 0, 138, 138)\n"})}),"\n",(0,n.jsx)(i.p,{children:"Remember to turn off the crop tool in vs-preview, or else we'll be doubling the crops from here on. Now, go ahead and reload the preview with Ctrl+R. No more black bars."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"screenshot",src:t(4887).A+"",width:"1920",height:"804"})}),"\n",(0,n.jsx)(i.h2,{id:"resizing",children:"Resizing"}),"\n",(0,n.jsx)(i.p,{children:"Resizing is the process of changing the resolution of a video, whether that's making it bigger or smaller. Note that although the general idea is that \"higher resolution is better\",\nwe generally don't want to upscale content. This simply makes output videos larger in file size, but doesn't result in an increase in quality, because the higher resolution is artificial.\nHowever, there are times when you may want or need to resize a video. Unfortunately, this is not as simple as it sounds, because we want to select a high-quality resizing method."}),"\n",(0,n.jsxs)(i.p,{children:["With this section, we'll introduce ",(0,n.jsx)(i.a,{href:"https://slow.pics/",children:"slow.pics"}),", a very useful tool for comparing screenshots. Here, we'll be using it to show the differences between various resizers."]}),"\n",(0,n.jsx)(i.p,{children:"Vapoursynth comes with several resizers built-in, which will be the easiest to use. Of these, we'll be showcasing the following:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:"clip = clip.resize.Bicubic(1920, 1080)\nclip = clip.resize.Lanczos(1920, 1080)\nclip = clip.resize.Spline36(1920, 1080)\n"})}),"\n",(0,n.jsxs)(i.p,{children:["Bicubic is the most widely used resizer. It is very fast and produces decent quality, but may produce less sharpness than more advanced scalers.\nLanczos produces more sharpness, but may also produce more ",(0,n.jsx)(i.a,{href:"/docs/filtering/dehalo",children:"ringing"}),".\nSpline36 uses a spline-based resizing method, and produces results somewhere between Bicubic and Lanczos."]}),"\n",(0,n.jsx)(i.p,{children:"However, using plugins, we have access to some more advanced scalers."}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:"clip = vskernels.Catrom().scale(clip, 1920, 1080)\nclip = vskernels.Catrom(sigmoid=True).scale(clip, 1920, 1080)\nclip = vskernels.Hermite(linear=True).scale(clip, 1920, 1080)\nclip = vsscale.SSIM().scale(clip, 1920, 1080)\n"})}),"\n",(0,n.jsx)(i.p,{children:"Here we will look at downscalers."}),"\n",(0,n.jsx)(i.p,{children:"Catrom, short for Catmull-Rom, is a variant of Bicubic which uses different parameters in order to achieve a better balance between sharpness and ringing.\nIt is often considered the best of the Bicubic kernels for image quality."}),"\n",(0,n.jsxs)(i.p,{children:["In the second example, you can see that we pass an additional ",(0,n.jsx)(i.code,{children:"sigmoid=True"})," parameter to ",(0,n.jsx)(i.code,{children:"Catrom"}),". This performs the scaling using a sigmoid function, which flattens the ends of the scaling curve to reduce ringing."]}),"\n",(0,n.jsxs)(i.p,{children:["The third example here, Hermite, is another variant of Bicubic, and we are passing ",(0,n.jsx)(i.code,{children:"linear=True"})," to perform the rescaling in linear light rather than in gamma light. This kernel is very good in regard to\nnot producing ringing, but it does have the effect of thinning line art. Therefore, although some users prefer it, other users dislike it."]}),"\n",(0,n.jsx)(i.p,{children:"Fourth, we have SSIM, which is a downscaler tuned around the SSIM video quality metric. This downscaler is intended to prioritize preserving detail and sharpness when downscaling."}),"\n",(0,n.jsxs)(i.p,{children:["In ",(0,n.jsx)(i.a,{href:"https://slow.pics/c/mb5Rm3k3",children:"this comparison"}),", we can see the differences between the different scalers, on an image that was upscaled to 4k by nnedi3, then downscaled back using the scaler noted in the image title.\nHere we have a couple of other ",(0,n.jsx)(i.a,{href:"https://slow.pics/c/kQvDOMYh",children:"examples"})," comparing in particular the ",(0,n.jsx)(i.a,{href:"https://slow.pics/c/UVwS62Vs",children:"higher-quality scalers"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["Of these, my current recommendation would be ",(0,n.jsx)(i.code,{children:"Catrom(sigmoid=True)"})," for anime, and ",(0,n.jsx)(i.code,{children:"SSIM"})," for live action. Some users may prefer ",(0,n.jsx)(i.code,{children:"Hermite(linear=True)"})," for anime."]}),"\n",(0,n.jsx)(i.p,{children:"For upscaling, we have the following high quality options:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:"clip = vskernels.EwaLanczos().scale(clip, 3840, 2160)\nclip = vsaa.Nnedi3().scale(clip, 3840, 2160)\nclip = vsscale.Waifu2x().scale(clip, 3840, 2160)\n"})}),"\n",(0,n.jsx)(i.p,{children:"Ewa-Lanczos is a variant of lanczos intended for high sharpness, making it good for upscaling, where we want an image to look sharper so that it does not appear upscaled."}),"\n",(0,n.jsx)(i.p,{children:"Nnedi3 is a neural-network-based upscaler which attempts to interpolate every second line to produce a sharp, upscaled image. It is generally safe for use on all content, and produces good results."}),"\n",(0,n.jsx)(i.p,{children:"Waifu2x is another AI-assisted upscaler, this one tuned specifically on anime. It produces very high quality and sharp images. However, the results of using it on live action content are unknown, so it is recommended to only use it on anime."}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://slow.pics/c/CpISIk1z",children:"Here"})," we can see the effects of these upscalers. My current recommendation would be ",(0,n.jsx)(i.code,{children:"EwaLanczos"})," for live action, and ",(0,n.jsx)(i.code,{children:"Waifu2x"})," for anime."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:"clip = soifunc.good_resize(clip, 1920, 1080)\nclip = soifunc.good_resize(clip, 1920, 1080, anime=True)\n"})}),"\n",(0,n.jsxs)(i.p,{children:["Lastly, we have ",(0,n.jsx)(i.code,{children:"soifunc.good_resize"}),", which is a smart hybrid scaler which automatically chooses the best scaler depending on whether we are upscaling or downscaling,\nand may use a different scaler for chroma than it does for luma for even better quality.\nNote that the scalers chosen by this function may change over time as new knowledge surfaces, and are based on the above recommendations.\nWe can also add the ",(0,n.jsx)(i.code,{children:"anime=True"})," parameter (false by default) to change the scalers to be tuned\nmore toward the fine line art that is present in anime, rather than the highly detailed elements such as skin and hair that are present in live action.\nWith these features, it is intended to be an easy-to-use general purpose high-quality upscaler."]}),"\n",(0,n.jsx)(i.h2,{id:"trimming",children:"Trimming"}),"\n",(0,n.jsx)(i.p,{children:"Sometimes, we may need to cut out a portion of the video, for example, if we want to encode only the opening theme, or if our source has commercials that we want to remove.\nVapoursynth supports this using Python's slice syntax."}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:"clip = clip[1805:3185]\n"})}),"\n",(0,n.jsxs)(i.p,{children:["This snippet will trim the clip to include frames 1805-3184. Note that frame 3185 is ",(0,n.jsx)(i.em,{children:"not"})," included."]}),"\n",(0,n.jsxs)(i.p,{children:["Now, let's say we wanted to ",(0,n.jsx)(i.em,{children:"exclude"})," this segment. We can do this by making clips of the segments we'd like to keep, and joining them together."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:"clip = clip[:1805] + clip[3185:]\n"})}),"\n",(0,n.jsx)(i.p,{children:"This snippet will create trims for the start of the clip to and including frame 1804, and from frame 3185 to the end of the clip. It then joins them together into one clip, in the order we specify.\nIf we wanted to reverse the segments, so that segment 2 comes first, we could do that simply by changing the order:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-python",children:"clip = clip[3185:] + clip[:1805]\n"})})]})}function d(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},4312:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/crop_1-73affad30171f53704bec5d92be8e16b.jpg"},4887:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/crop_2-312cf367bf3cbfb3dd3a0cff94d84811.jpg"},9096:(e,i,t)=>{t.d(i,{A:()=>s});const s="data:image/webp;base64,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"},5090:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/vs2-bafcc8e7dc68430ca2784ef3f66237c8.webp"},489:(e,i,t)=>{t.d(i,{A:()=>s});const s="data:image/avif;base64,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"},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var s=t(6540);const n={},o=s.createContext(n);function a(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/939f23de.7f243198.js b/assets/js/939f23de.7f243198.js deleted file mode 100644 index 76c7a2465..000000000 --- a/assets/js/939f23de.7f243198.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2590],{631:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var s=t(4848),n=t(8453);const o={title:"Basics of Filtering",sidebar_position:3},a="Basics of Filtering with Vapoursynth",r={id:"filtering/basics",title:"Basics of Filtering",description:"Intro to Filters",source:"@site/docs/filtering/basics.mdx",sourceDirName:"filtering",slug:"/filtering/basics",permalink:"/docs/filtering/basics",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/basics.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Basics of Filtering",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Vapoursynth",permalink:"/docs/filtering/vapoursynth"},next:{title:"Inverse Telecine",permalink:"/docs/filtering/ivtc"}},c={},l=[{value:"Intro to Filters",id:"intro-to-filters",level:2},{value:"Filter Order",id:"filter-order",level:2},{value:"Bit Depth and Colorimetry",id:"bit-depth-and-colorimetry",level:2},{value:"Cropping",id:"cropping",level:2},{value:"Resizing",id:"resizing",level:2},{value:"Trimming",id:"trimming",level:2}];function h(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"basics-of-filtering-with-vapoursynth",children:"Basics of Filtering with Vapoursynth"})}),"\n",(0,s.jsx)(i.h2,{id:"intro-to-filters",children:"Intro to Filters"}),"\n",(0,s.jsx)(i.p,{children:"In order to do filtering, we are going to need some filters. Vapoursynth includes some basic filters, but there are a lot more useful filters\nbuilt by the community that can be incredibly useful to us."}),"\n",(0,s.jsxs)(i.p,{children:["For example, we are going to make use of some of the functions in ",(0,s.jsx)(i.a,{href:"https://github.com/Jaded-Encoding-Thaumaturgy/vs-tools",children:"vs-tools"}),".\nIf you are on Arch, the recommended way to install this is via the AUR, using the ",(0,s.jsx)(i.code,{children:"vapoursynth-plugin-vstools-git"})," package.\nFor other operating systems, it is simpler to install all of the JET plugins at once, using the ",(0,s.jsx)(i.a,{href:"https://github.com/Jaded-Encoding-Thaumaturgy/vs-jet",children:"vs-jet utility"}),".\nNote that these do require Python, which you should already have installed if you've installed Vapoursynth. You may have noticed in the previous section\nthat all Vapoursynth scripts use Python syntax. It is not necessary to know Python in order to write Vapoursynth scripts, although it can be helpful\nfor some more advanced techniques."]}),"\n",(0,s.jsx)(i.h2,{id:"filter-order",children:"Filter Order"}),"\n",(0,s.jsx)(i.p,{children:"Order matters when applying filters to a video. There are certain actions that must be taken at the very start, and certain actions that are better to be done\nlater in a filter chain. The following image shows a recommended order for many of the most common filter actions:"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"filter chain",src:t(9419).A+"",width:"720",height:"409"})}),"\n",(0,s.jsx)(i.p,{children:"If this seems a bit complicated at first, that's okay. We will learn about each of these steps one at a time, and when\neach of these filters might be needed."}),"\n",(0,s.jsx)(i.h2,{id:"bit-depth-and-colorimetry",children:"Bit Depth and Colorimetry"}),"\n",(0,s.jsxs)(i.p,{children:["In most cases, the first action we want to take on a video is to ensure the correct ",(0,s.jsx)(i.a,{href:"/docs/colorimetry/intro",children:"matrix, primaries, and transfer characteristics"})," are set, and convert the video to 16-bit.\nThe colorimetry properties are important for ensuring accurate colors, and 16-bit helps filters to work in higher quality and create fewer artifacts."]}),"\n",(0,s.jsxs)(i.p,{children:["The currently recommended way to handle this is with the ",(0,s.jsx)(i.code,{children:"vstools.initialize_clip"})," function. This function will handle both ensuring that colorimetry is set, and converting to 16-bit with appropriate dithering if needed.\nWe can add it to a script in the following way:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\ncore = vs.core\nclip = core.lsmas.LWLibavSource(source="myinput.mkv")\n\nimport vstools\nclip = vstools.initialize_clip(clip)\n\nclip.set_output(0)\n'})}),"\n",(0,s.jsxs)(i.p,{children:["If the video has existing colorimetry data set on it, ",(0,s.jsx)(i.code,{children:"initialize_clip"})," will keep the existing data. Otherwise, it will assume colorimetry based on the video resolution.\nUsually, those assumptions will be correct. However, there may be cases where we know that the assumptions are incorrect, and we need to set them manually.\nFor example, we may have a 4k video that we know was upscaled from a 1080p video, and we want to force BT.709 colorimetry. In that case, we can specify the properties to ",(0,s.jsx)(i.code,{children:"initialize_clip"}),",\nand it will use the properties we specify instead of making guesses."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"from vstools import Primaries, Matrix, Transfer\nclip = vstools.initialize_clip(clip, primaries=Primaries.BT709, matrix=Matrix.BT709, transfer=Transfer.BT709)\n"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.code,{children:"initialize_clip"})," also has a companion function called ",(0,s.jsx)(i.code,{children:"finalize_clip"})," which will, by default, convert the video down to 10-bit with dithering, and if the video is in limited color range,\nclip all pixels to fit within the limited color range (this would be done by the player on playback, but if we do it now, we can save a few bits for the encoder). The function also takes\na ",(0,s.jsx)(i.code,{children:"bits"})," parameter in case you would like to finalize to 8-bits instead."]}),"\n",(0,s.jsx)(i.p,{children:"As a result, a very basic template for a Vapoursynth script would be something like this:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:'import vapoursynth as vs\ncore = vs.core\nclip = core.lsmas.LWLibavSource(source="myinput.mkv")\n\nimport vstools\nclip = vstools.initialize_clip(clip)\n//\n// Add filters inside this section\n//\nclip = vstools.finalize_clip(clip)\n\n\nclip.set_output(0)\n'})}),"\n",(0,s.jsx)(i.h2,{id:"cropping",children:"Cropping"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"screenshot",src:t(5145).A+"",width:"1920",height:"1080"})}),"\n",(0,s.jsx)(i.p,{children:'Sometimes, you may encounter a source that has black bars on the sides or on the top and bottom. Generally, we don\'t like to keep these, and want to remove them. This process is called "cropping".'}),"\n",(0,s.jsx)(i.p,{children:'First, we need to figure out how many pixels to crop from each side. Fortunately, vs-preview has a tool to make this easy. Using this tool, which is found under the "Misc" section in the bottom right\nof the app, allows us to experiment with crop values and find the correct ones without having to reload the Vapoursynth script.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"crop tool",src:t(9145).A+"",width:"789",height:"285"})}),"\n",(0,s.jsx)(i.p,{children:'Once we flip the tool to "On", we can adjust each of the dimensions until we see the black borders disappear. We want to try to get as exact as possible, although the crop values must be a multiple of 2\nwhen working with YUV420 video (which is the most common). In this case, we know we want to remove from the top and bottom, so we will adjust those values until we find the right ones. Note that the size of the bars\nmay often be the same on both sides, but not always, so do be careful to check both sides.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"zoom tool",src:t(8240).A+"",width:"1241",height:"256"})}),"\n",(0,s.jsx)(i.p,{children:"vs-preview's zoom tool shown here can also be helpful to ensure we've gotten the right values."}),"\n",(0,s.jsx)(i.p,{children:'Once we\'ve found the correct values, we can click "Copy cropping command" to copy our value to the clipboard. We can then paste it into our Vapoursynth script, being sure to add the appropriate variable name for our clip.'}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"clip = clip.std.Crop(0, 0, 138, 138)\n"})}),"\n",(0,s.jsx)(i.p,{children:"Remember to turn off the crop tool in vs-preview, or else we'll be doubling the crops from here on. Now, go ahead and reload the preview with Ctrl+R. No more black bars."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"screenshot",src:t(4878).A+"",width:"1920",height:"804"})}),"\n",(0,s.jsx)(i.h2,{id:"resizing",children:"Resizing"}),"\n",(0,s.jsx)(i.p,{children:"Resizing is the process of changing the resolution of a video, whether that's making it bigger or smaller. Note that although the general idea is that \"higher resolution is better\",\nwe generally don't want to upscale content. This simply makes output videos larger in file size, but doesn't result in an increase in quality, because the higher resolution is artificial.\nHowever, there are times when you may want or need to resize a video. Unfortunately, this is not as simple as it sounds, because we want to select a high-quality resizing method."}),"\n",(0,s.jsxs)(i.p,{children:["With this section, we'll introduce ",(0,s.jsx)(i.a,{href:"https://slow.pics/",children:"slow.pics"}),", a very useful tool for comparing screenshots. Here, we'll be using it to show the differences between various resizers."]}),"\n",(0,s.jsx)(i.p,{children:"Vapoursynth comes with several resizers built-in, which will be the easiest to use. Of these, we'll be showcasing the following:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"clip = clip.resize.Bicubic(1920, 1080)\nclip = clip.resize.Lanczos(1920, 1080)\nclip = clip.resize.Spline36(1920, 1080)\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Bicubic is the most widely used resizer. It is very fast and produces decent quality, but may produce less sharpness than more advanced scalers.\nLanczos produces more sharpness, but may also produce more ",(0,s.jsx)(i.a,{href:"/docs/filtering/dehalo",children:"ringing"}),".\nSpline36 uses a spline-based resizing method, and produces results somewhere between Bicubic and Lanczos."]}),"\n",(0,s.jsx)(i.p,{children:"However, using plugins, we have access to some more advanced scalers."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"clip = vskernels.Catrom().scale(clip, 1920, 1080)\nclip = vskernels.Catrom(sigmoid=True).scale(clip, 1920, 1080)\nclip = vskernels.Hermite(linear=True).scale(clip, 1920, 1080)\nclip = vsscale.SSIM().scale(clip, 1920, 1080)\n"})}),"\n",(0,s.jsx)(i.p,{children:"Here we will look at downscalers."}),"\n",(0,s.jsx)(i.p,{children:"Catrom, short for Catmull-Rom, is a variant of Bicubic which uses different parameters in order to achieve a better balance between sharpness and ringing.\nIt is often considered the best of the Bicubic kernels for image quality."}),"\n",(0,s.jsxs)(i.p,{children:["In the second example, you can see that we pass an additional ",(0,s.jsx)(i.code,{children:"sigmoid=True"})," parameter to ",(0,s.jsx)(i.code,{children:"Catrom"}),". This performs the scaling using a sigmoid function, which flattens the ends of the scaling curve to reduce ringing."]}),"\n",(0,s.jsxs)(i.p,{children:["The third example here, Hermite, is another variant of Bicubic, and we are passing ",(0,s.jsx)(i.code,{children:"linear=True"})," to perform the rescaling in linear light rather than in gamma light. This kernel is very good in regard to\nnot producing ringing, but it does have the effect of thinning line art. Therefore, although some users prefer it, other users dislike it."]}),"\n",(0,s.jsx)(i.p,{children:"Fourth, we have SSIM, which is a downscaler tuned around the SSIM video quality metric. This downscaler is intended to prioritize preserving detail and sharpness when downscaling."}),"\n",(0,s.jsxs)(i.p,{children:["In ",(0,s.jsx)(i.a,{href:"https://slow.pics/c/mb5Rm3k3",children:"this comparison"}),", we can see the differences between the different scalers, on an image that was upscaled to 4k by nnedi3, then downscaled back using the scaler noted in the image title.\nHere we have a couple of other ",(0,s.jsx)(i.a,{href:"https://slow.pics/c/kQvDOMYh",children:"examples"})," comparing in particular the ",(0,s.jsx)(i.a,{href:"https://slow.pics/c/UVwS62Vs",children:"higher-quality scalers"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Of these, my current recommendation would be ",(0,s.jsx)(i.code,{children:"Catrom(sigmoid=True)"})," for anime, and ",(0,s.jsx)(i.code,{children:"SSIM"})," for live action. Some users may prefer ",(0,s.jsx)(i.code,{children:"Hermite(linear=True)"})," for anime."]}),"\n",(0,s.jsx)(i.p,{children:"For upscaling, we have the following high quality options:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"clip = vskernels.EwaLanczos().scale(clip, 3840, 2160)\nclip = vsaa.Nnedi3().scale(clip, 3840, 2160)\nclip = vsscale.Waifu2x().scale(clip, 3840, 2160)\n"})}),"\n",(0,s.jsx)(i.p,{children:"Ewa-Lanczos is a variant of lanczos intended for high sharpness, making it good for upscaling, where we want an image to look sharper so that it does not appear upscaled."}),"\n",(0,s.jsx)(i.p,{children:"Nnedi3 is a neural-network-based upscaler which attempts to interpolate every second line to produce a sharp, upscaled image. It is generally safe for use on all content, and produces good results."}),"\n",(0,s.jsx)(i.p,{children:"Waifu2x is another AI-assisted upscaler, this one tuned specifically on anime. It produces very high quality and sharp images. However, the results of using it on live action content are unknown, so it is recommended to only use it on anime."}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.a,{href:"https://slow.pics/c/CpISIk1z",children:"Here"})," we can see the effects of these upscalers. My current recommendation would be ",(0,s.jsx)(i.code,{children:"EwaLanczos"})," for live action, and ",(0,s.jsx)(i.code,{children:"Waifu2x"})," for anime."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"clip = soifunc.good_resize(clip, 1920, 1080)\nclip = soifunc.good_resize(clip, 1920, 1080, anime=True)\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Lastly, we have ",(0,s.jsx)(i.code,{children:"soifunc.good_resize"}),", which is a smart hybrid scaler which automatically chooses the best scaler depending on whether we are upscaling or downscaling,\nand may use a different scaler for chroma than it does for luma for even better quality.\nNote that the scalers chosen by this function may change over time as new knowledge surfaces, and are based on the above recommendations.\nWe can also add the ",(0,s.jsx)(i.code,{children:"anime=True"})," parameter (false by default) to change the scalers to be tuned\nmore toward the fine line art that is present in anime, rather than the highly detailed elements such as skin and hair that are present in live action.\nWith these features, it is intended to be an easy-to-use general purpose high-quality upscaler."]}),"\n",(0,s.jsx)(i.h2,{id:"trimming",children:"Trimming"}),"\n",(0,s.jsx)(i.p,{children:"Sometimes, we may need to cut out a portion of the video, for example, if we want to encode only the opening theme, or if our source has commercials that we want to remove.\nVapoursynth supports this using Python's slice syntax."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"clip = clip[1805:3185]\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This snippet will trim the clip to include frames 1805-3184. Note that frame 3185 is ",(0,s.jsx)(i.em,{children:"not"})," included."]}),"\n",(0,s.jsxs)(i.p,{children:["Now, let's say we wanted to ",(0,s.jsx)(i.em,{children:"exclude"})," this segment. We can do this by making clips of the segments we'd like to keep, and joining them together."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"clip = clip[:1805] + clip[3185:]\n"})}),"\n",(0,s.jsx)(i.p,{children:"This snippet will create trims for the start of the clip to and including frame 1804, and from frame 3185 to the end of the clip. It then joins them together into one clip, in the order we specify.\nIf we wanted to reverse the segments, so that segment 2 comes first, we could do that simply by changing the order:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-python",children:"clip = clip[3185:] + clip[:1805]\n"})})]})}function d(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},5145:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/crop_1-73affad30171f53704bec5d92be8e16b.jpg"},4878:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/crop_2-312cf367bf3cbfb3dd3a0cff94d84811.jpg"},9145:(e,i,t)=>{t.d(i,{A:()=>s});const s="data:image/webp;base64,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"},9419:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/vs2-bafcc8e7dc68430ca2784ef3f66237c8.webp"},8240:(e,i,t)=>{t.d(i,{A:()=>s});const s="data:image/avif;base64,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"},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var s=t(6540);const n={},o=s.createContext(n);function a(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/94782d2d.2e40e9e1.js b/assets/js/94782d2d.2e40e9e1.js new file mode 100644 index 000000000..c386766a5 --- /dev/null +++ b/assets/js/94782d2d.2e40e9e1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4597],{3539:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"colorimetry/range","title":"Color Range","description":"Range is a concept that describes the valid values for a pixel.","source":"@site/docs/colorimetry/range.mdx","sourceDirName":"colorimetry","slug":"/colorimetry/range","permalink":"/docs/colorimetry/range","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/range.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Color Range","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Color Formats","permalink":"/docs/colorimetry/format"},"next":{"title":"Color Primaries","permalink":"/docs/colorimetry/primaries"}}');var r=n(4848),i=n(8453);const a={title:"Color Range",sidebar_position:3},s="Color Range",l={},c=[];function d(e){const t={h1:"h1",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"color-range",children:"Color Range"})}),"\n",(0,r.jsx)(t.p,{children:"Range is a concept that describes the valid values for a pixel.\nTypically, RGB will use full range and YUV will use limited range."}),"\n",(0,r.jsx)(t.p,{children:"What does this mean?"}),"\n",(0,r.jsx)(t.p,{children:"For 8-bit video, full range indicates that all values between 0-255\nmay be used to represent a color value. On the other hand, limited range\nindicates that only values between 16-235, or 16-240 for chroma,\nare valid, and any values outside that range will be clamped to fit in\nthat range. These expand to equivalent ranges for high bit depth videos."}),"\n",(0,r.jsx)(t.p,{children:"Why is limited range a thing that exists? Essentially, it's due to\nhistorical reasons, but it's a convention that we are stuck with today.\nEven though full range may provide slightly better color accuracy,\nit is far less meaningful for high bit depth content, and even\nHDR blu-rays use limited color range. Therefore, it is recommended to\nfollow existing conventions."})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var o=n(6540);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/94782d2d.d31eacaa.js b/assets/js/94782d2d.d31eacaa.js deleted file mode 100644 index 8d18b45ee..000000000 --- a/assets/js/94782d2d.d31eacaa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4597],{2774:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var o=n(4848),r=n(8453);const i={title:"Color Range",sidebar_position:3},a="Color Range",s={id:"colorimetry/range",title:"Color Range",description:"Range is a concept that describes the valid values for a pixel.",source:"@site/docs/colorimetry/range.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/range",permalink:"/docs/colorimetry/range",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/range.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Color Range",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Color Formats",permalink:"/docs/colorimetry/format"},next:{title:"Color Primaries",permalink:"/docs/colorimetry/primaries"}},l={},c=[];function d(e){const t={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"color-range",children:"Color Range"})}),"\n",(0,o.jsx)(t.p,{children:"Range is a concept that describes the valid values for a pixel.\nTypically, RGB will use full range and YUV will use limited range."}),"\n",(0,o.jsx)(t.p,{children:"What does this mean?"}),"\n",(0,o.jsx)(t.p,{children:"For 8-bit video, full range indicates that all values between 0-255\nmay be used to represent a color value. On the other hand, limited range\nindicates that only values between 16-235, or 16-240 for chroma,\nare valid, and any values outside that range will be clamped to fit in\nthat range. These expand to equivalent ranges for high bit depth videos."}),"\n",(0,o.jsx)(t.p,{children:"Why is limited range a thing that exists? Essentially, it's due to\nhistorical reasons, but it's a convention that we are stuck with today.\nEven though full range may provide slightly better color accuracy,\nit is far less meaningful for high bit depth content, and even\nHDR blu-rays use limited color range. Therefore, it is recommended to\nfollow existing conventions."})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var o=n(6540);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/95e9a4c5.9c25a70f.js b/assets/js/95e9a4c5.9c25a70f.js deleted file mode 100644 index 407c6dcda..000000000 --- a/assets/js/95e9a4c5.9c25a70f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3672],{7426:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>d,toc:()=>x});var i=n(4848),s=n(8453);const r={title:"Discord",sidebar_position:14},l="Discord",d={id:"utilities/Discord",title:"Discord",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/utilities/Discord.mdx",sourceDirName:"utilities",slug:"/utilities/Discord",permalink:"/docs/utilities/Discord",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Discord.mdx",tags:[],version:"current",sidebarPosition:14,frontMatter:{title:"Discord",sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"YUView",permalink:"/docs/utilities/YUView"},next:{title:"av1an-command-gen",permalink:"/docs/utilities/av1an-command-gen"}},c={},x=[{value:"Key",id:"key",level:2},{value:"Video Codecs & Containers",id:"video-codecs--containers",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"discord",children:"Discord"})}),"\n",(0,i.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsx)(t.admonition,{title:"Pending Review",type:"caution",children:(0,i.jsx)(t.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,i.jsxs)(t.p,{children:["This entry is a bit different from others, and may be moved to a blog post in the future. Below are a number of tables that enumerate the codecs Discord supports for local playback (",(0,i.jsx)(t.em,{children:"not"})," livestreaming). These tables are based on community testing across a number of platforms, and are not exhaustive."]}),"\n",(0,i.jsx)(t.h2,{id:"key",children:"Key"}),"\n",(0,i.jsxs)(t.p,{children:["The key has a number of emojis corresponding to full support, partial support, support with the ",(0,i.jsx)(t.a,{href:"https://wiki.x266.mov/blog/embedding-the-un-embeddable",children:"Discord embed workaround"}),", and no support."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"\u2705 Full support"}),"\n",(0,i.jsx)(t.li,{children:"\u26a0\ufe0f Partial support"}),"\n",(0,i.jsx)(t.li,{children:"\ud83d\udee0\ufe0f Support with the Discord embed workaround"}),"\n",(0,i.jsx)(t.li,{children:"\u2754 Untested or unknown"}),"\n",(0,i.jsx)(t.li,{children:"\u274c No support"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"If the browser isn't compatible with a particular platform, it will be marked as N/A."}),"\n",(0,i.jsx)(t.h2,{id:"video-codecs--containers",children:"Video Codecs & Containers"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"/docs/video/AVC",children:"H.264"})})," 4:2:0 8-bit lossy | .mp4"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Browser"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Chrome"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Firefox"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Safari"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"App"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"})})," 4:2:0 8-bit lossy | .mp4"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Browser"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Chrome"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f**"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Firefox"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f***"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Safari"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"App"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f**"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["* Only supports H.265 with the ",(0,i.jsx)(t.code,{children:"hvcC"})," box in the MP4 container. These streams can be encoded by adding ",(0,i.jsx)(t.code,{children:"-tag:v hvc1"})," to an FFmpeg encoding command."]}),"\n",(0,i.jsx)(t.p,{children:"** Requires you have hardware accelerated HEVC decoding support."}),"\n",(0,i.jsxs)(t.p,{children:["*** Firefox on Windows requires you have hardware accelerated HEVC decoding support and the ",(0,i.jsx)(t.code,{children:"media.wmf.hevc.enabled"})," flag enabled in ",(0,i.jsx)(t.code,{children:"about:config"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"})})," 4:2:0 8-bit lossy | .mov"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Browser"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Chrome"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f**"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Firefox"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f***"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Safari"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"App"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f**"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["* Only supports H.265 with the ",(0,i.jsx)(t.code,{children:"hvcC"})," box in the MOV container. These streams can be encoded by adding ",(0,i.jsx)(t.code,{children:"-tag:v hvc1"})," to an FFmpeg encoding command."]}),"\n",(0,i.jsx)(t.p,{children:"** Requires you have hardware accelerated HEVC decoding support."}),"\n",(0,i.jsxs)(t.p,{children:["*** Firefox on Windows requires you have hardware accelerated HEVC decoding support and the ",(0,i.jsx)(t.code,{children:"media.wmf.hevc.enabled"})," flag enabled in ",(0,i.jsx)(t.code,{children:"about:config"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"})})," 4:2:0 10-bit lossy | .mp4"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Browser"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Chrome"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Firefox"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Safari"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"App"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["* Only supports H.265 with the ",(0,i.jsx)(t.code,{children:"hvcC"})," box in the MP4 container. These streams can be encoded by adding ",(0,i.jsx)(t.code,{children:"-tag:v hvc1"})," to an FFmpeg encoding command."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"})})," 4:2:0 10-bit lossy | .mov"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Browser"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Chrome"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Firefox"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Safari"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"App"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["* Only supports H.265 with the ",(0,i.jsx)(t.code,{children:"hvcC"})," box in the MOV container. These streams can be encoded by adding ",(0,i.jsx)(t.code,{children:"-tag:v hvc1"})," to an FFmpeg encoding command."]})]})}function o(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var i=n(6540);const s={},r=i.createContext(s);function l(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/95e9a4c5.df3995e7.js b/assets/js/95e9a4c5.df3995e7.js new file mode 100644 index 000000000..c0b6141cb --- /dev/null +++ b/assets/js/95e9a4c5.df3995e7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3672],{3967:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>o,frontMatter:()=>l,metadata:()=>i,toc:()=>x});const i=JSON.parse('{"id":"utilities/Discord","title":"Discord","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/utilities/Discord.mdx","sourceDirName":"utilities","slug":"/utilities/Discord","permalink":"/docs/utilities/Discord","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Discord.mdx","tags":[],"version":"current","sidebarPosition":14,"frontMatter":{"title":"Discord","sidebar_position":14},"sidebar":"tutorialSidebar","previous":{"title":"YUView","permalink":"/docs/utilities/YUView"},"next":{"title":"av1an-command-gen","permalink":"/docs/utilities/av1an-command-gen"}}');var s=n(4848),r=n(8453);const l={title:"Discord",sidebar_position:14},d="Discord",c={},x=[{value:"Key",id:"key",level:2},{value:"Video Codecs & Containers",id:"video-codecs--containers",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"discord",children:"Discord"})}),"\n",(0,s.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsx)(t.admonition,{title:"Pending Review",type:"caution",children:(0,s.jsx)(t.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,s.jsxs)(t.p,{children:["This entry is a bit different from others, and may be moved to a blog post in the future. Below are a number of tables that enumerate the codecs Discord supports for local playback (",(0,s.jsx)(t.em,{children:"not"})," livestreaming). These tables are based on community testing across a number of platforms, and are not exhaustive."]}),"\n",(0,s.jsx)(t.h2,{id:"key",children:"Key"}),"\n",(0,s.jsxs)(t.p,{children:["The key has a number of emojis corresponding to full support, partial support, support with the ",(0,s.jsx)(t.a,{href:"https://wiki.x266.mov/blog/embedding-the-un-embeddable",children:"Discord embed workaround"}),", and no support."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"\u2705 Full support"}),"\n",(0,s.jsx)(t.li,{children:"\u26a0\ufe0f Partial support"}),"\n",(0,s.jsx)(t.li,{children:"\ud83d\udee0\ufe0f Support with the Discord embed workaround"}),"\n",(0,s.jsx)(t.li,{children:"\u2754 Untested or unknown"}),"\n",(0,s.jsx)(t.li,{children:"\u274c No support"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"If the browser isn't compatible with a particular platform, it will be marked as N/A."}),"\n",(0,s.jsx)(t.h2,{id:"video-codecs--containers",children:"Video Codecs & Containers"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"/docs/video/AVC",children:"H.264"})})," 4:2:0 8-bit lossy | .mp4"]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Browser"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Chrome"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Firefox"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Safari"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"App"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"})})," 4:2:0 8-bit lossy | .mp4"]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Browser"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Chrome"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f**"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Firefox"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f***"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Safari"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"App"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f**"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["* Only supports H.265 with the ",(0,s.jsx)(t.code,{children:"hvcC"})," box in the MP4 container. These streams can be encoded by adding ",(0,s.jsx)(t.code,{children:"-tag:v hvc1"})," to an FFmpeg encoding command."]}),"\n",(0,s.jsx)(t.p,{children:"** Requires you have hardware accelerated HEVC decoding support."}),"\n",(0,s.jsxs)(t.p,{children:["*** Firefox on Windows requires you have hardware accelerated HEVC decoding support and the ",(0,s.jsx)(t.code,{children:"media.wmf.hevc.enabled"})," flag enabled in ",(0,s.jsx)(t.code,{children:"about:config"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"})})," 4:2:0 8-bit lossy | .mov"]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Browser"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Chrome"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f**"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Firefox"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f***"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Safari"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"App"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f**"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["* Only supports H.265 with the ",(0,s.jsx)(t.code,{children:"hvcC"})," box in the MOV container. These streams can be encoded by adding ",(0,s.jsx)(t.code,{children:"-tag:v hvc1"})," to an FFmpeg encoding command."]}),"\n",(0,s.jsx)(t.p,{children:"** Requires you have hardware accelerated HEVC decoding support."}),"\n",(0,s.jsxs)(t.p,{children:["*** Firefox on Windows requires you have hardware accelerated HEVC decoding support and the ",(0,s.jsx)(t.code,{children:"media.wmf.hevc.enabled"})," flag enabled in ",(0,s.jsx)(t.code,{children:"about:config"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"})})," 4:2:0 10-bit lossy | .mp4"]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Browser"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Chrome"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Firefox"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Safari"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"App"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["* Only supports H.265 with the ",(0,s.jsx)(t.code,{children:"hvcC"})," box in the MP4 container. These streams can be encoded by adding ",(0,s.jsx)(t.code,{children:"-tag:v hvc1"})," to an FFmpeg encoding command."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"})})," 4:2:0 10-bit lossy | .mov"]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Browser"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"macOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Windows"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"iOS"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Android"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Linux"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Chrome"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Firefox"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2754"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Safari"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"N/A"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"App"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u26a0\ufe0f*"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u274c"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["* Only supports H.265 with the ",(0,s.jsx)(t.code,{children:"hvcC"})," box in the MOV container. These streams can be encoded by adding ",(0,s.jsx)(t.code,{children:"-tag:v hvc1"})," to an FFmpeg encoding command."]})]})}function o(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var i=n(6540);const s={},r=i.createContext(s);function l(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/998d107e.6cbdd3c4.js b/assets/js/998d107e.6cbdd3c4.js deleted file mode 100644 index 5f9040e7c..000000000 --- a/assets/js/998d107e.6cbdd3c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[274],{7672:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var t=n(4848),o=n(8453);const s={title:"FFV1",sidebar_position:12},r="FFV1",c={id:"video/FFV1",title:"FFV1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/FFV1.mdx",sourceDirName:"video",slug:"/video/FFV1",permalink:"/docs/video/FFV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/FFV1.mdx",tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"FFV1",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Theora",permalink:"/docs/video/Theora"},next:{title:"UT Video",permalink:"/docs/video/utvideo"}},d={},a=[{value:"History",id:"history",level:2},{value:"Usage",id:"usage",level:2},{value:"Options",id:"options",level:3},{value:"Intra-frame only catch",id:"intra-frame-only-catch",level:2}];function l(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"ffv1",children:"FFV1"})}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(i.p,{children:["FFV1 (",(0,t.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/html/rfc9043",children:"rfc9043"}),") is a lossless intra-frame video codec designed for archival use and preservation. Created by Michael Niedermayer, it is part of the ",(0,t.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," project. The codec supports a wide range of color spaces, works with YUV and RGB content including alpha channel of color depths ranging from 8 to 16 bits (only up to 14 in case of RGB). It has good parallelization support and achieves very high compression ratios compared to other lossless video encoders such as ",(0,t.jsx)(i.a,{href:"/docs/video/utvideo",children:"UT Video"}),", albeit at the cost of being more resource-hungry."]}),"\n",(0,t.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,t.jsx)(i.p,{children:"In 2003, the codec was merged into FFmpeg; however, the bitstream specification was frozen in 2006 (officially FFV1 version 0). Later, in 2009, version 1 came out, covering more video bit depths. Version 2 never got its release, existing only in experimental form."}),"\n",(0,t.jsx)(i.p,{children:"The third bitstream version was frozen in 2013 and is still the latest as of 2024. It added multithreading support and frame integrity checking."}),"\n",(0,t.jsxs)(i.p,{children:["There is a fourth version ",(0,t.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/draft-ietf-cellar-ffv1-v4/",children:"coming"})," which might bring better support for color spaces, compression improvements, and maybe proper inter-frame prediction."]}),"\n",(0,t.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="Fast, heavily multithreaded"',children:"ffmpeg -i input.mkv -c:v ffv1 -slices 16 out.mkv\n"})}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="Slow, highest compression"',children:"ffmpeg -i input.mkv -c:v ffv1 -g 60 -slices 4 -context 1 -coder 2 out.mkv\n"})}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="Recommended for archival purposes, high compression, multithreaded"',children:"ffmpeg -i input.mkv -c:v ffv1 -g 1 -slices 16 -slicecrc 1 -context 1 -coder 2 out.mkv\n"})}),"\n",(0,t.jsx)(i.h3,{id:"options",children:"Options"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"slices"})," - Slices divide the frame into multiple parts that can be encoded and decoded in parallel. Can only be one of: [",(0,t.jsx)(i.code,{children:"4"}),", ",(0,t.jsx)(i.code,{children:"6"}),", ",(0,t.jsx)(i.code,{children:"9"}),", ",(0,t.jsx)(i.code,{children:"12"}),", ",(0,t.jsx)(i.code,{children:"16"}),", ",(0,t.jsx)(i.code,{children:"24"}),", ",(0,t.jsx)(i.code,{children:"30"}),"], where ",(0,t.jsx)(i.code,{children:"4"})," is the default."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"slicecrc"})," - Setting it to ",(0,t.jsx)(i.code,{children:"1"})," will enable the decoder to detect errors in the bitstream. Must be enabled for archival use. Can be either ",(0,t.jsx)(i.code,{children:"0"})," or ",(0,t.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"context"})," - Setting it to ",(0,t.jsx)(i.code,{children:"1"})," will make the encoder use a larger context size, which usually leads to better compression. Can be either ",(0,t.jsx)(i.code,{children:"0"})," or ",(0,t.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"coder"})," - Sets entropy coding method:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"0"})," - Golomb-Rice (faster, default)"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"1"})," - Range Coder (used for higher bit depths and better compression)"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"2"})," - Range Coder with custom state transition table (almost the same as ",(0,t.jsx)(i.code,{children:"1"}),")"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"g"})," - Sets GOP size. Must be ",(0,t.jsx)(i.code,{children:"1"})," for archival use. ",(0,t.jsx)(i.a,{href:"#intra-frame-only-catch",children:"See below"})]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"intra-frame-only-catch",children:"Intra-frame only catch"}),"\n",(0,t.jsxs)(i.p,{children:["Intra-frame codecs do not use well known inter-frame video coding techniques such as motion compensation, reusing parts of surrounding frames or adapting encoding context based on them. Every frame is independent from one another. Common intra-frame codecs include Motion JPEG (Lossy), Motion JPEG 2000 (Both), and ",(0,t.jsx)(i.a,{href:"/docs/video/utvideo",children:"UT Video"})," (Lossless)."]}),"\n",(0,t.jsxs)(i.p,{children:["If you're a careful reader, you might have noticed that setting ",(0,t.jsx)(i.code,{children:"GOP size"})," isn't a common characteristic among intra-frame codecs."]}),"\n",(0,t.jsxs)(i.p,{children:["In fact, FFV1 can be considered an intra-frame codec only if the ",(0,t.jsx)(i.code,{children:"GOP size"})," is set to ",(0,t.jsx)(i.code,{children:"1"}),". When it's larger than that, its context model depends on other frames found within the GOP, which contradicts the definition of intra-frame video codec. That is why it's highly advised to set ",(0,t.jsx)(i.code,{children:"GOP size"})," to ",(0,t.jsx)(i.code,{children:"1"})," for archiving. This way, if a single frame gets damaged, you'll\nonly lose that frame. If ",(0,t.jsx)(i.code,{children:"GOP size"})," was large, you might lose much bigger part of the video."]}),"\n",(0,t.jsx)(i.p,{children:"References:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/FFV1",children:"Wikipedia"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/html/rfc9043",children:"RFC9043"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://trac.ffmpeg.org/wiki/Encode/FFV1",children:"FFmpeg Docs"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://forum.shotcut.org/t/exporting-as-ffv1-change-form-to-support-lossless-parameters/41230/19?page=2",children:"This Thread"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://video.stackexchange.com/questions/24874/what-does-the-context-parameter-mean-when-using-ffv1-in-ffmpeg",children:"This Question"})}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>c});var t=n(6540);const o={},s=t.createContext(o);function r(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/998d107e.e90e9e41.js b/assets/js/998d107e.e90e9e41.js new file mode 100644 index 000000000..c3a5bac6e --- /dev/null +++ b/assets/js/998d107e.e90e9e41.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[274],{530:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"video/FFV1","title":"FFV1","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/FFV1.mdx","sourceDirName":"video","slug":"/video/FFV1","permalink":"/docs/video/FFV1","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/FFV1.mdx","tags":[],"version":"current","sidebarPosition":12,"frontMatter":{"title":"FFV1","sidebar_position":12},"sidebar":"tutorialSidebar","previous":{"title":"Theora","permalink":"/docs/video/Theora"},"next":{"title":"UT Video","permalink":"/docs/video/utvideo"}}');var s=n(4848),o=n(8453);const r={title:"FFV1",sidebar_position:12},c="FFV1",d={},a=[{value:"History",id:"history",level:2},{value:"Usage",id:"usage",level:2},{value:"Options",id:"options",level:3},{value:"Intra-frame only catch",id:"intra-frame-only-catch",level:2}];function l(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"ffv1",children:"FFV1"})}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(i.p,{children:["FFV1 (",(0,s.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/html/rfc9043",children:"rfc9043"}),") is a lossless intra-frame video codec designed for archival use and preservation. Created by Michael Niedermayer, it is part of the ",(0,s.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," project. The codec supports a wide range of color spaces, works with YUV and RGB content including alpha channel of color depths ranging from 8 to 16 bits (only up to 14 in case of RGB). It has good parallelization support and achieves very high compression ratios compared to other lossless video encoders such as ",(0,s.jsx)(i.a,{href:"/docs/video/utvideo",children:"UT Video"}),", albeit at the cost of being more resource-hungry."]}),"\n",(0,s.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,s.jsx)(i.p,{children:"In 2003, the codec was merged into FFmpeg; however, the bitstream specification was frozen in 2006 (officially FFV1 version 0). Later, in 2009, version 1 came out, covering more video bit depths. Version 2 never got its release, existing only in experimental form."}),"\n",(0,s.jsx)(i.p,{children:"The third bitstream version was frozen in 2013 and is still the latest as of 2024. It added multithreading support and frame integrity checking."}),"\n",(0,s.jsxs)(i.p,{children:["There is a fourth version ",(0,s.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/draft-ietf-cellar-ffv1-v4/",children:"coming"})," which might bring better support for color spaces, compression improvements, and maybe proper inter-frame prediction."]}),"\n",(0,s.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",metastring:'title="Fast, heavily multithreaded"',children:"ffmpeg -i input.mkv -c:v ffv1 -slices 16 out.mkv\n"})}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",metastring:'title="Slow, highest compression"',children:"ffmpeg -i input.mkv -c:v ffv1 -g 60 -slices 4 -context 1 -coder 2 out.mkv\n"})}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",metastring:'title="Recommended for archival purposes, high compression, multithreaded"',children:"ffmpeg -i input.mkv -c:v ffv1 -g 1 -slices 16 -slicecrc 1 -context 1 -coder 2 out.mkv\n"})}),"\n",(0,s.jsx)(i.h3,{id:"options",children:"Options"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"slices"})," - Slices divide the frame into multiple parts that can be encoded and decoded in parallel. Can only be one of: [",(0,s.jsx)(i.code,{children:"4"}),", ",(0,s.jsx)(i.code,{children:"6"}),", ",(0,s.jsx)(i.code,{children:"9"}),", ",(0,s.jsx)(i.code,{children:"12"}),", ",(0,s.jsx)(i.code,{children:"16"}),", ",(0,s.jsx)(i.code,{children:"24"}),", ",(0,s.jsx)(i.code,{children:"30"}),"], where ",(0,s.jsx)(i.code,{children:"4"})," is the default."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"slicecrc"})," - Setting it to ",(0,s.jsx)(i.code,{children:"1"})," will enable the decoder to detect errors in the bitstream. Must be enabled for archival use. Can be either ",(0,s.jsx)(i.code,{children:"0"})," or ",(0,s.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"context"})," - Setting it to ",(0,s.jsx)(i.code,{children:"1"})," will make the encoder use a larger context size, which usually leads to better compression. Can be either ",(0,s.jsx)(i.code,{children:"0"})," or ",(0,s.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"coder"})," - Sets entropy coding method:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"0"})," - Golomb-Rice (faster, default)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"1"})," - Range Coder (used for higher bit depths and better compression)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"2"})," - Range Coder with custom state transition table (almost the same as ",(0,s.jsx)(i.code,{children:"1"}),")"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"g"})," - Sets GOP size. Must be ",(0,s.jsx)(i.code,{children:"1"})," for archival use. ",(0,s.jsx)(i.a,{href:"#intra-frame-only-catch",children:"See below"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"intra-frame-only-catch",children:"Intra-frame only catch"}),"\n",(0,s.jsxs)(i.p,{children:["Intra-frame codecs do not use well known inter-frame video coding techniques such as motion compensation, reusing parts of surrounding frames or adapting encoding context based on them. Every frame is independent from one another. Common intra-frame codecs include Motion JPEG (Lossy), Motion JPEG 2000 (Both), and ",(0,s.jsx)(i.a,{href:"/docs/video/utvideo",children:"UT Video"})," (Lossless)."]}),"\n",(0,s.jsxs)(i.p,{children:["If you're a careful reader, you might have noticed that setting ",(0,s.jsx)(i.code,{children:"GOP size"})," isn't a common characteristic among intra-frame codecs."]}),"\n",(0,s.jsxs)(i.p,{children:["In fact, FFV1 can be considered an intra-frame codec only if the ",(0,s.jsx)(i.code,{children:"GOP size"})," is set to ",(0,s.jsx)(i.code,{children:"1"}),". When it's larger than that, its context model depends on other frames found within the GOP, which contradicts the definition of intra-frame video codec. That is why it's highly advised to set ",(0,s.jsx)(i.code,{children:"GOP size"})," to ",(0,s.jsx)(i.code,{children:"1"})," for archiving. This way, if a single frame gets damaged, you'll\nonly lose that frame. If ",(0,s.jsx)(i.code,{children:"GOP size"})," was large, you might lose much bigger part of the video."]}),"\n",(0,s.jsx)(i.p,{children:"References:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/FFV1",children:"Wikipedia"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/html/rfc9043",children:"RFC9043"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://trac.ffmpeg.org/wiki/Encode/FFV1",children:"FFmpeg Docs"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://forum.shotcut.org/t/exporting-as-ffv1-change-form-to-support-lossless-parameters/41230/19?page=2",children:"This Thread"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://video.stackexchange.com/questions/24874/what-does-the-context-parameter-mean-when-using-ffv1-in-ffmpeg",children:"This Question"})}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>c});var t=n(6540);const s={},o=t.createContext(s);function r(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99c26446.557aea50.js b/assets/js/99c26446.557aea50.js new file mode 100644 index 000000000..ed7190ba7 --- /dev/null +++ b/assets/js/99c26446.557aea50.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8026],{1151:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"metrics/butteraugli","title":"Butteraugli","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/metrics/butteraugli.mdx","sourceDirName":"metrics","slug":"/metrics/butteraugli","permalink":"/docs/metrics/butteraugli","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/butteraugli.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Butteraugli","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"XPSNR","permalink":"/docs/metrics/XPSNR"},"next":{"title":"\u25b6\ufe0f Video Players","permalink":"/docs/video-players"}}');var o=i(4848),r=i(8453);const s={title:"Butteraugli",sidebar_position:1},a="Butteraugli",c={},u=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"butteraugli",children:"Butteraugli"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99c26446.f67ebc66.js b/assets/js/99c26446.f67ebc66.js deleted file mode 100644 index a78d8d780..000000000 --- a/assets/js/99c26446.f67ebc66.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8026],{1455:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var n=i(4848),o=i(8453);const r={title:"Butteraugli",sidebar_position:1},s="Butteraugli",c={id:"metrics/butteraugli",title:"Butteraugli",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/butteraugli.mdx",sourceDirName:"metrics",slug:"/metrics/butteraugli",permalink:"/docs/metrics/butteraugli",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/butteraugli.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Butteraugli",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"XPSNR",permalink:"/docs/metrics/XPSNR"},next:{title:"\u25b6\ufe0f Video Players",permalink:"/docs/video-players"}},u={},a=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"butteraugli",children:"Butteraugli"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>c});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9ba56b79.c96a2fc2.js b/assets/js/9ba56b79.c96a2fc2.js new file mode 100644 index 000000000..09a1f4b16 --- /dev/null +++ b/assets/js/9ba56b79.c96a2fc2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1288],{2748:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"encoders_hw/amf","title":"AMF","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","source":"@site/docs/encoders_hw/amf.mdx","sourceDirName":"encoders_hw","slug":"/encoders_hw/amf","permalink":"/docs/encoders_hw/amf","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/amf.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"AMF","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"QSV","permalink":"/docs/encoders_hw/qsv"},"next":{"title":"VideoToolbox","permalink":"/docs/encoders_hw/videotoolbox"}}');var t=n(4848),r=n(8453);const s={title:"AMF",sidebar_position:3},a="AMF",c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"amf",children:"AMF"})}),"\n",(0,t.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,t.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,t.jsx)(i.p,{children:"AMF for AMD GPUs allows applications to take advantage of the dedicated video encoding & decoding hardware present in AMD GPUs."}),"\n",(0,t.jsxs)(i.p,{children:["The AMD Advanced Media Framework (AMF) is a low-level API developed by AMD that enables developers to leverage hardware-accelerated video encoding & decoding on AMD GPUs. By utilizing specialized hardware on the GPU's media block, video encoding and decoding tasks can be offloaded from the CPU, resulting in drastic speed & efficiency increases. AMF provides multimedia processing functionality to applications, and competes with Nvidia's ",(0,t.jsx)(i.a,{href:"/docs/encoders_hw/nvenc",children:"NVENC"})," & Intel's ",(0,t.jsx)(i.a,{href:"/docs/encoders_hw/qsv",children:"QSV"})," for similar functionality."]}),"\n",(0,t.jsxs)(i.p,{children:["AMF provides support for various video codecs, including ",(0,t.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"})," , ",(0,t.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,t.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),", and more recently ",(0,t.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," on the latest supported GPUs. The GPU's encoding capabilities are especially useful for compressing video content in real-time, where speed is of greater importance than coding efficiency."]}),"\n",(0,t.jsx)(i.p,{children:"Hardware-accelerated video encoding using AMF usually significantly improves encoding performance at low compression efficiency compared to software-based encoding solutions. It usually allows for higher-quality output at lower bitrates when encoding much faster than real time, such as at 60-200 fps. This is particularly beneficial for applications that require real-time encoding, such as live streaming, video conferencing, and game recording."}),"\n",(0,t.jsx)(i.p,{children:"However, slower software encoding solutions almost always offer improvements in fidelity per bit compared to hardware encoding. For offline re-encoding & storage, software encoding is generally preferred. AMF in particular is not known for having strong compression efficiency, as it is hampered by AMD's comparably weak media blocks which are usually outperformed by other hardware implementations from Nvidia, Intel, & Apple."}),"\n",(0,t.jsxs)(i.p,{children:["AMF is designed to integrate seamlessly with popular media frameworks and libraries, such as ",(0,t.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," and GStreamer. These frameworks often include AMF support, allowing developers to easily incorporate hardware-accelerated encoding into their applications without the need for low-level API programming."]}),"\n",(0,t.jsx)(i.p,{children:"AMF is compatible with a wide range of AMD GPUs, including both discrete and integrated graphics solutions. It supports various operating systems, including Windows and Linux, making it accessible to developers across different platforms."})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>s,x:()=>a});var o=n(6540);const t={},r=o.createContext(t);function s(e){const i=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9ba56b79.fa7dee29.js b/assets/js/9ba56b79.fa7dee29.js deleted file mode 100644 index 84af7f749..000000000 --- a/assets/js/9ba56b79.fa7dee29.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1288],{5495:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var o=n(4848),t=n(8453);const r={title:"AMF",sidebar_position:3},s="AMF",a={id:"encoders_hw/amf",title:"AMF",description:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.",source:"@site/docs/encoders_hw/amf.mdx",sourceDirName:"encoders_hw",slug:"/encoders_hw/amf",permalink:"/docs/encoders_hw/amf",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders_hw/amf.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"AMF",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"QSV",permalink:"/docs/encoders_hw/qsv"},next:{title:"VideoToolbox",permalink:"/docs/encoders_hw/videotoolbox"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"amf",children:"AMF"})}),"\n",(0,o.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,o.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,o.jsx)(i.p,{children:"AMF for AMD GPUs allows applications to take advantage of the dedicated video encoding & decoding hardware present in AMD GPUs."}),"\n",(0,o.jsxs)(i.p,{children:["The AMD Advanced Media Framework (AMF) is a low-level API developed by AMD that enables developers to leverage hardware-accelerated video encoding & decoding on AMD GPUs. By utilizing specialized hardware on the GPU's media block, video encoding and decoding tasks can be offloaded from the CPU, resulting in drastic speed & efficiency increases. AMF provides multimedia processing functionality to applications, and competes with Nvidia's ",(0,o.jsx)(i.a,{href:"/docs/encoders_hw/nvenc",children:"NVENC"})," & Intel's ",(0,o.jsx)(i.a,{href:"/docs/encoders_hw/qsv",children:"QSV"})," for similar functionality."]}),"\n",(0,o.jsxs)(i.p,{children:["AMF provides support for various video codecs, including ",(0,o.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"})," , ",(0,o.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,o.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),", and more recently ",(0,o.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," on the latest supported GPUs. The GPU's encoding capabilities are especially useful for compressing video content in real-time, where speed is of greater importance than coding efficiency."]}),"\n",(0,o.jsx)(i.p,{children:"Hardware-accelerated video encoding using AMF usually significantly improves encoding performance at low compression efficiency compared to software-based encoding solutions. It usually allows for higher-quality output at lower bitrates when encoding much faster than real time, such as at 60-200 fps. This is particularly beneficial for applications that require real-time encoding, such as live streaming, video conferencing, and game recording."}),"\n",(0,o.jsx)(i.p,{children:"However, slower software encoding solutions almost always offer improvements in fidelity per bit compared to hardware encoding. For offline re-encoding & storage, software encoding is generally preferred. AMF in particular is not known for having strong compression efficiency, as it is hampered by AMD's comparably weak media blocks which are usually outperformed by other hardware implementations from Nvidia, Intel, & Apple."}),"\n",(0,o.jsxs)(i.p,{children:["AMF is designed to integrate seamlessly with popular media frameworks and libraries, such as ",(0,o.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," and GStreamer. These frameworks often include AMF support, allowing developers to easily incorporate hardware-accelerated encoding into their applications without the need for low-level API programming."]}),"\n",(0,o.jsx)(i.p,{children:"AMF is compatible with a wide range of AMD GPUs, including both discrete and integrated graphics solutions. It supports various operating systems, including Windows and Linux, making it accessible to developers across different platforms."})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>s,x:()=>a});var o=n(6540);const t={},r=o.createContext(t);function s(e){const i=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9c171e5c.2ae1657d.js b/assets/js/9c171e5c.2ae1657d.js new file mode 100644 index 000000000..10c15e34b --- /dev/null +++ b/assets/js/9c171e5c.2ae1657d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8773],{4060:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"metrics/SSIM","title":"SSIM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/metrics/SSIM.mdx","sourceDirName":"metrics","slug":"/metrics/SSIM","permalink":"/docs/metrics/SSIM","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIM.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"SSIM","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"PSNR","permalink":"/docs/metrics/PSNR"},"next":{"title":"SSIMULACRA2","permalink":"/docs/metrics/SSIMULACRA2"}}');var o=i(4848),s=i(8453);const r={title:"SSIM",sidebar_position:1},c="SSIM",a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"ssim",children:"SSIM"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>c});var n=i(6540);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9c171e5c.30eddb11.js b/assets/js/9c171e5c.30eddb11.js deleted file mode 100644 index ce2dc4950..000000000 --- a/assets/js/9c171e5c.30eddb11.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8773],{3061:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var n=i(4848),o=i(8453);const r={title:"SSIM",sidebar_position:1},s="SSIM",c={id:"metrics/SSIM",title:"SSIM",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/SSIM.mdx",sourceDirName:"metrics",slug:"/metrics/SSIM",permalink:"/docs/metrics/SSIM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIM.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"SSIM",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"PSNR",permalink:"/docs/metrics/PSNR"},next:{title:"SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"ssim",children:"SSIM"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>c});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9cae5962.1ac861f4.js b/assets/js/9cae5962.1ac861f4.js deleted file mode 100644 index 833293ddc..000000000 --- a/assets/js/9cae5962.1ac861f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[71],{5650:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>h});var n=s(4848),t=s(8453),r=s(1470),o=s(9365);const a={title:"JPEG XL",sidebar_position:7},l="JPEG XL",d={id:"images/JXL",title:"JPEG XL",description:"JPEG XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional JPEG format, while still maintaining image quality. JPEG XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG.",source:"@site/docs/images/JXL.mdx",sourceDirName:"images",slug:"/images/JXL",permalink:"/docs/images/JXL",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JXL.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"JPEG XL",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AVIF",permalink:"/docs/images/AVIF"},next:{title:"QOI",permalink:"/docs/images/QOI"}},c={},h=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Lossless Compression",id:"lossless-compression",level:3},{value:"Lossy Compression",id:"lossy-compression",level:3},{value:"Supported Bit Depth(s)",id:"supported-bit-depths",level:3},{value:"Progressive Decode",id:"progressive-decode",level:3},{value:"Lossless JPEG Re-compression",id:"lossless-jpeg-re-compression",level:3},{value:"Industry Support",id:"industry-support",level:3},{value:"Other Features",id:"other-features",level:3},{value:"Encoders",id:"encoders",level:2},{value:"libjxl",id:"libjxl",level:3},{value:"libjxl-tiny",id:"libjxl-tiny",level:3},{value:"Hydrium",id:"hydrium",level:3},{value:"zune-jpegxl",id:"zune-jpegxl",level:3},{value:"Decoders",id:"decoders",level:2},{value:"jxl-oxide",id:"jxl-oxide",level:3}];function u(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"jpeg-xl",children:"JPEG XL"})}),"\n",(0,n.jsxs)(i.p,{children:["JPEG XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"})," format, while still maintaining image quality. JPEG XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG."]}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"Up to 32 BPC"})]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsxs)(i.p,{children:["JPEG XL has a number of standout features that make it an appealing image codec to work with for many use cases. From the ",(0,n.jsx)(i.a,{href:"https://jpegxl.info",children:"JPEG XL Info page"}),", JXL has the following features:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Best lossless image compression"}),": It offers about 35% smaller file sizes than PNG (50% smaller for HDR)."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"High-fidelity lossy image compression"}),": JPEG XL provides about 60% smaller file sizes than JPEG for the same visual quality."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Progressive decoding"}),": This allows an image to be displayed in lower quality before the entire file has been downloaded, improving user experience on slow connections."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Lossless JPEG transcoding"}),": JPEG images can be converted to JPEG XL without any mathematical loss, and the resulting file is about 20% smaller."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Designed for both photographic and synthetic images"}),": JPEG XL works well with a wide range of image types, including photos, graphics, and illustrations."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Fast software encoding and decoding"}),": The codec is designed to be efficient and fast, enabling quick image loading and saving."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Full support for wide gamut and HDR"}),": JPEG XL supports a wide range of colors and high dynamic range, making it suitable for modern displays."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Perceptually optimizing reference encoder"}),": The encoder is designed to optimize image quality based on how humans perceive images."]}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:"lossless-compression",children:"Lossless Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL offers excellent lossless compression capabilities. While lossless WebP was an improvement over PNG for 8-bit lossless image encoding, JPEG XL manages not only to outdo lossless WebP in encoding efficiency but also be more versatile for bit depths greater than 8-bit (a category PNG previously dominated). 16-bit lossless imagery, especially HDR images that are becoming more popular & rarely utilize 8-bit color depth, are where JPEG XL shines, and it is the only codec to compete with PNG in that regard while providing better coding efficiency."}),"\n",(0,n.jsxs)(i.p,{children:["Example: JPEG XL compresses ",(0,n.jsx)(i.a,{href:"https://imgsaver.com/images/2023/10/03/16bit.png",children:"this 16-bit AdobeRGB PNG"})," better than PNG. Using: ",(0,n.jsx)(i.code,{children:"cjxl 16bit.png 16bit.jxl -d 0.0 -e 9 -I 100 -g 3 -E 11"})]}),"\n",(0,n.jsxs)(i.p,{children:["16-bit PNG: ",(0,n.jsx)(i.code,{children:"1533373"})," bytes.\n16-bit JXL: ",(0,n.jsx)(i.code,{children:"1211029"})," bytes."]}),"\n",(0,n.jsx)(i.h3,{id:"lossy-compression",children:"Lossy Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL is also adept at lossy compression, especially at quality levels that we as humans care about. It promises to be around 60% better than JPEG. While video-based codecs like AVIF can be competitive when given lots of CPU time, JPEG XL is both fast and efficient for medium to high fidelity photographic imaging."}),"\n",(0,n.jsx)(i.h3,{id:"supported-bit-depths",children:"Supported Bit Depth(s)"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL supports up to 32 bits per channel of bit depth, making it future proof for the increasingly popular HDR photos coming out of smartphones. There is essentially zero downside to encoding high bit depth with JXL relative to the resulting encode's size. Considering many smartphones take HDR photos now, JXL offers a compelling pipeline for these photos to make their way to the Web in the future especially as companies like Adobe & Apple have already embraced the new codec."}),"\n",(0,n.jsx)(i.h3,{id:"progressive-decode",children:"Progressive Decode"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL provides actual progressive decode support that you can experiment with here on a supported browser like Safari, Waterfox, Thorium, Mercury, or any browser on iOS."}),"\n",(0,n.jsx)(i.p,{children:"Progressive decode is a feature only JPEG is able to offer a real implementation of, rendering low frequency transform coefficients before the rest of the image arrives to allow an image to display before the entire thing has been sent over the network. Blurhashes do not replace this technology, but rather compliment it, allowing another layer of progressive decode that can be used even before the image begins to load progressively. This is an important feature to improve the user experience on websites featuring large images, or on any website if your Internet connection isn't strong."}),"\n",(0,n.jsx)(i.h3,{id:"lossless-jpeg-re-compression",children:"Lossless JPEG Re-compression"}),"\n",(0,n.jsx)(i.p,{children:"An incredibly unique JPEG XL feature is lossless JPEG re-compression, or the ability to take a JPEG input and provide an output with a smaller filesize (on average, 20% smaller) that is pixel-for-pixel identical. This is why companies like Meta have endorsed JPEG XL, as it offers a path forward for the existing JPEGs on the Internet."}),"\n",(0,n.jsx)(i.h3,{id:"industry-support",children:"Industry Support"}),"\n",(0,n.jsx)(i.p,{children:"From the JPEG XL Wikipedia page:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Besides Cloudinary and Google originally, throughout JPEG XL's preliminary implementation in web browsers, various representatives of well-known industry brand names have publicly voiced support for JPEG XL as their preferred choice, including Facebook, Adobe, Intel and the Video Electronics Standards Association, The Guardian, Flickr and SmugMug, Shopify, the Krita Foundation, and Serif Ltd."}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Apple also features ecosystem-wide JPEG XL support as of iOS 17 & macOS Sonoma."}),"\n",(0,n.jsx)(i.h3,{id:"other-features",children:"Other Features"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL has the potential to replace popular formats like TIFF for authoring workflows due to its broad feature set. From the JXL Wikipedia, some additional features include:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Image dimensions of over a billion (2^30-1) pixels on each side."}),"\n",(0,n.jsx)(i.li,{children:"Up to 4099 channels, including support for alpha transparency"}),"\n",(0,n.jsx)(i.li,{children:"There can be multiple frames with zero duration, allowing support for layers in graphics software"}),"\n",(0,n.jsx)(i.li,{children:"Animation support, allowing JXL to rival GIF"}),"\n",(0,n.jsx)(i.li,{children:"Images can be stored in tiles to reduce the time needed to decode them."}),"\n",(0,n.jsx)(i.li,{children:"Graceful quality degradation across a large range of bitrates means quality loss isn't as abrupt as with older formats."}),"\n",(0,n.jsx)(i.li,{children:"Perceptually optimized reference encoder which uses a perceptual color space, adaptive quantization, and conservative default settings."}),"\n",(0,n.jsx)(i.li,{children:"Support for wide color gamut and HDR"}),"\n",(0,n.jsx)(i.li,{children:"Efficient encoding and decoding without requiring specialized hardware: JPEG XL is about as fast to encode and decode as old JPEG using libjpeg-turbo and an order of magnitude faster to encode and decode compared to HEIC with x265. It is also parallelizable."}),"\n",(0,n.jsx)(i.li,{children:"Royalty-free format with an open-source reference implementation available on GitHub."}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"encoders",children:"Encoders"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL has a couple of noteworthy encoders currently available to work with. Because JPEG XL is so new, most encoders aren't yet intelligent enough to take advantage of the whole format yet. Here's a quote from Jon Sneyers in the JPEG XL discord that sums it up nicely:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Encode side: 80% or so of the coding tools are used in one way or another by the encoder (the 20% is splines and super large VarDCT blocks, and also the things that are not used by default without using special experimental options, such as delta palette and noise). But the coding tools that are used, are typically used in a specific, limited way that doesn't come anywhere close to exhausting the bitstream expressivity."}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Sneyers is talking about libjxl's ",(0,n.jsx)(i.code,{children:"cjxl"})," encoder, which will be discussed further below."]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl",children:"libjxl"}),"\n",(0,n.jsxs)(i.p,{children:["The reference ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl",children:"libjxl"})," implementation has the capability to both decode and encode JPEG XL image files. Both are discussed below."]}),"\n",(0,n.jsxs)(r.A,{children:[(0,n.jsxs)(o.A,{value:"enc",label:"Encoding",default:!0,children:[(0,n.jsxs)(i.p,{children:["libjxl's encoder ",(0,n.jsx)(i.code,{children:"cjxl"})," has more options to play around with. It takes a few primary arguments, distance (",(0,n.jsx)(i.code,{children:"-d"}),"), quality (",(0,n.jsx)(i.code,{children:"-q"}),"), and effort (",(0,n.jsx)(i.code,{children:"-e"}),")."]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Distance and quality"})}),(0,n.jsxs)(i.p,{children:["Distance and quality are two ways of specifying ",(0,n.jsx)(i.em,{children:"how much loss"})," you are willing to tolerate, and as such, they are mutually exclusive, as they pull the same levers under the hood."]}),(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Distance is designed to map to how 'close' one must be to the source to notice any loss. It is represented as a scale between 0.0 & 25.0. 0.0 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", every pixel will have the exact same value as the source. 1.0 is designed to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", look the same at a normal viewing distance, and higher values have more loss."]}),"\n",(0,n.jsxs)(i.li,{children:["Quality is designed to roughly map to ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),"'s quality argument. A range 0-100, where 100 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", 90 is intended to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", and 0 is almost unrecognizable as the original image."]}),"\n"]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Effort"})}),(0,n.jsxs)(i.p,{children:["Effort is similar to ",(0,n.jsx)(i.code,{children:"cpu-used"})," in video encoding. It specifies the amount of effort the encoder will make in order to get the smallest file size it can. It takes the form of a range 1-9, where higher numbers will spend more resources to get diminishing returns in terms of smaller size, while lower values do the opposite, leaving file size on the table for faster encoding."]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="Encoding with effort 9 and distance 1.0"',children:"cjxl -e 9 -d 1.0 example.png example.jxl\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="This, by default uses lossless JPEG compression."',children:"cjxl example.jpg example.jxl\n"})})]}),(0,n.jsxs)(o.A,{value:"dec",label:"Decoding",children:[(0,n.jsxs)(i.p,{children:["Decoding a ",(0,n.jsx)(i.code,{children:".jxl"})," image is straightforward with libjxl's decoder, ",(0,n.jsx)(i.code,{children:"djxl"}),":"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl example.jxl example.png\n"})}),(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"djxl"})," can decode to pixels via pipes, png, apng for animated jxl, jpg, ppm, and pfm."]}),(0,n.jsxs)(i.p,{children:["By default, if the ",(0,n.jsx)(i.code,{children:".jxl"})," file was encoded with lossless jpeg recompression, ",(0,n.jsx)(i.code,{children:"djxl"})," will rebuild the exact jpeg file that was originally compressed. To avoid this, and create a new jpeg file:"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl -j example.jxl example.jpg\n"})}),(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.strong,{children:["Keep in mind this is now a lossy process as ",(0,n.jsx)(i.code,{children:"djxl"})," will decode to pixels, then encode a new ",(0,n.jsx)(i.code,{children:".jpg"})," with those pixels."]})})]}),(0,n.jsxs)(o.A,{value:"build",label:"Building",children:[(0,n.jsxs)(i.p,{children:["A full build guide is provided in the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl/blob/main/BUILDING.md",children:"libjxl build instructions"})," in the GitHub repo. This guide is simplified, and is only focused on building a working efficient encoder & decoder."]}),(0,n.jsx)(i.p,{children:"These instructions should work for macOS and Linux, although macOS support isn't guaranteed."}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="1. Clone the repo"',children:"git clone https://github.com/libjxl/libjxl.git --recursive --shallow-submodules\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="2. Install dependencies. May have to run these commands with root"',children:"apt install cmake pkg-config libbrotli-dev clang # Debian Linux\npacman -Syu cmake pkgconf brotli clang # Arch Linux\nbrew install cmake pkg-config brotli # macOS\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="3. Set CC & CXX variables before building (Recommended)"',children:"export CC=clang CXX=clang++\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="4. cjxl & djxl will be available in the build/tools directory."',children:'cd libjxl && mkdir build && cd build\ncmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O3 -march=native" -DCMAKE_C_FLAGS="-O3 -march=native" -DBUILD_TESTING=OFF -DJPEGXL_WARNINGS_AS_ERRORS=OFF -DJPEGXL_ENABLE_SJPEG=OFF ..\ncmake --build . -- -j$(nproc)\n'})}),(0,n.jsxs)(i.p,{children:["This will build ",(0,n.jsx)(i.code,{children:"cjxl"})," and ",(0,n.jsx)(i.code,{children:"djxl"})," with O3 optimization for your CPU architecture on Linux or macOS. Again, be aware that macOS support is not a priority. Via the libjxl OS X build guide:"]}),(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:'OSX builds have "best effort" support, i.e. build might not work at all, some tests may fail and some sub-projects are excluded from build.'}),"\n"]})]})]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl-tiny",children:"libjxl-tiny"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny",children:"libjxl-tiny"})," contains a simpler encoder implementation of JPEG XL, aimed at photographic images without an alpha channel. The goal is to guide hardware implementations of the encoder where support for the full set of encoding tools is not feasible. The color management is outside the scope of this library, the encoder input is given as a portable float map (PFM) in the linear sRGB colorspace, where individual sample values can be outside the [0.0, 1.0] range for out-of-gammut colors. For more details, see the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny/blob/main/doc/coding_tools.md",children:"overview of the coding tools"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"The last commit was ten months ago, so it is uncertain whether libjxl-tiny could be considered active."}),"\n",(0,n.jsx)(i.h3,{id:"hydrium",children:"Hydrium"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/Traneptora/hydrium",children:"Hydrium"})," is a fast, ultra-low-memory, streaming JPEG XL encoder written in portable C. It is maintained by Traneptora."]}),"\n",(0,n.jsx)(i.h3,{id:"zune-jpegxl",children:"zune-jpegxl"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/etemesi254/zune-image/tree/dev/crates/zune-jpegxl",children:"zune-jpegxl"})," is a simple, fast and fully safe modular JXL encoder written in Rust. It is maintained by etemesi254."]}),"\n",(0,n.jsx)(i.p,{children:"zune-jpegxl has the following features:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Lossless encoding"}),"\n",(0,n.jsx)(i.li,{children:"8 bit and 16 bit support"}),"\n",(0,n.jsx)(i.li,{children:"Grayscale and RGBA encoding"}),"\n",(0,n.jsx)(i.li,{children:"Threading capabilities"}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"decoders",children:"Decoders"}),"\n",(0,n.jsx)(i.h3,{id:"jxl-oxide",children:"jxl-oxide"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/tirr-c/jxl-oxide",children:"jxl-oxide"})," is a spec-conforming JPEG XL decoder written in pure Rust. It is maintained by Wonwoo Choi."]}),"\n","\n",(0,n.jsx)(i.p,{children:"Sources:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/JPEG_XL",children:"JXL Wikipedia"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://jpegxl.info/why-jxl.html",children:"JPEGXL.info: Why JXL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://webkit.org/blog/14205/news-from-wwdc23-webkit-features-in-safari-17-beta/#images",children:"Apple JXL Announcement"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/jpeg-xl-how-it-started-how-its-going",children:"JPEG XL: How It Started, How It's Going"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/the-case-for-jpeg-xl",children:"The Case for JPEG XL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/time_for_next_gen_codecs_to_dethrone_jpeg",children:"Time for Next-Gen Codecs to Dethrone JPEG"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://giannirosato.com/blog/post/image-comparison/",children:"Image Codec Comparison"})}),"\n"]})]})}function p(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},9365:(e,i,s)=>{s.d(i,{A:()=>o});s(6540);var n=s(4164);const t={tabItem:"tabItem_Ymn6"};var r=s(4848);function o(e){let{children:i,hidden:s,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(t.tabItem,o),hidden:s,children:i})}},1470:(e,i,s)=>{s.d(i,{A:()=>w});var n=s(6540),t=s(4164),r=s(3104),o=s(6347),a=s(205),l=s(7485),d=s(1682),c=s(679);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:i}=e;return!!i&&"object"==typeof i&&"value"in i}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:i,children:s}=e;return(0,n.useMemo)((()=>{const e=i??function(e){return h(e).map((e=>{let{props:{value:i,label:s,attributes:n,default:t}}=e;return{value:i,label:s,attributes:n,default:t}}))}(s);return function(e){const i=(0,d.XI)(e,((e,i)=>e.value===i.value));if(i.length>0)throw new Error(`Docusaurus error: Duplicate values "${i.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[i,s])}function p(e){let{value:i,tabValues:s}=e;return s.some((e=>e.value===i))}function m(e){let{queryString:i=!1,groupId:s}=e;const t=(0,o.W6)(),r=function(e){let{queryString:i=!1,groupId:s}=e;if("string"==typeof i)return i;if(!1===i)return null;if(!0===i&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:i,groupId:s});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const i=new URLSearchParams(t.location.search);i.set(r,e),t.replace({...t.location,search:i.toString()})}),[r,t])]}function g(e){const{defaultValue:i,queryString:s=!1,groupId:t}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:i,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(i){if(!p({value:i,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${i}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return i}const n=s.find((e=>e.default))??s[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:i,tabValues:r}))),[d,h]=m({queryString:s,groupId:t}),[g,x]=function(e){let{groupId:i}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(i),[t,r]=(0,c.Dv)(s);return[t,(0,n.useCallback)((e=>{s&&r.set(e)}),[s,r])]}({groupId:t}),f=(()=>{const e=d??g;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{f&&l(f)}),[f]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),x(e)}),[h,x,r]),tabValues:r}}var x=s(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=s(4848);function j(e){let{className:i,block:s,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,r.a_)(),c=e=>{const i=e.currentTarget,s=l.indexOf(i),t=a[s].value;t!==n&&(d(i),o(t))},h=e=>{let i=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;i=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;i=l[s]??l[l.length-1];break}}i?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":s},i),children:a.map((e=>{let{value:i,label:s,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:n===i?0:-1,"aria-selected":n===i,ref:e=>l.push(e),onKeyDown:h,onClick:c,...r,className:(0,t.A)("tabs__item",f.tabItem,r?.className,{"tabs__item--active":n===i}),children:s??i},i)}))})}function y(e){let{lazy:i,children:s,selectedValue:r}=e;const o=(Array.isArray(s)?s:[s]).filter(Boolean);if(i){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,i)=>(0,n.cloneElement)(e,{key:i,hidden:e.props.value!==r})))})}function v(e){const i=g(e);return(0,b.jsxs)("div",{className:(0,t.A)("tabs-container",f.tabList),children:[(0,b.jsx)(j,{...i,...e}),(0,b.jsx)(y,{...i,...e})]})}function w(e){const i=(0,x.A)();return(0,b.jsx)(v,{...e,children:h(e.children)},String(i))}},8453:(e,i,s)=>{s.d(i,{R:()=>o,x:()=>a});var n=s(6540);const t={},r=n.createContext(t);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9cae5962.7f6f0663.js b/assets/js/9cae5962.7f6f0663.js new file mode 100644 index 000000000..a5e6d4860 --- /dev/null +++ b/assets/js/9cae5962.7f6f0663.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[71],{5084:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>l,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"images/JXL","title":"JPEG XL","description":"JPEG XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional JPEG format, while still maintaining image quality. JPEG XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG.","source":"@site/docs/images/JXL.mdx","sourceDirName":"images","slug":"/images/JXL","permalink":"/docs/images/JXL","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JXL.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"JPEG XL","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"AVIF","permalink":"/docs/images/AVIF"},"next":{"title":"QOI","permalink":"/docs/images/QOI"}}');var t=s(4848),r=s(8453),o=s(1470),a=s(9365);const l={title:"JPEG XL",sidebar_position:7},d="JPEG XL",c={},h=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Lossless Compression",id:"lossless-compression",level:3},{value:"Lossy Compression",id:"lossy-compression",level:3},{value:"Supported Bit Depth(s)",id:"supported-bit-depths",level:3},{value:"Progressive Decode",id:"progressive-decode",level:3},{value:"Lossless JPEG Re-compression",id:"lossless-jpeg-re-compression",level:3},{value:"Industry Support",id:"industry-support",level:3},{value:"Other Features",id:"other-features",level:3},{value:"Encoders",id:"encoders",level:2},{value:"libjxl",id:"libjxl",level:3},{value:"libjxl-tiny",id:"libjxl-tiny",level:3},{value:"Hydrium",id:"hydrium",level:3},{value:"zune-jpegxl",id:"zune-jpegxl",level:3},{value:"Decoders",id:"decoders",level:2},{value:"jxl-oxide",id:"jxl-oxide",level:3}];function u(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"jpeg-xl",children:"JPEG XL"})}),"\n",(0,t.jsxs)(i.p,{children:["JPEG XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional ",(0,t.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"})," format, while still maintaining image quality. JPEG XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG."]}),"\n",(0,t.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,t.jsxs)(i.p,{children:["Lossless? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Lossy? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,t.jsx)(i.em,{children:"Up to 32 BPC"})]}),"\n",(0,t.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Animation? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Transparency? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Progressive Decode? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(i.p,{children:["Royalty Free? ",(0,t.jsx)(i.em,{children:"Yes"})]}),"\n",(0,t.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,t.jsxs)(i.p,{children:["JPEG XL has a number of standout features that make it an appealing image codec to work with for many use cases. From the ",(0,t.jsx)(i.a,{href:"https://jpegxl.info",children:"JPEG XL Info page"}),", JXL has the following features:"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Best lossless image compression"}),": It offers about 35% smaller file sizes than PNG (50% smaller for HDR)."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"High-fidelity lossy image compression"}),": JPEG XL provides about 60% smaller file sizes than JPEG for the same visual quality."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Progressive decoding"}),": This allows an image to be displayed in lower quality before the entire file has been downloaded, improving user experience on slow connections."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Lossless JPEG transcoding"}),": JPEG images can be converted to JPEG XL without any mathematical loss, and the resulting file is about 20% smaller."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Designed for both photographic and synthetic images"}),": JPEG XL works well with a wide range of image types, including photos, graphics, and illustrations."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Fast software encoding and decoding"}),": The codec is designed to be efficient and fast, enabling quick image loading and saving."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Full support for wide gamut and HDR"}),": JPEG XL supports a wide range of colors and high dynamic range, making it suitable for modern displays."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Perceptually optimizing reference encoder"}),": The encoder is designed to optimize image quality based on how humans perceive images."]}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"lossless-compression",children:"Lossless Compression"}),"\n",(0,t.jsx)(i.p,{children:"JPEG XL offers excellent lossless compression capabilities. While lossless WebP was an improvement over PNG for 8-bit lossless image encoding, JPEG XL manages not only to outdo lossless WebP in encoding efficiency but also be more versatile for bit depths greater than 8-bit (a category PNG previously dominated). 16-bit lossless imagery, especially HDR images that are becoming more popular & rarely utilize 8-bit color depth, are where JPEG XL shines, and it is the only codec to compete with PNG in that regard while providing better coding efficiency."}),"\n",(0,t.jsxs)(i.p,{children:["Example: JPEG XL compresses ",(0,t.jsx)(i.a,{href:"https://imgsaver.com/images/2023/10/03/16bit.png",children:"this 16-bit AdobeRGB PNG"})," better than PNG. Using: ",(0,t.jsx)(i.code,{children:"cjxl 16bit.png 16bit.jxl -d 0.0 -e 9 -I 100 -g 3 -E 11"})]}),"\n",(0,t.jsxs)(i.p,{children:["16-bit PNG: ",(0,t.jsx)(i.code,{children:"1533373"})," bytes.\n16-bit JXL: ",(0,t.jsx)(i.code,{children:"1211029"})," bytes."]}),"\n",(0,t.jsx)(i.h3,{id:"lossy-compression",children:"Lossy Compression"}),"\n",(0,t.jsx)(i.p,{children:"JPEG XL is also adept at lossy compression, especially at quality levels that we as humans care about. It promises to be around 60% better than JPEG. While video-based codecs like AVIF can be competitive when given lots of CPU time, JPEG XL is both fast and efficient for medium to high fidelity photographic imaging."}),"\n",(0,t.jsx)(i.h3,{id:"supported-bit-depths",children:"Supported Bit Depth(s)"}),"\n",(0,t.jsx)(i.p,{children:"JPEG XL supports up to 32 bits per channel of bit depth, making it future proof for the increasingly popular HDR photos coming out of smartphones. There is essentially zero downside to encoding high bit depth with JXL relative to the resulting encode's size. Considering many smartphones take HDR photos now, JXL offers a compelling pipeline for these photos to make their way to the Web in the future especially as companies like Adobe & Apple have already embraced the new codec."}),"\n",(0,t.jsx)(i.h3,{id:"progressive-decode",children:"Progressive Decode"}),"\n",(0,t.jsx)(i.p,{children:"JPEG XL provides actual progressive decode support that you can experiment with here on a supported browser like Safari, Waterfox, Thorium, Mercury, or any browser on iOS."}),"\n",(0,t.jsx)(i.p,{children:"Progressive decode is a feature only JPEG is able to offer a real implementation of, rendering low frequency transform coefficients before the rest of the image arrives to allow an image to display before the entire thing has been sent over the network. Blurhashes do not replace this technology, but rather compliment it, allowing another layer of progressive decode that can be used even before the image begins to load progressively. This is an important feature to improve the user experience on websites featuring large images, or on any website if your Internet connection isn't strong."}),"\n",(0,t.jsx)(i.h3,{id:"lossless-jpeg-re-compression",children:"Lossless JPEG Re-compression"}),"\n",(0,t.jsx)(i.p,{children:"An incredibly unique JPEG XL feature is lossless JPEG re-compression, or the ability to take a JPEG input and provide an output with a smaller filesize (on average, 20% smaller) that is pixel-for-pixel identical. This is why companies like Meta have endorsed JPEG XL, as it offers a path forward for the existing JPEGs on the Internet."}),"\n",(0,t.jsx)(i.h3,{id:"industry-support",children:"Industry Support"}),"\n",(0,t.jsx)(i.p,{children:"From the JPEG XL Wikipedia page:"}),"\n",(0,t.jsxs)(i.blockquote,{children:["\n",(0,t.jsx)(i.p,{children:"Besides Cloudinary and Google originally, throughout JPEG XL's preliminary implementation in web browsers, various representatives of well-known industry brand names have publicly voiced support for JPEG XL as their preferred choice, including Facebook, Adobe, Intel and the Video Electronics Standards Association, The Guardian, Flickr and SmugMug, Shopify, the Krita Foundation, and Serif Ltd."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"Apple also features ecosystem-wide JPEG XL support as of iOS 17 & macOS Sonoma."}),"\n",(0,t.jsx)(i.h3,{id:"other-features",children:"Other Features"}),"\n",(0,t.jsx)(i.p,{children:"JPEG XL has the potential to replace popular formats like TIFF for authoring workflows due to its broad feature set. From the JXL Wikipedia, some additional features include:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Image dimensions of over a billion (2^30-1) pixels on each side."}),"\n",(0,t.jsx)(i.li,{children:"Up to 4099 channels, including support for alpha transparency"}),"\n",(0,t.jsx)(i.li,{children:"There can be multiple frames with zero duration, allowing support for layers in graphics software"}),"\n",(0,t.jsx)(i.li,{children:"Animation support, allowing JXL to rival GIF"}),"\n",(0,t.jsx)(i.li,{children:"Images can be stored in tiles to reduce the time needed to decode them."}),"\n",(0,t.jsx)(i.li,{children:"Graceful quality degradation across a large range of bitrates means quality loss isn't as abrupt as with older formats."}),"\n",(0,t.jsx)(i.li,{children:"Perceptually optimized reference encoder which uses a perceptual color space, adaptive quantization, and conservative default settings."}),"\n",(0,t.jsx)(i.li,{children:"Support for wide color gamut and HDR"}),"\n",(0,t.jsx)(i.li,{children:"Efficient encoding and decoding without requiring specialized hardware: JPEG XL is about as fast to encode and decode as old JPEG using libjpeg-turbo and an order of magnitude faster to encode and decode compared to HEIC with x265. It is also parallelizable."}),"\n",(0,t.jsx)(i.li,{children:"Royalty-free format with an open-source reference implementation available on GitHub."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"encoders",children:"Encoders"}),"\n",(0,t.jsx)(i.p,{children:"JPEG XL has a couple of noteworthy encoders currently available to work with. Because JPEG XL is so new, most encoders aren't yet intelligent enough to take advantage of the whole format yet. Here's a quote from Jon Sneyers in the JPEG XL discord that sums it up nicely:"}),"\n",(0,t.jsxs)(i.blockquote,{children:["\n",(0,t.jsx)(i.p,{children:"Encode side: 80% or so of the coding tools are used in one way or another by the encoder (the 20% is splines and super large VarDCT blocks, and also the things that are not used by default without using special experimental options, such as delta palette and noise). But the coding tools that are used, are typically used in a specific, limited way that doesn't come anywhere close to exhausting the bitstream expressivity."}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["Sneyers is talking about libjxl's ",(0,t.jsx)(i.code,{children:"cjxl"})," encoder, which will be discussed further below."]}),"\n",(0,t.jsx)(i.h3,{id:"libjxl",children:"libjxl"}),"\n",(0,t.jsxs)(i.p,{children:["The reference ",(0,t.jsx)(i.a,{href:"https://github.com/libjxl/libjxl",children:"libjxl"})," implementation has the capability to both decode and encode JPEG XL image files. Both are discussed below."]}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsxs)(a.A,{value:"enc",label:"Encoding",default:!0,children:[(0,t.jsxs)(i.p,{children:["libjxl's encoder ",(0,t.jsx)(i.code,{children:"cjxl"})," has more options to play around with. It takes a few primary arguments, distance (",(0,t.jsx)(i.code,{children:"-d"}),"), quality (",(0,t.jsx)(i.code,{children:"-q"}),"), and effort (",(0,t.jsx)(i.code,{children:"-e"}),")."]}),(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Distance and quality"})}),(0,t.jsxs)(i.p,{children:["Distance and quality are two ways of specifying ",(0,t.jsx)(i.em,{children:"how much loss"})," you are willing to tolerate, and as such, they are mutually exclusive, as they pull the same levers under the hood."]}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Distance is designed to map to how 'close' one must be to the source to notice any loss. It is represented as a scale between 0.0 & 25.0. 0.0 is ",(0,t.jsx)(i.strong,{children:"mathematically lossless"}),", every pixel will have the exact same value as the source. 1.0 is designed to be ",(0,t.jsx)(i.strong,{children:"visually lossless"}),", look the same at a normal viewing distance, and higher values have more loss."]}),"\n",(0,t.jsxs)(i.li,{children:["Quality is designed to roughly map to ",(0,t.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),"'s quality argument. A range 0-100, where 100 is ",(0,t.jsx)(i.strong,{children:"mathematically lossless"}),", 90 is intended to be ",(0,t.jsx)(i.strong,{children:"visually lossless"}),", and 0 is almost unrecognizable as the original image."]}),"\n"]}),(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Effort"})}),(0,t.jsxs)(i.p,{children:["Effort is similar to ",(0,t.jsx)(i.code,{children:"cpu-used"})," in video encoding. It specifies the amount of effort the encoder will make in order to get the smallest file size it can. It takes the form of a range 1-9, where higher numbers will spend more resources to get diminishing returns in terms of smaller size, while lower values do the opposite, leaving file size on the table for faster encoding."]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="Encoding with effort 9 and distance 1.0"',children:"cjxl -e 9 -d 1.0 example.png example.jxl\n"})}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="This, by default uses lossless JPEG compression."',children:"cjxl example.jpg example.jxl\n"})})]}),(0,t.jsxs)(a.A,{value:"dec",label:"Decoding",children:[(0,t.jsxs)(i.p,{children:["Decoding a ",(0,t.jsx)(i.code,{children:".jxl"})," image is straightforward with libjxl's decoder, ",(0,t.jsx)(i.code,{children:"djxl"}),":"]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"djxl example.jxl example.png\n"})}),(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"djxl"})," can decode to pixels via pipes, png, apng for animated jxl, jpg, ppm, and pfm."]}),(0,t.jsxs)(i.p,{children:["By default, if the ",(0,t.jsx)(i.code,{children:".jxl"})," file was encoded with lossless jpeg recompression, ",(0,t.jsx)(i.code,{children:"djxl"})," will rebuild the exact jpeg file that was originally compressed. To avoid this, and create a new jpeg file:"]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"djxl -j example.jxl example.jpg\n"})}),(0,t.jsx)(i.p,{children:(0,t.jsxs)(i.strong,{children:["Keep in mind this is now a lossy process as ",(0,t.jsx)(i.code,{children:"djxl"})," will decode to pixels, then encode a new ",(0,t.jsx)(i.code,{children:".jpg"})," with those pixels."]})})]}),(0,t.jsxs)(a.A,{value:"build",label:"Building",children:[(0,t.jsxs)(i.p,{children:["A full build guide is provided in the ",(0,t.jsx)(i.a,{href:"https://github.com/libjxl/libjxl/blob/main/BUILDING.md",children:"libjxl build instructions"})," in the GitHub repo. This guide is simplified, and is only focused on building a working efficient encoder & decoder."]}),(0,t.jsx)(i.p,{children:"These instructions should work for macOS and Linux, although macOS support isn't guaranteed."}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="1. Clone the repo"',children:"git clone https://github.com/libjxl/libjxl.git --recursive --shallow-submodules\n"})}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="2. Install dependencies. May have to run these commands with root"',children:"apt install cmake pkg-config libbrotli-dev clang # Debian Linux\npacman -Syu cmake pkgconf brotli clang # Arch Linux\nbrew install cmake pkg-config brotli # macOS\n"})}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="3. Set CC & CXX variables before building (Recommended)"',children:"export CC=clang CXX=clang++\n"})}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="4. cjxl & djxl will be available in the build/tools directory."',children:'cd libjxl && mkdir build && cd build\ncmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O3 -march=native" -DCMAKE_C_FLAGS="-O3 -march=native" -DBUILD_TESTING=OFF -DJPEGXL_WARNINGS_AS_ERRORS=OFF -DJPEGXL_ENABLE_SJPEG=OFF ..\ncmake --build . -- -j$(nproc)\n'})}),(0,t.jsxs)(i.p,{children:["This will build ",(0,t.jsx)(i.code,{children:"cjxl"})," and ",(0,t.jsx)(i.code,{children:"djxl"})," with O3 optimization for your CPU architecture on Linux or macOS. Again, be aware that macOS support is not a priority. Via the libjxl OS X build guide:"]}),(0,t.jsxs)(i.blockquote,{children:["\n",(0,t.jsx)(i.p,{children:'OSX builds have "best effort" support, i.e. build might not work at all, some tests may fail and some sub-projects are excluded from build.'}),"\n"]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"libjxl-tiny",children:"libjxl-tiny"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny",children:"libjxl-tiny"})," contains a simpler encoder implementation of JPEG XL, aimed at photographic images without an alpha channel. The goal is to guide hardware implementations of the encoder where support for the full set of encoding tools is not feasible. The color management is outside the scope of this library, the encoder input is given as a portable float map (PFM) in the linear sRGB colorspace, where individual sample values can be outside the [0.0, 1.0] range for out-of-gammut colors. For more details, see the ",(0,t.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny/blob/main/doc/coding_tools.md",children:"overview of the coding tools"}),"."]}),"\n",(0,t.jsx)(i.p,{children:"The last commit was ten months ago, so it is uncertain whether libjxl-tiny could be considered active."}),"\n",(0,t.jsx)(i.h3,{id:"hydrium",children:"Hydrium"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://github.com/Traneptora/hydrium",children:"Hydrium"})," is a fast, ultra-low-memory, streaming JPEG XL encoder written in portable C. It is maintained by Traneptora."]}),"\n",(0,t.jsx)(i.h3,{id:"zune-jpegxl",children:"zune-jpegxl"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://github.com/etemesi254/zune-image/tree/dev/crates/zune-jpegxl",children:"zune-jpegxl"})," is a simple, fast and fully safe modular JXL encoder written in Rust. It is maintained by etemesi254."]}),"\n",(0,t.jsx)(i.p,{children:"zune-jpegxl has the following features:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Lossless encoding"}),"\n",(0,t.jsx)(i.li,{children:"8 bit and 16 bit support"}),"\n",(0,t.jsx)(i.li,{children:"Grayscale and RGBA encoding"}),"\n",(0,t.jsx)(i.li,{children:"Threading capabilities"}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"decoders",children:"Decoders"}),"\n",(0,t.jsx)(i.h3,{id:"jxl-oxide",children:"jxl-oxide"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://github.com/tirr-c/jxl-oxide",children:"jxl-oxide"})," is a spec-conforming JPEG XL decoder written in pure Rust. It is maintained by Wonwoo Choi."]}),"\n","\n",(0,t.jsx)(i.p,{children:"Sources:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/JPEG_XL",children:"JXL Wikipedia"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://jpegxl.info/why-jxl.html",children:"JPEGXL.info: Why JXL"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://webkit.org/blog/14205/news-from-wwdc23-webkit-features-in-safari-17-beta/#images",children:"Apple JXL Announcement"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://cloudinary.com/blog/jpeg-xl-how-it-started-how-its-going",children:"JPEG XL: How It Started, How It's Going"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://cloudinary.com/blog/the-case-for-jpeg-xl",children:"The Case for JPEG XL"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://cloudinary.com/blog/time_for_next_gen_codecs_to_dethrone_jpeg",children:"Time for Next-Gen Codecs to Dethrone JPEG"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://giannirosato.com/blog/post/image-comparison/",children:"Image Codec Comparison"})}),"\n"]})]})}function p(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},9365:(e,i,s)=>{s.d(i,{A:()=>o});s(6540);var n=s(4164);const t={tabItem:"tabItem_Ymn6"};var r=s(4848);function o(e){let{children:i,hidden:s,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(t.tabItem,o),hidden:s,children:i})}},1470:(e,i,s)=>{s.d(i,{A:()=>w});var n=s(6540),t=s(4164),r=s(3104),o=s(6347),a=s(205),l=s(7485),d=s(1682),c=s(679);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:i}=e;return!!i&&"object"==typeof i&&"value"in i}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:i,children:s}=e;return(0,n.useMemo)((()=>{const e=i??function(e){return h(e).map((e=>{let{props:{value:i,label:s,attributes:n,default:t}}=e;return{value:i,label:s,attributes:n,default:t}}))}(s);return function(e){const i=(0,d.XI)(e,((e,i)=>e.value===i.value));if(i.length>0)throw new Error(`Docusaurus error: Duplicate values "${i.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[i,s])}function p(e){let{value:i,tabValues:s}=e;return s.some((e=>e.value===i))}function m(e){let{queryString:i=!1,groupId:s}=e;const t=(0,o.W6)(),r=function(e){let{queryString:i=!1,groupId:s}=e;if("string"==typeof i)return i;if(!1===i)return null;if(!0===i&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:i,groupId:s});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const i=new URLSearchParams(t.location.search);i.set(r,e),t.replace({...t.location,search:i.toString()})}),[r,t])]}function g(e){const{defaultValue:i,queryString:s=!1,groupId:t}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:i,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(i){if(!p({value:i,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${i}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return i}const n=s.find((e=>e.default))??s[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:i,tabValues:r}))),[d,h]=m({queryString:s,groupId:t}),[g,x]=function(e){let{groupId:i}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(i),[t,r]=(0,c.Dv)(s);return[t,(0,n.useCallback)((e=>{s&&r.set(e)}),[s,r])]}({groupId:t}),f=(()=>{const e=d??g;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{f&&l(f)}),[f]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),x(e)}),[h,x,r]),tabValues:r}}var x=s(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=s(4848);function j(e){let{className:i,block:s,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,r.a_)(),c=e=>{const i=e.currentTarget,s=l.indexOf(i),t=a[s].value;t!==n&&(d(i),o(t))},h=e=>{let i=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;i=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;i=l[s]??l[l.length-1];break}}i?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":s},i),children:a.map((e=>{let{value:i,label:s,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:n===i?0:-1,"aria-selected":n===i,ref:e=>l.push(e),onKeyDown:h,onClick:c,...r,className:(0,t.A)("tabs__item",f.tabItem,r?.className,{"tabs__item--active":n===i}),children:s??i},i)}))})}function y(e){let{lazy:i,children:s,selectedValue:r}=e;const o=(Array.isArray(s)?s:[s]).filter(Boolean);if(i){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,i)=>(0,n.cloneElement)(e,{key:i,hidden:e.props.value!==r})))})}function v(e){const i=g(e);return(0,b.jsxs)("div",{className:(0,t.A)("tabs-container",f.tabList),children:[(0,b.jsx)(j,{...i,...e}),(0,b.jsx)(y,{...i,...e})]})}function w(e){const i=(0,x.A)();return(0,b.jsx)(v,{...e,children:h(e.children)},String(i))}},8453:(e,i,s)=>{s.d(i,{R:()=>o,x:()=>a});var n=s(6540);const t={},r=n.createContext(t);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.ba0deb5f.js b/assets/js/9e4087bc.ba0deb5f.js deleted file mode 100644 index 75fbfeee3..000000000 --- a/assets/js/9e4087bc.ba0deb5f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2711],{9331:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(6540);var a=t(8774),n=t(1312),i=t(1213),s=t(6266),c=t(263),l=t(1107),o=t(4848);function d(e){let{year:r,posts:t}=e;const n=(0,s.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata.permalink,children:[(r=e.metadata.date,n.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,n.T)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,n.T)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),s=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.be,{title:t,description:a}),(0,o.jsxs)(c.A,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.A,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:s.length>0&&(0,o.jsx)(h,{years:s})})]})]})}},6266:(e,r,t)=>{t.d(r,{i:()=>n});var a=t(4586);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.A)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.c688eee8.js b/assets/js/9e4087bc.c688eee8.js new file mode 100644 index 000000000..917789bff --- /dev/null +++ b/assets/js/9e4087bc.c688eee8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2711],{9331:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(6540);var a=t(8774),n=t(1312),i=t(1213),s=t(6266),c=t(7823),l=t(1107),o=t(4848);function d(e){let{year:r,posts:t}=e;const n=(0,s.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata.permalink,children:[(r=e.metadata.date,n.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,n.T)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,n.T)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),s=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.be,{title:t,description:a}),(0,o.jsxs)(c.A,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.A,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:s.length>0&&(0,o.jsx)(h,{years:s})})]})]})}},6266:(e,r,t)=>{t.d(r,{i:()=>n});var a=t(4586);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.A)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]); \ No newline at end of file diff --git a/assets/js/9efd8a4a.4d2af715.js b/assets/js/9efd8a4a.4d2af715.js new file mode 100644 index 000000000..b489d676c --- /dev/null +++ b/assets/js/9efd8a4a.4d2af715.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5415],{8309:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"images/WebP","title":"WebP","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/images/WebP.mdx","sourceDirName":"images","slug":"/images/WebP","permalink":"/docs/images/WebP","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/WebP.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"WebP","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"HEIC","permalink":"/docs/images/HEIC"},"next":{"title":"JPEG 2000","permalink":"/docs/images/JPEG2000"}}');var t=s(4848),o=s(8453);const r={title:"WebP",sidebar_position:4},d="WebP",c={},l=[{value:"Encoding",id:"encoding",level:2},{value:"Using libwebp",id:"using-libwebp",level:3},{value:"decoding",id:"decoding",level:2},{value:"Performance Checklist",id:"performance-checklist",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"webp",children:"WebP"})}),"\n",(0,t.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(n.p,{children:['WebP is a free image file format first released by Google in 2010. It consists of 2 primary "modes" of operation. A lossy mode derived from the ',(0,t.jsx)(n.a,{href:"/docs/video/VP8",children:"VP8"})," video codec, and a novel lossless mode added in 2011."]}),"\n",(0,t.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsx)(n.h3,{id:"using-libwebp",children:"Using libwebp"}),"\n",(0,t.jsxs)(n.p,{children:["libwebp supports WebP, JPEG, PNG, PNM (PGM, PPM, PAM), TIFF as input formats, and a quality (",(0,t.jsx)(n.code,{children:"-q"}),") value between 0 (lowest quality, smallest file) and 100 (highest quality, largest file). Should you need the lossless mode, you need to instead use a ",(0,t.jsx)(n.code,{children:"-z"})," argument, with values representing the effort used between 0 (fastest encode, largest file) and 9 (slowest encode, smallest file)."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cwebp example.png -q 75 -o example.webp\n"})}),"\n",(0,t.jsx)(n.h2,{id:"decoding",children:"decoding"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"dwebp example.webp -o example.png\n"})}),"\n",(0,t.jsx)(n.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,t.jsxs)(n.p,{children:["Lossless? ",(0,t.jsx)(n.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(n.p,{children:["Lossy? ",(0,t.jsx)(n.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(n.p,{children:["Supported Bit Depth:\n",(0,t.jsx)(n.em,{children:"8 BPC"})]}),"\n",(0,t.jsxs)(n.p,{children:["HDR/Wide Gamut? ",(0,t.jsx)(n.em,{children:"No"})]}),"\n",(0,t.jsxs)(n.p,{children:["Animation? ",(0,t.jsx)(n.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(n.p,{children:["Transparency? ",(0,t.jsx)(n.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(n.p,{children:["Progressive Decode? ",(0,t.jsx)(n.em,{children:"No"})]}),"\n",(0,t.jsxs)(n.p,{children:["Royalty Free? ",(0,t.jsx)(n.em,{children:"Yes"})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>d});var i=s(6540);const t={},o=i.createContext(t);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9efd8a4a.99078227.js b/assets/js/9efd8a4a.99078227.js deleted file mode 100644 index 6e01a36c3..000000000 --- a/assets/js/9efd8a4a.99078227.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5415],{1076:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>d,toc:()=>l});var s=i(4848),t=i(8453);const o={title:"WebP",sidebar_position:4},r="WebP",d={id:"images/WebP",title:"WebP",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/WebP.mdx",sourceDirName:"images",slug:"/images/WebP",permalink:"/docs/images/WebP",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/WebP.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"WebP",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"HEIC",permalink:"/docs/images/HEIC"},next:{title:"JPEG 2000",permalink:"/docs/images/JPEG2000"}},c={},l=[{value:"Encoding",id:"encoding",level:2},{value:"Using libwebp",id:"using-libwebp",level:3},{value:"decoding",id:"decoding",level:2},{value:"Performance Checklist",id:"performance-checklist",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"webp",children:"WebP"})}),"\n",(0,s.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(n.p,{children:['WebP is a free image file format first released by Google in 2010. It consists of 2 primary "modes" of operation. A lossy mode derived from the ',(0,s.jsx)(n.a,{href:"/docs/video/VP8",children:"VP8"})," video codec, and a novel lossless mode added in 2011."]}),"\n",(0,s.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsx)(n.h3,{id:"using-libwebp",children:"Using libwebp"}),"\n",(0,s.jsxs)(n.p,{children:["libwebp supports WebP, JPEG, PNG, PNM (PGM, PPM, PAM), TIFF as input formats, and a quality (",(0,s.jsx)(n.code,{children:"-q"}),") value between 0 (lowest quality, smallest file) and 100 (highest quality, largest file). Should you need the lossless mode, you need to instead use a ",(0,s.jsx)(n.code,{children:"-z"})," argument, with values representing the effort used between 0 (fastest encode, largest file) and 9 (slowest encode, smallest file)."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cwebp example.png -q 75 -o example.webp\n"})}),"\n",(0,s.jsx)(n.h2,{id:"decoding",children:"decoding"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"dwebp example.webp -o example.png\n"})}),"\n",(0,s.jsx)(n.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,s.jsxs)(n.p,{children:["Lossless? ",(0,s.jsx)(n.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(n.p,{children:["Lossy? ",(0,s.jsx)(n.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(n.p,{children:["Supported Bit Depth:\n",(0,s.jsx)(n.em,{children:"8 BPC"})]}),"\n",(0,s.jsxs)(n.p,{children:["HDR/Wide Gamut? ",(0,s.jsx)(n.em,{children:"No"})]}),"\n",(0,s.jsxs)(n.p,{children:["Animation? ",(0,s.jsx)(n.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(n.p,{children:["Transparency? ",(0,s.jsx)(n.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(n.p,{children:["Progressive Decode? ",(0,s.jsx)(n.em,{children:"No"})]}),"\n",(0,s.jsxs)(n.p,{children:["Royalty Free? ",(0,s.jsx)(n.em,{children:"Yes"})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>d});var s=i(6540);const t={},o=s.createContext(t);function r(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9f640ee8.37d95ba0.js b/assets/js/9f640ee8.37d95ba0.js new file mode 100644 index 000000000..74ed5350d --- /dev/null +++ b/assets/js/9f640ee8.37d95ba0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6810],{4799:(e,r,o)=>{o.r(r),o.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"encoders/Aurora1","title":"Aurora1 AV1","description":"Aurora1 AV1 is a proprietary and paid software AV1 encoder developed by Visionular. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly \\"better\\" than public, FOSS encoders.","source":"@site/docs/encoders/Aurora1.mdx","sourceDirName":"encoders","slug":"/encoders/Aurora1","permalink":"/docs/encoders/Aurora1","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/Aurora1.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"label":"Aurora1 AV1","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"rav1e","permalink":"/docs/encoders/rav1e"},"next":{"title":"vpxenc","permalink":"/docs/encoders/vpxenc"}}');var n=o(4848),a=o(8453);const s={label:"Aurora1 AV1",sidebar_position:7},i="Aurora1 AV1",c={},d=[];function u(e){const r={a:"a",h1:"h1",header:"header",p:"p",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"aurora1-av1",children:"Aurora1 AV1"})}),"\n",(0,n.jsxs)(r.p,{children:[(0,n.jsx)(r.a,{href:"https://visionular.ai/aurora1-av1-encoder/",children:"Aurora1 AV1"})," is a proprietary and paid software AV1 encoder developed by ",(0,n.jsx)(r.a,{href:"https://www.visionular.com/en",children:"Visionular"}),'. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly "better" than public, FOSS encoders.']})]})}function p(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,r,o)=>{o.d(r,{R:()=>s,x:()=>i});var t=o(6540);const n={},a=t.createContext(n);function s(e){const r=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),t.createElement(a.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9f640ee8.7839ab16.js b/assets/js/9f640ee8.7839ab16.js deleted file mode 100644 index d34e99205..000000000 --- a/assets/js/9f640ee8.7839ab16.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6810],{5864:(e,r,o)=>{o.r(r),o.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var t=o(4848),n=o(8453);const a={label:"Aurora1 AV1",sidebar_position:7},i="Aurora1 AV1",s={id:"encoders/Aurora1",title:"Aurora1 AV1",description:'Aurora1 AV1 is a proprietary and paid software AV1 encoder developed by Visionular. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly "better" than public, FOSS encoders.',source:"@site/docs/encoders/Aurora1.mdx",sourceDirName:"encoders",slug:"/encoders/Aurora1",permalink:"/docs/encoders/Aurora1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/Aurora1.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"Aurora1 AV1",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"rav1e",permalink:"/docs/encoders/rav1e"},next:{title:"vpxenc",permalink:"/docs/encoders/vpxenc"}},c={},d=[];function u(e){const r={a:"a",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"aurora1-av1",children:"Aurora1 AV1"})}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.a,{href:"https://visionular.ai/aurora1-av1-encoder/",children:"Aurora1 AV1"})," is a proprietary and paid software AV1 encoder developed by ",(0,t.jsx)(r.a,{href:"https://www.visionular.com/en",children:"Visionular"}),'. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly "better" than public, FOSS encoders.']})]})}function p(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,r,o)=>{o.d(r,{R:()=>i,x:()=>s});var t=o(6540);const n={},a=t.createContext(n);function i(e){const r=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(a.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9f709603.998a2a99.js b/assets/js/9f709603.998a2a99.js new file mode 100644 index 000000000..fd1cf33e3 --- /dev/null +++ b/assets/js/9f709603.998a2a99.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5341],{8556:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"filtering/deband","title":"Deband","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/filtering/deband.mdx","sourceDirName":"filtering","slug":"/filtering/deband","permalink":"/docs/filtering/deband","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/deband.mdx","tags":[],"version":"current","sidebarPosition":11,"frontMatter":{"title":"Deband","sidebar_position":11},"sidebar":"tutorialSidebar","previous":{"title":"Antialiasing","permalink":"/docs/filtering/antialiasing"},"next":{"title":"Graining","permalink":"/docs/filtering/graining"}}');var o=t(4848),r=t(8453);const s={title:"Deband",sidebar_position:11},a="Deband",d={},c=[];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"deband",children:"Deband"})}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9f709603.a689513c.js b/assets/js/9f709603.a689513c.js deleted file mode 100644 index 698dc34e4..000000000 --- a/assets/js/9f709603.a689513c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5341],{3414:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=t(4848),o=t(8453);const r={title:"Deband",sidebar_position:11},s="Deband",a={id:"filtering/deband",title:"Deband",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/deband.mdx",sourceDirName:"filtering",slug:"/filtering/deband",permalink:"/docs/filtering/deband",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/deband.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"Deband",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Antialiasing",permalink:"/docs/filtering/antialiasing"},next:{title:"Graining",permalink:"/docs/filtering/graining"}},d={},c=[];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"deband",children:"Deband"})}),"\n",(0,i.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a8f610c9.46a9e8d4.js b/assets/js/a8f610c9.46a9e8d4.js deleted file mode 100644 index c6759f3dc..000000000 --- a/assets/js/a8f610c9.46a9e8d4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8599],{5860:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var i=o(4848),n=o(8453);const s={title:"brotli",sidebar_position:6},a="Brotli",r={id:"data/brotli",title:"brotli",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/brotli.mdx",sourceDirName:"data",slug:"/data/brotli",permalink:"/docs/data/brotli",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/brotli.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"brotli",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"xz",permalink:"/docs/data/xz"},next:{title:"zpaq",permalink:"/docs/data/zpaq"}},l={},c=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"brotli",children:"Brotli"})}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(t.p,{children:["Brotli was released by Google in late 2013, & it is commonly used on the Web for content delivery. It is a core part of the ",(0,i.jsx)(t.code,{children:".woff2"})," Web Open Font Format, allowing web fonts to be smaller when sent to users as part of a website. It is not very common to pass around ",(0,i.jsx)(t.code,{children:".tar.br"})," Brotli archives like you would with ",(0,i.jsx)(t.a,{href:"/docs/data/gzip",children:"gzip"})," or ",(0,i.jsx)(t.a,{href:"/docs/data/xz",children:"xz"}),", so it is perfectly acceptable that such files aren't really compatible anywhere. Brotli is almost universally compatible across the Web, supported by as much as 96% of the World Wide Web's users."]}),"\n",(0,i.jsx)(t.p,{children:"Brotli is based on LZ77 & Huffman coding, much like ZIP. It also uses context modeling to allow the use of multiple Huffman trees for the same alphabet in the same block; this essentially means that based on the context of the data being compressed, it can be compressed more efficiently especially if it contains multiple different kinds of data."}),"\n",(0,i.jsxs)(t.p,{children:["Brotli was co-authored & partially developed by Jyrki Alakuijala, who also worked on ",(0,i.jsx)(t.a,{href:"/docs/images/JXL",children:"JPEG-XL"})," & the efficient ",(0,i.jsx)(t.a,{href:"/docs/images/JPEG",children:"JPEG"})," encoder jpegli. JPEG-XL's metadata information is usually Brotli-compressed."]})]})}function u(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>r});var i=o(6540);const n={},s=i.createContext(n);function a(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a8f610c9.d16485c4.js b/assets/js/a8f610c9.d16485c4.js new file mode 100644 index 000000000..d2f41ed6b --- /dev/null +++ b/assets/js/a8f610c9.d16485c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8599],{7772:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"data/brotli","title":"brotli","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/data/brotli.mdx","sourceDirName":"data","slug":"/data/brotli","permalink":"/docs/data/brotli","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/brotli.mdx","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"brotli","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"xz","permalink":"/docs/data/xz"},"next":{"title":"zpaq","permalink":"/docs/data/zpaq"}}');var n=o(4848),s=o(8453);const a={title:"brotli",sidebar_position:6},r="Brotli",l={},c=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"brotli",children:"Brotli"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(t.p,{children:["Brotli was released by Google in late 2013, & it is commonly used on the Web for content delivery. It is a core part of the ",(0,n.jsx)(t.code,{children:".woff2"})," Web Open Font Format, allowing web fonts to be smaller when sent to users as part of a website. It is not very common to pass around ",(0,n.jsx)(t.code,{children:".tar.br"})," Brotli archives like you would with ",(0,n.jsx)(t.a,{href:"/docs/data/gzip",children:"gzip"})," or ",(0,n.jsx)(t.a,{href:"/docs/data/xz",children:"xz"}),", so it is perfectly acceptable that such files aren't really compatible anywhere. Brotli is almost universally compatible across the Web, supported by as much as 96% of the World Wide Web's users."]}),"\n",(0,n.jsx)(t.p,{children:"Brotli is based on LZ77 & Huffman coding, much like ZIP. It also uses context modeling to allow the use of multiple Huffman trees for the same alphabet in the same block; this essentially means that based on the context of the data being compressed, it can be compressed more efficiently especially if it contains multiple different kinds of data."}),"\n",(0,n.jsxs)(t.p,{children:["Brotli was co-authored & partially developed by Jyrki Alakuijala, who also worked on ",(0,n.jsx)(t.a,{href:"/docs/images/JXL",children:"JPEG-XL"})," & the efficient ",(0,n.jsx)(t.a,{href:"/docs/images/JPEG",children:"JPEG"})," encoder jpegli. JPEG-XL's metadata information is usually Brotli-compressed."]})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>r});var i=o(6540);const n={},s=i.createContext(n);function a(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aaf3ff15.cf26fcc3.js b/assets/js/aaf3ff15.38a05c5b.js similarity index 68% rename from assets/js/aaf3ff15.cf26fcc3.js rename to assets/js/aaf3ff15.38a05c5b.js index e819d118b..a25a74cd1 100644 --- a/assets/js/aaf3ff15.cf26fcc3.js +++ b/assets/js/aaf3ff15.38a05c5b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3170],{5890:e=>{e.exports=JSON.parse('{"tag":{"label":"compression","permalink":"/blog/tags/compression","allTagsPath":"/blog/tags","count":5,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/compression","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3170],{5890:e=>{e.exports=JSON.parse('{"tag":{"label":"compression","permalink":"/blog/tags/compression","allTagsPath":"/blog/tags","count":6,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/compression","page":1,"postsPerPage":10,"totalPages":1,"totalCount":6,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/acf4709b.71ce111a.js b/assets/js/acf4709b.71ce111a.js new file mode 100644 index 000000000..d483c372f --- /dev/null +++ b/assets/js/acf4709b.71ce111a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7225],{4843:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"subtitles/SSA","title":"SubStation Alpha","description":"The SubStation Alpha subtitle format.","source":"@site/docs/subtitles/SSA.mdx","sourceDirName":"subtitles","slug":"/subtitles/SSA","permalink":"/docs/subtitles/SSA","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/SSA.mdx","tags":[],"version":"current","frontMatter":{"title":"SubStation Alpha","description":"The SubStation Alpha subtitle format.","keywords":["SSA","ASS","subtitles"]},"sidebar":"tutorialSidebar","previous":{"title":"SRT","permalink":"/docs/subtitles/SRT"},"next":{"title":"WebVTT","permalink":"/docs/subtitles/webvtt"}}');var a=n(4848),r=n(8453);const o={title:"SubStation Alpha",description:"The SubStation Alpha subtitle format.",keywords:["SSA","ASS","subtitles"]},s="Overview",l={},d=[{value:"Format",id:"format",level:2},{value:"ASS (SSA v4+) header",id:"ass-ssa-v4-header",level:3},{value:"Further reading:",id:"further-reading",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:"SubStation Alpha (SSA), also known as Advanced Substation Alpha (ASS) for v4+, is a subtitle format. It was originally used by the Windows program of the same name, aimed at the karaoke and anime communities. It's advanced styling compared to alternatives made it popular with release groups."}),"\n",(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"overview",children:"Overview"})}),"\n",(0,a.jsxs)(t.p,{children:['SSA is a "plain" text format, with Unicode support in ASS. It can either be left as a plain text file with the extension of .ssa or .ass, or muxed into a Matroska (.mkv) or AVI (.avi) file. The original SubStation Alpha software is abandonware, however a wide variety of media authoring, muxing, and playing software supports SSA, including ',(0,a.jsx)(t.a,{href:"/docs/video-players",children:"VLC"}),", ",(0,a.jsx)(t.a,{href:"/docs/video-players",children:"MPV"}),", and ",(0,a.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),"."]}),"\n",(0,a.jsx)(t.h2,{id:"format",children:"Format"}),"\n",(0,a.jsx)(t.p,{children:"SSA uses the word \"script\" to refer to the subtitles that track a video. The character ';' at the beginning of a line is used to mark comments."}),"\n",(0,a.jsx)(t.h3,{id:"ass-ssa-v4-header",children:"ASS (SSA v4+) header"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"[Script Info]\n; This is an Advanced Sub Station Alpha v4+ script.\n; For Sub Station Alpha info and downloads,\n; go to http://www.eswat.demon.co.uk/\n; or email kotus@eswat.demon.co.uk\n; \n; Advanced Sub Station Alpha script format developed by #Anime-Fansubs@EfNET\n; http://www.anime-fansubs.org\n; \n; For additional info and downloads go to http://vobsub.edensrising.com/\n; or email gabest@freemail.hu\n; \n; Note: This file was saved by Subresync.\n; \nScriptType: v4.00+\nCollisions: Normal\nPlayResX: 384\nPlayResY: 288\nTimer: 100.0000\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\nStyle: Default,Tahoma,16,&H00000000,&H00ffffff,&H00ffffff,&H00c0c0c0,-1,0,0,0,100,100,0,0.00,1,2,3,2,20,20,20,1\n\n[Events]\nFormat: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text\nDialogue: 0,0:01:41.70,0:01:46.84,Default,,0000,0000,0000,,Le rugissement des larmes !\\NTu es mon ami.\nDialogue: 0,0:02:00.99,0:02:02.87,Default,,0000,0000,0000,,Est-ce vraiment Naruto ?\n"})}),"\n",(0,a.jsx)(t.h2,{id:"further-reading",children:"Further reading:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.a,{href:"https://wiki.multimedia.cx/index.php/SubStation_Alpha",children:"Multimedia wiki"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.a,{href:"http://moodub.free.fr/video/ass-specs.doc",children:"Specification"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.a,{href:"https://web.archive.org/web/20030603235926/http://www.eswat.demon.co.uk/substation.html",children:"Archived original software release"})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var i=n(6540);const a={},r=i.createContext(a);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/acf4709b.e19f1737.js b/assets/js/acf4709b.e19f1737.js deleted file mode 100644 index b9174d9fa..000000000 --- a/assets/js/acf4709b.e19f1737.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7225],{1918:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var i=n(4848),a=n(8453);const r={title:"SubStation Alpha",description:"The SubStation Alpha subtitle format.",keywords:["SSA","ASS","subtitles"]},o="Overview",s={id:"subtitles/SSA",title:"SubStation Alpha",description:"The SubStation Alpha subtitle format.",source:"@site/docs/subtitles/SSA.mdx",sourceDirName:"subtitles",slug:"/subtitles/SSA",permalink:"/docs/subtitles/SSA",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/SSA.mdx",tags:[],version:"current",frontMatter:{title:"SubStation Alpha",description:"The SubStation Alpha subtitle format.",keywords:["SSA","ASS","subtitles"]},sidebar:"tutorialSidebar",previous:{title:"SRT",permalink:"/docs/subtitles/SRT"},next:{title:"WebVTT",permalink:"/docs/subtitles/webvtt"}},l={},d=[{value:"Format",id:"format",level:2},{value:"ASS (SSA v4+) header",id:"ass-ssa-v4-header",level:3},{value:"Further reading:",id:"further-reading",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"SubStation Alpha (SSA), also known as Advanced Substation Alpha (ASS) for v4+, is a subtitle format. It was originally used by the Windows program of the same name, aimed at the karaoke and anime communities. It's advanced styling compared to alternatives made it popular with release groups."}),"\n",(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"overview",children:"Overview"})}),"\n",(0,i.jsxs)(t.p,{children:['SSA is a "plain" text format, with Unicode support in ASS. It can either be left as a plain text file with the extension of .ssa or .ass, or muxed into a Matroska (.mkv) or AVI (.avi) file. The original SubStation Alpha software is abandonware, however a wide variety of media authoring, muxing, and playing software supports SSA, including ',(0,i.jsx)(t.a,{href:"/docs/video-players",children:"VLC"}),", ",(0,i.jsx)(t.a,{href:"/docs/video-players",children:"MPV"}),", and ",(0,i.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"format",children:"Format"}),"\n",(0,i.jsx)(t.p,{children:"SSA uses the word \"script\" to refer to the subtitles that track a video. The character ';' at the beginning of a line is used to mark comments."}),"\n",(0,i.jsx)(t.h3,{id:"ass-ssa-v4-header",children:"ASS (SSA v4+) header"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"[Script Info]\n; This is an Advanced Sub Station Alpha v4+ script.\n; For Sub Station Alpha info and downloads,\n; go to http://www.eswat.demon.co.uk/\n; or email kotus@eswat.demon.co.uk\n; \n; Advanced Sub Station Alpha script format developed by #Anime-Fansubs@EfNET\n; http://www.anime-fansubs.org\n; \n; For additional info and downloads go to http://vobsub.edensrising.com/\n; or email gabest@freemail.hu\n; \n; Note: This file was saved by Subresync.\n; \nScriptType: v4.00+\nCollisions: Normal\nPlayResX: 384\nPlayResY: 288\nTimer: 100.0000\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\nStyle: Default,Tahoma,16,&H00000000,&H00ffffff,&H00ffffff,&H00c0c0c0,-1,0,0,0,100,100,0,0.00,1,2,3,2,20,20,20,1\n\n[Events]\nFormat: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text\nDialogue: 0,0:01:41.70,0:01:46.84,Default,,0000,0000,0000,,Le rugissement des larmes !\\NTu es mon ami.\nDialogue: 0,0:02:00.99,0:02:02.87,Default,,0000,0000,0000,,Est-ce vraiment Naruto ?\n"})}),"\n",(0,i.jsx)(t.h2,{id:"further-reading",children:"Further reading:"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"https://wiki.multimedia.cx/index.php/SubStation_Alpha",children:"Multimedia wiki"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"http://moodub.free.fr/video/ass-specs.doc",children:"Specification"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"https://web.archive.org/web/20030603235926/http://www.eswat.demon.co.uk/substation.html",children:"Archived original software release"})})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var i=n(6540);const a={},r=i.createContext(a);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/afe5e22f.4194e0a2.js b/assets/js/afe5e22f.4194e0a2.js deleted file mode 100644 index 1f7467e1e..000000000 --- a/assets/js/afe5e22f.4194e0a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8117],{1624:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var t=n(4848),r=n(8453);const s={title:"x265",sidebar_position:2},o="x265",a={id:"encoders/x265",title:"x265",description:"x265 is a software library and command line application for encoding H.265 / HEVC developed by MulticoreWare, written in C++ and x86 assembly, and released in 2013.",source:"@site/docs/encoders/x265.mdx",sourceDirName:"encoders",slug:"/encoders/x265",permalink:"/docs/encoders/x265",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x265.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"x265",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"x264",permalink:"/docs/encoders/x264"},next:{title:"x266",permalink:"/docs/encoders/x266"}},l={},d=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2},{value:"Parameters",id:"parameters",level:2},{value:"Preset",id:"preset",level:3},{value:"CRF",id:"crf",level:3},{value:"bframes",id:"bframes",level:3},{value:"SAO",id:"sao",level:3},{value:"Deblock",id:"deblock",level:3},{value:"Psy-RD",id:"psy-rd",level:3},{value:"Adaptive Quantization",id:"adaptive-quantization",level:3},{value:"CU-Tree",id:"cu-tree",level:3}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"x265",children:"x265"})}),"\n",(0,t.jsxs)(i.p,{children:["x265 is a software library and command line application for encoding ",(0,t.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265 / HEVC"})," developed by MulticoreWare, written in C++ and x86 assembly, and released in 2013."]}),"\n",(0,t.jsx)(i.p,{children:"By default, x265 is tuned for low-bitrate content due to the blurring filters it applies. However, it can be tuned using CLI options to be very effective for high-fidelity content as well.\nIt is a more efficient and modern encoder compared to x264, and is currently a popular choice for both high-fidelity and mini encodes."}),"\n",(0,t.jsx)(i.p,{children:"x265 is currently not recommended for lossless encoding. For that niche, x264 is considerably faster without meaningful efficiency loss."}),"\n",(0,t.jsx)(i.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,t.jsxs)(i.p,{children:["x265 is available in FFmpeg via ",(0,t.jsx)(i.code,{children:"libx265"}),", to check if you have it, run ",(0,t.jsx)(i.code,{children:"ffmpeg -h encoder=libx265"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Pre-built binary (Recommended):"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"http://msystem.waw.pl/x265/",children:"http://msystem.waw.pl/x265/"})}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsxs)(i.p,{children:["This section will overview the most important parameters for controlling output and quality in x265. The parameters will be listed in the format used by the standalone x265 binary,\nbut all of the parameters should also be usable in ffmpeg in the format e.g. ",(0,t.jsx)(i.code,{children:"-x265-params pass=1"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"preset",children:"Preset"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.code,{children:"--preset slow"})}),"\n",(0,t.jsxs)(i.p,{children:["If encoding speed is a priority, x265 is probably not the best choice. x264 at ",(0,t.jsx)(i.code,{children:"--preset veryslow"})," will likely be faster than x265 at ",(0,t.jsx)(i.code,{children:"--preset fast"}),", while providing comparable efficiency.\nHowever, x265 finds its sweet spot at ",(0,t.jsx)(i.code,{children:"--preset slow"}),", and this is the preset most people should use. This preset provides high quality while not being unreasonably slow."]}),"\n",(0,t.jsxs)(i.p,{children:["The exception where you may want to tax your CPU by going to ",(0,t.jsx)(i.code,{children:"--preset veryslow"})," is when doing lower bitrate encodes (e.g. crf >=22). This is because the ",(0,t.jsx)(i.code,{children:"veryslow"})," preset provides\nbetter motion estimation at low bitrates. However, it is exceptionally slow, so it is not generally recommended for everyday use."]}),"\n",(0,t.jsx)(i.h3,{id:"crf",children:"CRF"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.code,{children:"--crf"})}),"\n",(0,t.jsx)(i.p,{children:"CRF, standing for Constant Rate Factor, is a method for selecting a level of quality-to-filesize tradeoff. CRF is preferable to bitrate targeting because CRF only requires one encoding pass,\nso bitrate targeting should only be used if you need to target a specific filesize. Nowadays, those situations are uncommon and it is preferred to use CRF to target a quality level.\nCRF is preferable to QP because CRF allows the encoder to vary the quality level from frame to frame for better viewing quality in areas of the video that need it the most."}),"\n",(0,t.jsx)(i.p,{children:'What CRF to use will vary depending on your goals. The range of valid CRF values is 0-51, with larger values providing smaller filesize but lower quality. Some amount of experimentation\nmay be needed to find the value you prefer. A decent "balanced" target will be around 17 or 18, providing good quality without inflating filesize too much. For a focus on maximum quality,\na value of 12 or 13 will result in visually lossless output for most videos, but will result in a much larger filesize. For miniature encodes, try raising the CRF as much as you feel comfortable\nbefore the quality becomes unbearable. CRFs of 22 or higher are generally considered "low bitrate", so how high you raise the CRF depends on how low of a filesize you are trying to achieve.'}),"\n",(0,t.jsx)(i.h3,{id:"bframes",children:"bframes"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.code,{children:"--bframes"})}),"\n",(0,t.jsxs)(i.p,{children:["B-frames are bi-directional predictive frames, this means that they can reference frames both before and after themselves, which makes them very efficient.\nThe ",(0,t.jsx)(i.code,{children:"--bframes"})," parameter controls how many B-frames can be used consecutively. Higher values can result in better compression, but this value has diminishing returns,\nas the encoder won't use extra B-frames in situations where it would reduce efficiency."]}),"\n",(0,t.jsxs)(i.p,{children:["The default value at preset slow is ",(0,t.jsx)(i.code,{children:"4"}),". It is recommended to increase this to ",(0,t.jsx)(i.code,{children:"--bframes 5"})," for live action and CGI content, or ",(0,t.jsx)(i.code,{children:"--bframes 8"})," for anime and cartoons.\nContent with little motion benefits more from high B-frames values, but even on anime where there are many still scenes, there is no measurable benefit\nto using a value higher than ",(0,t.jsx)(i.code,{children:"8"}),", and it would just slow down the encoder for no benefit."]}),"\n",(0,t.jsx)(i.h3,{id:"sao",children:"SAO"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"--sao"}),", ",(0,t.jsx)(i.code,{children:"--limit-sao"}),", ",(0,t.jsx)(i.code,{children:"--no-sao"})]}),"\n",(0,t.jsxs)(i.p,{children:["SAO stands for Sample Adaptive Offset, and is a loop filter used by x265 to prevent artifacting. However, it has the side effect of losing sharpness on details.\nIt is recommended to leave this on (default) at high CRF values (>=22). For medium values between 17-21, you can use ",(0,t.jsx)(i.code,{children:"--limit-sao"})," which will limit the effects of SAO to have\nless of a significant effect. For low CRF values (<=16), you can safely use ",(0,t.jsx)(i.code,{children:"--no-sao"})," to prefer detail preservation, as the higher bitrates will naturally lead to fewer artifacts."]}),"\n",(0,t.jsx)(i.h3,{id:"deblock",children:"Deblock"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.code,{children:"--deblock"})}),"\n",(0,t.jsxs)(i.p,{children:["Deblock is another loop filter, this one intended to reduce blocking in videos, but may have a blurring effect at high strengths. For most encodes, it is fine to leave this\nat the default value. At lower CRF values, it may be desirable to lower this to ",(0,t.jsx)(i.code,{children:"--deblock -1:-1"})," for anime or ",(0,t.jsx)(i.code,{children:"--deblock -2:-2"})," for live action, in order to preserve\nmore grain and detail."]}),"\n",(0,t.jsx)(i.h3,{id:"psy-rd",children:"Psy-RD"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"--psy-rd"})," and ",(0,t.jsx)(i.code,{children:"--psy-rdoq"})]}),"\n",(0,t.jsx)(i.p,{children:"The parameters control psychovisual rate distribution. What this means is the redistribution of bits to make a video more pleasing to human eyes. These options may be harmful to metrics\nthat compare videos mathematically, but are better for viewing human eyes because they prioritize facets of the video that humans prefer."}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"--psy-rd"})," biases toward matching the level of energy in the source image, which makes it good for retaining detail. For standard anime, it is recommended to use ",(0,t.jsx)(i.code,{children:"--psy-rd 1.0"}),". The more\ngrain, detail, and dark scenes in a source, the higher this should be raised. Many modern anime tends to have more detailed backgrounds and surfaces, so ",(0,t.jsx)(i.code,{children:"--psy-rd 1.5"})," may be a better\ndefault for modern anime. For live action, a ",(0,t.jsx)(i.code,{children:"--psy-rd 1.5"})," or possibly even ",(0,t.jsx)(i.code,{children:"2.0"})," may be preferred, as live action naturally has more detail and grain than anime."]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"--psy-rdoq"})," biases toward energy in general, which makes it key for preserving grain. ",(0,t.jsx)(i.code,{children:"--psy-rdoq 1.0"})," is a safe default for anime. Like psy-rd, this value should be increased more\nfor sources with more grain. For grainy anime, ",(0,t.jsx)(i.code,{children:"--psy-rdoq 2.0"})," or even ",(0,t.jsx)(i.code,{children:"3.0"})," can be preferable. Likewise, for many live action series, a default of ",(0,t.jsx)(i.code,{children:"--psy-rdoq 3.0"})," can be preferable,\nor even ",(0,t.jsx)(i.code,{children:"4.0"})," with heavy grain."]}),"\n",(0,t.jsx)(i.p,{children:"These are two settings that should be tweaked according to the source material."}),"\n",(0,t.jsx)(i.h3,{id:"adaptive-quantization",children:"Adaptive Quantization"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.code,{children:"--aq-mode 3 --aq-strength "})}),"\n",(0,t.jsxs)(i.p,{children:["Adaptive quantization, shortened to AQ, is a mechanism to redistribute bitrate within a frame to improve visual quality by reducing artifacts.\nx265 has several different AQ modes, and ",(0,t.jsx)(i.code,{children:"--aq-mode 3"})," is nearly always best, because this mode adds a bias favoring dark scenes, which greatly reduces the effects of banding and blocking.\nThe strength of AQ can also be set with ",(0,t.jsx)(i.code,{children:"--aq-strength"}),". The optimal setting for this may vary depending on the type of content you are encoding.\nFor anime, ",(0,t.jsx)(i.code,{children:"--aq-strength 0.7"})," will typically produce good results. For live action, a slightly higher ",(0,t.jsx)(i.code,{children:"0.8"})," may be a better default.\nHigher values, up to ",(0,t.jsx)(i.code,{children:"--aq-strength 1"}),", can be helpful for sources with heavy grain, although this will also increase overall bitrate."]}),"\n",(0,t.jsx)(i.h3,{id:"cu-tree",children:"CU-Tree"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.code,{children:"--no-cutree"})}),"\n",(0,t.jsxs)(i.p,{children:["CU-Tree is a mechanism very similar to MB-Tree in x264, which is intended to redistribute bitrate in a more optimal psychovisual manner. However, many people find CU-Tree to be harmful to quality,\nespecially when attempting to encode videos with considerable amounts of grain, and therefore many people recommend disabling this with ",(0,t.jsx)(i.code,{children:"--no-cutree"}),"."]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>a});var t=n(6540);const r={},s=t.createContext(r);function o(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/afe5e22f.cb896c65.js b/assets/js/afe5e22f.cb896c65.js new file mode 100644 index 000000000..2f81105c1 --- /dev/null +++ b/assets/js/afe5e22f.cb896c65.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8117],{1220:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"encoders/x265","title":"x265","description":"x265 is a software library and command line application for encoding H.265 / HEVC developed by MulticoreWare, written in C++ and x86 assembly, and released in 2013.","source":"@site/docs/encoders/x265.mdx","sourceDirName":"encoders","slug":"/encoders/x265","permalink":"/docs/encoders/x265","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x265.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"x265","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"x264","permalink":"/docs/encoders/x264"},"next":{"title":"x266","permalink":"/docs/encoders/x266"}}');var r=n(4848),s=n(8453);const o={title:"x265",sidebar_position:2},a="x265",l={},d=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2},{value:"Parameters",id:"parameters",level:2},{value:"Preset",id:"preset",level:3},{value:"CRF",id:"crf",level:3},{value:"bframes",id:"bframes",level:3},{value:"SAO",id:"sao",level:3},{value:"Deblock",id:"deblock",level:3},{value:"Psy-RD",id:"psy-rd",level:3},{value:"Adaptive Quantization",id:"adaptive-quantization",level:3},{value:"CU-Tree",id:"cu-tree",level:3}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"x265",children:"x265"})}),"\n",(0,r.jsxs)(i.p,{children:["x265 is a software library and command line application for encoding ",(0,r.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265 / HEVC"})," developed by MulticoreWare, written in C++ and x86 assembly, and released in 2013."]}),"\n",(0,r.jsx)(i.p,{children:"By default, x265 is tuned for low-bitrate content due to the blurring filters it applies. However, it can be tuned using CLI options to be very effective for high-fidelity content as well.\nIt is a more efficient and modern encoder compared to x264, and is currently a popular choice for both high-fidelity and mini encodes."}),"\n",(0,r.jsx)(i.p,{children:"x265 is currently not recommended for lossless encoding. For that niche, x264 is considerably faster without meaningful efficiency loss."}),"\n",(0,r.jsx)(i.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,r.jsxs)(i.p,{children:["x265 is available in FFmpeg via ",(0,r.jsx)(i.code,{children:"libx265"}),", to check if you have it, run ",(0,r.jsx)(i.code,{children:"ffmpeg -h encoder=libx265"}),"."]}),"\n",(0,r.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Pre-built binary (Recommended):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"http://msystem.waw.pl/x265/",children:"http://msystem.waw.pl/x265/"})}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"parameters",children:"Parameters"}),"\n",(0,r.jsxs)(i.p,{children:["This section will overview the most important parameters for controlling output and quality in x265. The parameters will be listed in the format used by the standalone x265 binary,\nbut all of the parameters should also be usable in ffmpeg in the format e.g. ",(0,r.jsx)(i.code,{children:"-x265-params pass=1"}),"."]}),"\n",(0,r.jsx)(i.h3,{id:"preset",children:"Preset"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"--preset slow"})}),"\n",(0,r.jsxs)(i.p,{children:["If encoding speed is a priority, x265 is probably not the best choice. x264 at ",(0,r.jsx)(i.code,{children:"--preset veryslow"})," will likely be faster than x265 at ",(0,r.jsx)(i.code,{children:"--preset fast"}),", while providing comparable efficiency.\nHowever, x265 finds its sweet spot at ",(0,r.jsx)(i.code,{children:"--preset slow"}),", and this is the preset most people should use. This preset provides high quality while not being unreasonably slow."]}),"\n",(0,r.jsxs)(i.p,{children:["The exception where you may want to tax your CPU by going to ",(0,r.jsx)(i.code,{children:"--preset veryslow"})," is when doing lower bitrate encodes (e.g. crf >=22). This is because the ",(0,r.jsx)(i.code,{children:"veryslow"})," preset provides\nbetter motion estimation at low bitrates. However, it is exceptionally slow, so it is not generally recommended for everyday use."]}),"\n",(0,r.jsx)(i.h3,{id:"crf",children:"CRF"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"--crf"})}),"\n",(0,r.jsx)(i.p,{children:"CRF, standing for Constant Rate Factor, is a method for selecting a level of quality-to-filesize tradeoff. CRF is preferable to bitrate targeting because CRF only requires one encoding pass,\nso bitrate targeting should only be used if you need to target a specific filesize. Nowadays, those situations are uncommon and it is preferred to use CRF to target a quality level.\nCRF is preferable to QP because CRF allows the encoder to vary the quality level from frame to frame for better viewing quality in areas of the video that need it the most."}),"\n",(0,r.jsx)(i.p,{children:'What CRF to use will vary depending on your goals. The range of valid CRF values is 0-51, with larger values providing smaller filesize but lower quality. Some amount of experimentation\nmay be needed to find the value you prefer. A decent "balanced" target will be around 17 or 18, providing good quality without inflating filesize too much. For a focus on maximum quality,\na value of 12 or 13 will result in visually lossless output for most videos, but will result in a much larger filesize. For miniature encodes, try raising the CRF as much as you feel comfortable\nbefore the quality becomes unbearable. CRFs of 22 or higher are generally considered "low bitrate", so how high you raise the CRF depends on how low of a filesize you are trying to achieve.'}),"\n",(0,r.jsx)(i.h3,{id:"bframes",children:"bframes"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"--bframes"})}),"\n",(0,r.jsxs)(i.p,{children:["B-frames are bi-directional predictive frames, this means that they can reference frames both before and after themselves, which makes them very efficient.\nThe ",(0,r.jsx)(i.code,{children:"--bframes"})," parameter controls how many B-frames can be used consecutively. Higher values can result in better compression, but this value has diminishing returns,\nas the encoder won't use extra B-frames in situations where it would reduce efficiency."]}),"\n",(0,r.jsxs)(i.p,{children:["The default value at preset slow is ",(0,r.jsx)(i.code,{children:"4"}),". It is recommended to increase this to ",(0,r.jsx)(i.code,{children:"--bframes 5"})," for live action and CGI content, or ",(0,r.jsx)(i.code,{children:"--bframes 8"})," for anime and cartoons.\nContent with little motion benefits more from high B-frames values, but even on anime where there are many still scenes, there is no measurable benefit\nto using a value higher than ",(0,r.jsx)(i.code,{children:"8"}),", and it would just slow down the encoder for no benefit."]}),"\n",(0,r.jsx)(i.h3,{id:"sao",children:"SAO"}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"--sao"}),", ",(0,r.jsx)(i.code,{children:"--limit-sao"}),", ",(0,r.jsx)(i.code,{children:"--no-sao"})]}),"\n",(0,r.jsxs)(i.p,{children:["SAO stands for Sample Adaptive Offset, and is a loop filter used by x265 to prevent artifacting. However, it has the side effect of losing sharpness on details.\nIt is recommended to leave this on (default) at high CRF values (>=22). For medium values between 17-21, you can use ",(0,r.jsx)(i.code,{children:"--limit-sao"})," which will limit the effects of SAO to have\nless of a significant effect. For low CRF values (<=16), you can safely use ",(0,r.jsx)(i.code,{children:"--no-sao"})," to prefer detail preservation, as the higher bitrates will naturally lead to fewer artifacts."]}),"\n",(0,r.jsx)(i.h3,{id:"deblock",children:"Deblock"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"--deblock"})}),"\n",(0,r.jsxs)(i.p,{children:["Deblock is another loop filter, this one intended to reduce blocking in videos, but may have a blurring effect at high strengths. For most encodes, it is fine to leave this\nat the default value. At lower CRF values, it may be desirable to lower this to ",(0,r.jsx)(i.code,{children:"--deblock -1:-1"})," for anime or ",(0,r.jsx)(i.code,{children:"--deblock -2:-2"})," for live action, in order to preserve\nmore grain and detail."]}),"\n",(0,r.jsx)(i.h3,{id:"psy-rd",children:"Psy-RD"}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"--psy-rd"})," and ",(0,r.jsx)(i.code,{children:"--psy-rdoq"})]}),"\n",(0,r.jsx)(i.p,{children:"The parameters control psychovisual rate distribution. What this means is the redistribution of bits to make a video more pleasing to human eyes. These options may be harmful to metrics\nthat compare videos mathematically, but are better for viewing human eyes because they prioritize facets of the video that humans prefer."}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"--psy-rd"})," biases toward matching the level of energy in the source image, which makes it good for retaining detail. For standard anime, it is recommended to use ",(0,r.jsx)(i.code,{children:"--psy-rd 1.0"}),". The more\ngrain, detail, and dark scenes in a source, the higher this should be raised. Many modern anime tends to have more detailed backgrounds and surfaces, so ",(0,r.jsx)(i.code,{children:"--psy-rd 1.5"})," may be a better\ndefault for modern anime. For live action, a ",(0,r.jsx)(i.code,{children:"--psy-rd 1.5"})," or possibly even ",(0,r.jsx)(i.code,{children:"2.0"})," may be preferred, as live action naturally has more detail and grain than anime."]}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.code,{children:"--psy-rdoq"})," biases toward energy in general, which makes it key for preserving grain. ",(0,r.jsx)(i.code,{children:"--psy-rdoq 1.0"})," is a safe default for anime. Like psy-rd, this value should be increased more\nfor sources with more grain. For grainy anime, ",(0,r.jsx)(i.code,{children:"--psy-rdoq 2.0"})," or even ",(0,r.jsx)(i.code,{children:"3.0"})," can be preferable. Likewise, for many live action series, a default of ",(0,r.jsx)(i.code,{children:"--psy-rdoq 3.0"})," can be preferable,\nor even ",(0,r.jsx)(i.code,{children:"4.0"})," with heavy grain."]}),"\n",(0,r.jsx)(i.p,{children:"These are two settings that should be tweaked according to the source material."}),"\n",(0,r.jsx)(i.h3,{id:"adaptive-quantization",children:"Adaptive Quantization"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"--aq-mode 3 --aq-strength "})}),"\n",(0,r.jsxs)(i.p,{children:["Adaptive quantization, shortened to AQ, is a mechanism to redistribute bitrate within a frame to improve visual quality by reducing artifacts.\nx265 has several different AQ modes, and ",(0,r.jsx)(i.code,{children:"--aq-mode 3"})," is nearly always best, because this mode adds a bias favoring dark scenes, which greatly reduces the effects of banding and blocking.\nThe strength of AQ can also be set with ",(0,r.jsx)(i.code,{children:"--aq-strength"}),". The optimal setting for this may vary depending on the type of content you are encoding.\nFor anime, ",(0,r.jsx)(i.code,{children:"--aq-strength 0.7"})," will typically produce good results. For live action, a slightly higher ",(0,r.jsx)(i.code,{children:"0.8"})," may be a better default.\nHigher values, up to ",(0,r.jsx)(i.code,{children:"--aq-strength 1"}),", can be helpful for sources with heavy grain, although this will also increase overall bitrate."]}),"\n",(0,r.jsx)(i.h3,{id:"cu-tree",children:"CU-Tree"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.code,{children:"--no-cutree"})}),"\n",(0,r.jsxs)(i.p,{children:["CU-Tree is a mechanism very similar to MB-Tree in x264, which is intended to redistribute bitrate in a more optimal psychovisual manner. However, many people find CU-Tree to be harmful to quality,\nespecially when attempting to encode videos with considerable amounts of grain, and therefore many people recommend disabling this with ",(0,r.jsx)(i.code,{children:"--no-cutree"}),"."]})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>a});var t=n(6540);const r={},s=t.createContext(r);function o(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b0535000.242a35de.js b/assets/js/b0535000.242a35de.js new file mode 100644 index 000000000..52c46bdf5 --- /dev/null +++ b/assets/js/b0535000.242a35de.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7238],{851:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>g,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var o=i(3107),n=i(4848),a=i(8453);const s={title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},r=void 0,l={authorsImageUrls:[void 0]},c=[];function u(e){const t={p:"p",...(0,a.R)(),...e.components};return(0,n.jsx)(t.p,{children:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics."})}function g(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>r});var o=i(6540);const n={},a=o.createContext(n);function s(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),o.createElement(a.Provider,{value:t},e.children)}},3107:e=>{e.exports=JSON.parse('{"permalink":"/blog/site-optimization","source":"@site/blog/2023-07-21-site-optimization.mdx","title":"Reducing Image Load Online","description":"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.","date":"2023-07-21T00:00:00.000Z","tags":[{"inline":true,"label":"image","permalink":"/blog/tags/image"},{"inline":true,"label":"web","permalink":"/blog/tags/web"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"}],"readingTime":9.25,"hasTruncateMarker":true,"authors":[{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Reducing Image Load Online","description":"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.","slug":"site-optimization","authors":[{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"}],"tags":["image","web","compression"],"image":"/img/_DSC8466-smaller.jpg","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies"}}')}}]); \ No newline at end of file diff --git a/assets/js/b0535000.5c531d67.js b/assets/js/b0535000.5c531d67.js deleted file mode 100644 index 57edaa29c..000000000 --- a/assets/js/b0535000.5c531d67.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7238],{851:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var o=i(4848),n=i(8453);const a={title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},s=void 0,r={permalink:"/blog/site-optimization",source:"@site/blog/2023-07-21-site-optimization.mdx",title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",date:"2023-07-21T00:00:00.000Z",tags:[{inline:!0,label:"image",permalink:"/blog/tags/image"},{inline:!0,label:"web",permalink:"/blog/tags/web"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"}],readingTime:9.25,hasTruncateMarker:!0,authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4",key:null,page:null}],frontMatter:{title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},l={authorsImageUrls:[void 0]},c=[];function g(e){const t={p:"p",...(0,n.R)(),...e.components};return(0,o.jsx)(t.p,{children:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics."})}function u(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(g,{...e})}):g(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>r});var o=i(6540);const n={},a=o.createContext(n);function s(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b0839e7f.4fcf9a59.js b/assets/js/b0839e7f.4fcf9a59.js new file mode 100644 index 000000000..32e76aea5 --- /dev/null +++ b/assets/js/b0839e7f.4fcf9a59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9631],{1165:(e,t,i)=>{i.d(t,{Ck:()=>u,kS:()=>p});var s=i(4848),o=i(8453),n=i(6540),a=i(4016),r=i(3517),c=i(3343),l=i(3864),d=i(8633),h=i(363);const u=({imageData:e,pixelsAbove:t,pixelsBelow:i})=>{const n={div:"div",...(0,o.R)()},l=({currentSlide:e,direction:t,slideCount:i,...o})=>"left"===t?(0,s.jsx)(d.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,s.jsx)(h.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(a.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(n.div,{style:{height:`${t}px`}}),(0,s.jsx)(r.A,{arrows:!0,prevArrow:(0,s.jsx)(l,{direction:"left"}),nextArrow:(0,s.jsx)(l,{direction:"right"}),children:e.map((e=>(0,s.jsx)(c.A,{src:e.src},e.src)))}),(0,s.jsx)(n.div,{style:{height:`${i}px`}})]})},p=({tabMap:e,pixelsAbove:t,pixelsBelow:i})=>{const r={div:"div",...(0,o.R)()},[c,d]=(0,n.useState)(Object.keys(e)[0]);return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(a.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(r.div,{style:{height:`${t}px`}}),(0,s.jsx)(l.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:c,onTabChange:e=>{d(e)},children:e[c].component}),(0,s.jsx)(r.div,{style:{height:`${i}px`}})]})}},5568:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var s=i(3788),o=i(4848),n=i(8453);i(1165);const a={title:"Better late than never: SVT-AV1 v2.2.x Deep Dive",description:"How does SVT-AV1 2.2.x stack up against the encoder previous version?",slug:"svt-av1-third-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.2.x-testing-blog-image.webp",hide_table_of_contents:!1},r="Introduction",c={authorsImageUrls:[void 0]},l=[];function d(e){const t={p:"p",...(0,n.R)(),...e.components};return(0,o.jsx)(t.p,{children:"SVT-AV1 v2.2.0 was released in late August and a minor version v2.2.1 followed suit to adress some bugs. This blog post will focus on comparing this new encoder version to the last, on the basis of benchmarks and visual comparisons. We will quantify the new trade-offs between compression efficiency and encoding speed, so you can choose the right balance for your projects. Our metrics of choice today will be SSIMULACRA2 and XPSNR, used in conjonction with a revised methodology."})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},3788:e=>{e.exports=JSON.parse('{"permalink":"/blog/svt-av1-third-deep-dive","source":"@site/blog/2024-11-14-svt-av1-deep-dive3-v2-2-x.mdx","title":"Better late than never: SVT-AV1 v2.2.x Deep Dive","description":"How does SVT-AV1 2.2.x stack up against the encoder previous version?","date":"2024-11-14T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"},{"inline":true,"label":"benchmarks","permalink":"/blog/tags/benchmarks"}],"readingTime":77.835,"hasTruncateMarker":true,"authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Better late than never: SVT-AV1 v2.2.x Deep Dive","description":"How does SVT-AV1 2.2.x stack up against the encoder previous version?","slug":"svt-av1-third-deep-dive","authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043"}],"tags":["video","compression","benchmarks"],"image":"/img/svt-2.2.x-testing-blog-image.webp","hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Codec Wiki: One Year Later","permalink":"/blog/codec-wiki-one-year-later"}}')}}]); \ No newline at end of file diff --git a/assets/js/b261517a.eec96f03.js b/assets/js/b261517a.eec96f03.js deleted file mode 100644 index bf16a57ca..000000000 --- a/assets/js/b261517a.eec96f03.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1454],{1165:(e,t,i)=>{i.d(t,{Ck:()=>m,kS:()=>v});var s=i(4848),o=i(8453),n=i(6540),a=i(4016),r=i(3517),l=i(3343),c=i(3864),d=i(8633),p=i(363);const m=({imageData:e,pixelsAbove:t,pixelsBelow:i})=>{const n={div:"div",...(0,o.R)()},c=({currentSlide:e,direction:t,slideCount:i,...o})=>"left"===t?(0,s.jsx)(d.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,s.jsx)(p.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(a.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(n.div,{style:{height:`${t}px`}}),(0,s.jsx)(r.A,{arrows:!0,prevArrow:(0,s.jsx)(c,{direction:"left"}),nextArrow:(0,s.jsx)(c,{direction:"right"}),children:e.map((e=>(0,s.jsx)(l.A,{src:e.src},e.src)))}),(0,s.jsx)(n.div,{style:{height:`${i}px`}})]})},v=({tabMap:e,pixelsAbove:t,pixelsBelow:i})=>{const r={div:"div",...(0,o.R)()},[l,d]=(0,n.useState)(Object.keys(e)[0]);return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(a.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(r.div,{style:{height:`${t}px`}}),(0,s.jsx)(c.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:l,onTabChange:e=>{d(e)},children:e[l].component}),(0,s.jsx)(r.div,{style:{height:`${i}px`}})]})}},3012:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>n,metadata:()=>r,toc:()=>c});var s=i(4848),o=i(8453);i(1165);const n={title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},a="Introduction",r={permalink:"/blog/svt-av1-second-deep-dive",source:"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx",title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",date:"2024-05-19T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"},{inline:!0,label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:35.215,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043",key:null,page:null}],frontMatter:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"AV1 for Dummies",permalink:"/blog/av1-for-dummies"},nextItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"}},l={authorsImageUrls:[void 0]},c=[];function d(e){const t={p:"p",...(0,o.R)(),...e.components};return(0,s.jsx)(t.p,{children:"SVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips."})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/b261517a.f7731431.js b/assets/js/b261517a.f7731431.js new file mode 100644 index 000000000..fb615ef02 --- /dev/null +++ b/assets/js/b261517a.f7731431.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1454],{1165:(e,t,i)=>{i.d(t,{Ck:()=>m,kS:()=>v});var s=i(4848),o=i(8453),a=i(6540),r=i(4016),n=i(3517),l=i(3343),c=i(3864),d=i(8633),p=i(363);const m=({imageData:e,pixelsAbove:t,pixelsBelow:i})=>{const a={div:"div",...(0,o.R)()},c=({currentSlide:e,direction:t,slideCount:i,...o})=>"left"===t?(0,s.jsx)(d.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,s.jsx)(p.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(a.div,{style:{height:`${t}px`}}),(0,s.jsx)(n.A,{arrows:!0,prevArrow:(0,s.jsx)(c,{direction:"left"}),nextArrow:(0,s.jsx)(c,{direction:"right"}),children:e.map((e=>(0,s.jsx)(l.A,{src:e.src},e.src)))}),(0,s.jsx)(a.div,{style:{height:`${i}px`}})]})},v=({tabMap:e,pixelsAbove:t,pixelsBelow:i})=>{const n={div:"div",...(0,o.R)()},[l,d]=(0,a.useState)(Object.keys(e)[0]);return(!t||t<0)&&(t=0),(!i||i<0)&&(i=0),(0,s.jsxs)(r.A,{justify:"space-between",vertical:!0,children:[(0,s.jsx)(n.div,{style:{height:`${t}px`}}),(0,s.jsx)(c.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:l,onTabChange:e=>{d(e)},children:e[l].component}),(0,s.jsx)(n.div,{style:{height:`${i}px`}})]})}},3012:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>n,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var s=i(3165),o=i(4848),a=i(8453);i(1165);const r={title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},n="Introduction",l={authorsImageUrls:[void 0]},c=[];function d(e){const t={p:"p",...(0,a.R)(),...e.components};return(0,o.jsx)(t.p,{children:"SVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips."})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},3165:e=>{e.exports=JSON.parse('{"permalink":"/blog/svt-av1-second-deep-dive","source":"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx","title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","description":"SVT-AV1 2.1.0 just released, how does it compare to the previous version?","date":"2024-05-19T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"},{"inline":true,"label":"benchmarks","permalink":"/blog/tags/benchmarks"}],"readingTime":35.215,"hasTruncateMarker":true,"authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","description":"SVT-AV1 2.1.0 just released, how does it compare to the previous version?","slug":"svt-av1-second-deep-dive","authors":[{"name":"Trix","title":"Encoder","url":"https://github.com/trixoniisama/","image_url":"https://avatars.githubusercontent.com/u/93526043","imageURL":"https://avatars.githubusercontent.com/u/93526043"}],"tags":["video","compression","benchmarks"],"image":"/img/svt-2.1.0-testing-blog-image.webp","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"AV1 for Dummies","permalink":"/blog/av1-for-dummies"},"nextItem":{"title":"Encoding Animation with SVT-AV1: A Deep Dive","permalink":"/blog/svt-av1-deep-dive"}}')}}]); \ No newline at end of file diff --git a/assets/js/b4030b4d.7c070528.js b/assets/js/b4030b4d.7c070528.js new file mode 100644 index 000000000..fc0617363 --- /dev/null +++ b/assets/js/b4030b4d.7c070528.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3408],{6528:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"utilities/Aviator","title":"Aviator","description":"Aviator is a GUI application designed for encoding AV1 video & Opus audio with SVT-AV1, libopus, & ffmpeg on Linux systems in a user-friendly, intuitive manner. Aviator\'s primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder.","source":"@site/docs/utilities/Aviator.mdx","sourceDirName":"utilities","slug":"/utilities/Aviator","permalink":"/docs/utilities/Aviator","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Aviator.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Aviator","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Matrix Coefficients","permalink":"/docs/colorimetry/matrix"},"next":{"title":"Av1an","permalink":"/docs/utilities/av1an"}}');var o=a(4848),n=a(8453),s=a(1470),r=a(9365);const l={title:"Aviator",sidebar_position:1},u="Aviator",c={},d=[{value:"Installation",id:"installation",level:2},{value:"Aviator's Defaults",id:"aviators-defaults",level:2},{value:"Perceptual Optimization",id:"perceptual-optimization",level:3},{value:"Video",id:"video",level:3},{value:"Audio",id:"audio",level:3},{value:"Output",id:"output",level:3},{value:"Credits",id:"credits",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"aviator",children:"Aviator"})}),"\n",(0,o.jsxs)(t.p,{children:["Aviator is a GUI application designed for encoding ",(0,o.jsx)(t.a,{href:"/docs/video/AV1",children:"AV1"})," video & Opus audio with ",(0,o.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,o.jsx)(t.a,{href:"/docs/audio/Opus",children:"libopus"}),", & ",(0,o.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"ffmpeg"})," on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder."]}),"\n",(0,o.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_splash2.avif",alt:"Aviator Splash"}),"\n",(0,o.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(r.A,{value:"unixlike",label:"Linux",children:[(0,o.jsxs)(t.p,{children:["Aviator is available on Linux through Flathub as a Flatpak. You can learn how to set up Flatpak on your distro of choice ",(0,o.jsx)(t.a,{href:"https://flatpak.org/setup/",children:"here"}),". Please do not use Aviator through the AUR."]}),(0,o.jsx)("a",{href:"https://flathub.org/apps/details/net.natesales.Aviator",children:(0,o.jsx)("img",{width:"200",alt:"Download on Flathub",src:"https://flathub.org/assets/badges/flathub-badge-en.png"})}),(0,o.jsx)(t.p,{children:"If Flatpak is already set up and you'd prefer to install Aviator from the terminal, you can run the following commmand:"}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"flatpak install flathub net.natesales.Aviator\n"})}),(0,o.jsx)(t.p,{children:"Flatpak was chosen for Aviator because it allows Aviator to ship its own sandboxed dependencies, ensuring every Linux user has a cohesive experience. One major benefit is the latest stable SVT-AV1-PSY implementation is always included, and Flatpak Aviator won't use your system's SVT-AV1 implementation which may be incompatible with Aviator's custom parameters."}),(0,o.jsxs)(t.p,{children:["If you would like to build Aviator from source, you may do so via the following commands. Ensure you have the right dependencies; if not, ",(0,o.jsx)(t.code,{children:"make"})," will warn you and you can install them as you see what you're missing."]}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/gianni-rosato/aviator\ncd aviator\nmake\n"})})]}),(0,o.jsxs)(r.A,{value:"windows",label:"Windows",children:[(0,o.jsx)(t.admonition,{title:"Partial Support",type:"caution",children:(0,o.jsxs)(t.p,{children:['Windows support is provided on a "best-effort" basis via ',(0,o.jsx)(t.strong,{children:"WSL2"}),". Compatibility hiccups will almost certainly be encountered should you decide to run Aviator on Windows."]})}),(0,o.jsxs)(t.p,{children:['Aviator is supported on a "best-effort" basis on Windows via WSL2. In order to set up a WSL2 Arch Linux environment, see the ',(0,o.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli#windows",children:"rAV1ator CLI"})," WSL2 tutorial for Windows 11."]}),(0,o.jsxs)(t.p,{children:["Once WSL2 is set up, install Flatpak in your Linux environment by follwing the steps below. ",(0,o.jsxs)(t.strong,{children:["Always be careful when running commands with ",(0,o.jsx)(t.code,{children:"sudo"})," copied from the Internet, including the commands below."]})]}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"sudo pacman -Syu # Update your system\nsudo pacman -S flatpak # Install flatpak\nsudo systemctl enable --now dbus # Start dbus\nflatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo # Add flathub repo if it hasn't already been added\n"})}),(0,o.jsxs)(t.p,{children:["Finally, you can verify that Flatpak has actually been installed by running ",(0,o.jsx)(t.code,{children:"flatpak --version"})," and checking that the version string is valid."]}),(0,o.jsx)(t.p,{children:"Now, Aviator requires a couple of special Flatpak dependencies most commonly found on GNOME Linux distros."}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install org.gnome.Sdk # Select option 15\nsudo flatpak install org.gnome.Platform # Select option 14\n"})}),(0,o.jsx)(t.p,{children:"Finally, you can install Aviator."}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install flathub net.natesales.Aviator\n"})}),(0,o.jsx)(t.p,{children:"You can run Aviator by executing the following command:"}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"flatpak run net.natesales.Aviator\n"})}),(0,o.jsx)(t.p,{children:"Now, you should be all set! Happy encoding!"})]})]}),"\n",(0,o.jsx)(t.h2,{id:"aviators-defaults",children:"Aviator's Defaults"}),"\n",(0,o.jsx)(t.p,{children:"Hovering over most user configurable options in Aviator will produce a helpful tooltip that you can look at to make things more clear."}),"\n",(0,o.jsx)(t.h3,{id:"perceptual-optimization",children:"Perceptual Optimization"}),"\n",(0,o.jsxs)(t.p,{children:["Aviator doesn't use mainline SVT-AV1, but rather uses ",(0,o.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"a fork"})," dubbed SVT-AV1-PSY maintained for perceptual quality. It includes several unique changes, including a custom ",(0,o.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"}),"-based ",(0,o.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"})," tune that isn't included in mainline SVT-AV1. You can read more about SVT-AV1-PSY on the ",(0,o.jsx)(t.a,{href:"/docs/encoders/SVT-AV1#community-forks",children:"SVT-AV1"})," entry."]}),"\n",(0,o.jsx)(t.p,{children:"Aviator's default FFmpeg command uses the following encoding parameters, some of which are redundant with defaults:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"-c:v libsvtav1 -crf X -preset X -pix_fmt yuv420p10le -svtav1-params film-grain=X:irefresh-type=2:input-depth=10:tune=3:sharpness=1:qm-min=0:keyint=300:aq-mode=2:enable-qm=1:film-grain-denoise=X\n"})}),"\n",(0,o.jsx)(t.h3,{id:"video",children:"Video"}),"\n",(0,o.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_video.webp",alt:"Aviator Video Settings",loading:"lazy"}),"\n",(0,o.jsxs)(t.p,{children:["By default, output resolution will match your source's resolution. Manually changing one resolution value will automatically calculate the other based on the video's aspect ratio. Aviator's SVT-AV1 speed preset is set to 6 by default, with a CRF (Constant Rate Factor) level of 32. You can set CRF from 0 to 63 using the slider, with larger numerical values indicating smaller filesize at the expense of visual quality. You can look at the detailed specifications behind each speed preset ",(0,o.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#what-presets-do",children:"here"}),". Speed 7 offers a good balance between speed & compression efficiency at any CRF level."]}),"\n",(0,o.jsx)(t.p,{children:"Setting values that don't correspond with the source video's aspect ratio means the output will either stretch or crop based on if the \"crop\" option is checked."}),"\n",(0,o.jsx)(t.p,{children:"The Grain Synth slider allows you to add artificial grain to your video to mimic its natural grain. This option applies the artificial grain at decode time as a filter, which makes it easier to encode grainy videos at high fidelity. The Denoise switch removes noise from the video before applying artificial grain."}),"\n",(0,o.jsx)(t.h3,{id:"audio",children:"Audio"}),"\n",(0,o.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_audio.webp",alt:"Aviator Audio Settings",loading:"lazy"}),"\n",(0,o.jsx)(t.p,{children:"The default bitrate for Opus audio is 80kb/s. The audio source can be copied to the output media via that \"Copy Audio\" switch, & audio with >2 channels can be downmixed to stereo via the appropriately labelled switch. Volume adjustment & normalization are also offered in this section as well; the Volume slider allows you to increase or decrease the output's volume & is measured in decibels, & negative values decrease the volume. The Normalize toggle allows you to normalize your audio's perceived loudness."}),"\n",(0,o.jsx)(t.p,{children:'The "Copy Audio" switch disables WebM output due to potential compatibility hiccups & overrides every option on the Audio page to keep the source audio untouched. This option, when enabled, ensures the source audio isn\'t reencoded.'}),"\n",(0,o.jsx)(t.p,{children:"The Volume slider allows you to increase or decrease the output's volume. It is measured in decibels, and negative values decrease the volume. The Normalize switch allows you to normalize the audio's perceived loudness."}),"\n",(0,o.jsx)(t.h3,{id:"output",children:"Output"}),"\n",(0,o.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_output.webp",alt:"Aviator Output UI",loading:"lazy"}),"\n",(0,o.jsxs)(t.p,{children:["The container your video is stored in is associated with the file extension. Aviator offers two options for video output: the ",(0,o.jsx)(t.a,{href:"/docs/introduction/terminology#mkv--mka--mks--mk3d",children:"Matroska"})," video container & the ",(0,o.jsx)(t.a,{href:"/docs/introduction/terminology#webm",children:"WebM"})," container. The open-source Matroska container (.MKV) is used by default in Aviator & is a universal multimedia container with broad video & audio support. WebM is designed for web compatibility. Aviator won't copy subtitles to WebM outputs because WebM is only officially compatible with ",(0,o.jsx)(t.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," subtitles. Both containers work out of the box with Aviator's AV1 video & Opus audio, but WebM output will be disabled if the Copy Audio switch is enabled because then we lose this format compliance assurance."]}),"\n",(0,o.jsx)(t.h2,{id:"credits",children:"Credits"}),"\n",(0,o.jsxs)(t.p,{children:["Aviator is actively developed by ",(0,o.jsx)(t.a,{href:"https://github.com/gianni-rosato/",children:"Gianni Rosato"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},9365:(e,t,a)=>{a.d(t,{A:()=>s});a(6540);var i=a(4164);const o={tabItem:"tabItem_Ymn6"};var n=a(4848);function s(e){let{children:t,hidden:a,className:s}=e;return(0,n.jsx)("div",{role:"tabpanel",className:(0,i.A)(o.tabItem,s),hidden:a,children:t})}},1470:(e,t,a)=>{a.d(t,{A:()=>A});var i=a(6540),o=a(4164),n=a(3104),s=a(6347),r=a(205),l=a(7485),u=a(1682),c=a(679);function d(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:a}=e;return(0,i.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:a,attributes:i,default:o}}=e;return{value:t,label:a,attributes:i,default:o}}))}(a);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function p(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const o=(0,s.W6)(),n=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,l.aZ)(n),(0,i.useCallback)((e=>{if(!n)return;const t=new URLSearchParams(o.location.search);t.set(n,e),o.replace({...o.location,search:t.toString()})}),[n,o])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:o}=e,n=h(e),[s,l]=(0,i.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const i=a.find((e=>e.default))??a[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:t,tabValues:n}))),[u,d]=m({queryString:a,groupId:o}),[f,v]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[o,n]=(0,c.Dv)(a);return[o,(0,i.useCallback)((e=>{a&&n.set(e)}),[a,n])]}({groupId:o}),b=(()=>{const e=u??f;return p({value:e,tabValues:n})?e:null})();(0,r.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,i.useCallback)((e=>{if(!p({value:e,tabValues:n}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),v(e)}),[d,v,n]),tabValues:n}}var v=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=a(4848);function x(e){let{className:t,block:a,selectedValue:i,selectValue:s,tabValues:r}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,n.a_)(),c=e=>{const t=e.currentTarget,a=l.indexOf(t),o=r[a].value;o!==i&&(u(t),s(o))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=l.indexOf(e.currentTarget)+1;t=l[a]??l[0];break}case"ArrowLeft":{const a=l.indexOf(e.currentTarget)-1;t=l[a]??l[l.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":a},t),children:r.map((e=>{let{value:t,label:a,attributes:n}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,ref:e=>l.push(e),onKeyDown:d,onClick:c,...n,className:(0,o.A)("tabs__item",b.tabItem,n?.className,{"tabs__item--active":i===t}),children:a??t},t)}))})}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const s=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===n));return e?(0,i.cloneElement)(e,{className:(0,o.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,i.cloneElement)(e,{key:t,hidden:e.props.value!==n})))})}function w(e){const t=f(e);return(0,g.jsxs)("div",{className:(0,o.A)("tabs-container",b.tabList),children:[(0,g.jsx)(x,{...t,...e}),(0,g.jsx)(y,{...t,...e})]})}function A(e){const t=(0,v.A)();return(0,g.jsx)(w,{...e,children:d(e.children)},String(t))}},8453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>r});var i=a(6540);const o={},n=i.createContext(o);function s(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4030b4d.d3034021.js b/assets/js/b4030b4d.d3034021.js deleted file mode 100644 index cd73aee6d..000000000 --- a/assets/js/b4030b4d.d3034021.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3408],{6856:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>u,toc:()=>d});var i=a(4848),o=a(8453),n=a(1470),s=a(9365);const r={title:"Aviator",sidebar_position:1},l="Aviator",u={id:"utilities/Aviator",title:"Aviator",description:"Aviator is a GUI application designed for encoding AV1 video & Opus audio with SVT-AV1, libopus, & ffmpeg on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder.",source:"@site/docs/utilities/Aviator.mdx",sourceDirName:"utilities",slug:"/utilities/Aviator",permalink:"/docs/utilities/Aviator",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Aviator.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Aviator",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Matrix Coefficients",permalink:"/docs/colorimetry/matrix"},next:{title:"Av1an",permalink:"/docs/utilities/av1an"}},c={},d=[{value:"Installation",id:"installation",level:2},{value:"Aviator's Defaults",id:"aviators-defaults",level:2},{value:"Perceptual Optimization",id:"perceptual-optimization",level:3},{value:"Video",id:"video",level:3},{value:"Audio",id:"audio",level:3},{value:"Output",id:"output",level:3},{value:"Credits",id:"credits",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"aviator",children:"Aviator"})}),"\n",(0,i.jsxs)(t.p,{children:["Aviator is a GUI application designed for encoding ",(0,i.jsx)(t.a,{href:"/docs/video/AV1",children:"AV1"})," video & Opus audio with ",(0,i.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,i.jsx)(t.a,{href:"/docs/audio/Opus",children:"libopus"}),", & ",(0,i.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"ffmpeg"})," on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder."]}),"\n",(0,i.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_splash2.avif",alt:"Aviator Splash"}),"\n",(0,i.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(n.A,{children:[(0,i.jsxs)(s.A,{value:"unixlike",label:"Linux",children:[(0,i.jsxs)(t.p,{children:["Aviator is available on Linux through Flathub as a Flatpak. You can learn how to set up Flatpak on your distro of choice ",(0,i.jsx)(t.a,{href:"https://flatpak.org/setup/",children:"here"}),". Please do not use Aviator through the AUR."]}),(0,i.jsx)("a",{href:"https://flathub.org/apps/details/net.natesales.Aviator",children:(0,i.jsx)("img",{width:"200",alt:"Download on Flathub",src:"https://flathub.org/assets/badges/flathub-badge-en.png"})}),(0,i.jsx)(t.p,{children:"If Flatpak is already set up and you'd prefer to install Aviator from the terminal, you can run the following commmand:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"flatpak install flathub net.natesales.Aviator\n"})}),(0,i.jsx)(t.p,{children:"Flatpak was chosen for Aviator because it allows Aviator to ship its own sandboxed dependencies, ensuring every Linux user has a cohesive experience. One major benefit is the latest stable SVT-AV1-PSY implementation is always included, and Flatpak Aviator won't use your system's SVT-AV1 implementation which may be incompatible with Aviator's custom parameters."}),(0,i.jsxs)(t.p,{children:["If you would like to build Aviator from source, you may do so via the following commands. Ensure you have the right dependencies; if not, ",(0,i.jsx)(t.code,{children:"make"})," will warn you and you can install them as you see what you're missing."]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/gianni-rosato/aviator\ncd aviator\nmake\n"})})]}),(0,i.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,i.jsx)(t.admonition,{title:"Partial Support",type:"caution",children:(0,i.jsxs)(t.p,{children:['Windows support is provided on a "best-effort" basis via ',(0,i.jsx)(t.strong,{children:"WSL2"}),". Compatibility hiccups will almost certainly be encountered should you decide to run Aviator on Windows."]})}),(0,i.jsxs)(t.p,{children:['Aviator is supported on a "best-effort" basis on Windows via WSL2. In order to set up a WSL2 Arch Linux environment, see the ',(0,i.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli#windows",children:"rAV1ator CLI"})," WSL2 tutorial for Windows 11."]}),(0,i.jsxs)(t.p,{children:["Once WSL2 is set up, install Flatpak in your Linux environment by follwing the steps below. ",(0,i.jsxs)(t.strong,{children:["Always be careful when running commands with ",(0,i.jsx)(t.code,{children:"sudo"})," copied from the Internet, including the commands below."]})]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"sudo pacman -Syu # Update your system\nsudo pacman -S flatpak # Install flatpak\nsudo systemctl enable --now dbus # Start dbus\nflatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo # Add flathub repo if it hasn't already been added\n"})}),(0,i.jsxs)(t.p,{children:["Finally, you can verify that Flatpak has actually been installed by running ",(0,i.jsx)(t.code,{children:"flatpak --version"})," and checking that the version string is valid."]}),(0,i.jsx)(t.p,{children:"Now, Aviator requires a couple of special Flatpak dependencies most commonly found on GNOME Linux distros."}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install org.gnome.Sdk # Select option 15\nsudo flatpak install org.gnome.Platform # Select option 14\n"})}),(0,i.jsx)(t.p,{children:"Finally, you can install Aviator."}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install flathub net.natesales.Aviator\n"})}),(0,i.jsx)(t.p,{children:"You can run Aviator by executing the following command:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"flatpak run net.natesales.Aviator\n"})}),(0,i.jsx)(t.p,{children:"Now, you should be all set! Happy encoding!"})]})]}),"\n",(0,i.jsx)(t.h2,{id:"aviators-defaults",children:"Aviator's Defaults"}),"\n",(0,i.jsx)(t.p,{children:"Hovering over most user configurable options in Aviator will produce a helpful tooltip that you can look at to make things more clear."}),"\n",(0,i.jsx)(t.h3,{id:"perceptual-optimization",children:"Perceptual Optimization"}),"\n",(0,i.jsxs)(t.p,{children:["Aviator doesn't use mainline SVT-AV1, but rather uses ",(0,i.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"a fork"})," dubbed SVT-AV1-PSY maintained for perceptual quality. It includes several unique changes, including a custom ",(0,i.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"}),"-based ",(0,i.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"})," tune that isn't included in mainline SVT-AV1. You can read more about SVT-AV1-PSY on the ",(0,i.jsx)(t.a,{href:"/docs/encoders/SVT-AV1#community-forks",children:"SVT-AV1"})," entry."]}),"\n",(0,i.jsx)(t.p,{children:"Aviator's default FFmpeg command uses the following encoding parameters, some of which are redundant with defaults:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"-c:v libsvtav1 -crf X -preset X -pix_fmt yuv420p10le -svtav1-params film-grain=X:irefresh-type=2:input-depth=10:tune=3:sharpness=1:qm-min=0:keyint=300:aq-mode=2:enable-qm=1:film-grain-denoise=X\n"})}),"\n",(0,i.jsx)(t.h3,{id:"video",children:"Video"}),"\n",(0,i.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_video.webp",alt:"Aviator Video Settings",loading:"lazy"}),"\n",(0,i.jsxs)(t.p,{children:["By default, output resolution will match your source's resolution. Manually changing one resolution value will automatically calculate the other based on the video's aspect ratio. Aviator's SVT-AV1 speed preset is set to 6 by default, with a CRF (Constant Rate Factor) level of 32. You can set CRF from 0 to 63 using the slider, with larger numerical values indicating smaller filesize at the expense of visual quality. You can look at the detailed specifications behind each speed preset ",(0,i.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#what-presets-do",children:"here"}),". Speed 7 offers a good balance between speed & compression efficiency at any CRF level."]}),"\n",(0,i.jsx)(t.p,{children:"Setting values that don't correspond with the source video's aspect ratio means the output will either stretch or crop based on if the \"crop\" option is checked."}),"\n",(0,i.jsx)(t.p,{children:"The Grain Synth slider allows you to add artificial grain to your video to mimic its natural grain. This option applies the artificial grain at decode time as a filter, which makes it easier to encode grainy videos at high fidelity. The Denoise switch removes noise from the video before applying artificial grain."}),"\n",(0,i.jsx)(t.h3,{id:"audio",children:"Audio"}),"\n",(0,i.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_audio.webp",alt:"Aviator Audio Settings",loading:"lazy"}),"\n",(0,i.jsx)(t.p,{children:"The default bitrate for Opus audio is 80kb/s. The audio source can be copied to the output media via that \"Copy Audio\" switch, & audio with >2 channels can be downmixed to stereo via the appropriately labelled switch. Volume adjustment & normalization are also offered in this section as well; the Volume slider allows you to increase or decrease the output's volume & is measured in decibels, & negative values decrease the volume. The Normalize toggle allows you to normalize your audio's perceived loudness."}),"\n",(0,i.jsx)(t.p,{children:'The "Copy Audio" switch disables WebM output due to potential compatibility hiccups & overrides every option on the Audio page to keep the source audio untouched. This option, when enabled, ensures the source audio isn\'t reencoded.'}),"\n",(0,i.jsx)(t.p,{children:"The Volume slider allows you to increase or decrease the output's volume. It is measured in decibels, and negative values decrease the volume. The Normalize switch allows you to normalize the audio's perceived loudness."}),"\n",(0,i.jsx)(t.h3,{id:"output",children:"Output"}),"\n",(0,i.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_output.webp",alt:"Aviator Output UI",loading:"lazy"}),"\n",(0,i.jsxs)(t.p,{children:["The container your video is stored in is associated with the file extension. Aviator offers two options for video output: the ",(0,i.jsx)(t.a,{href:"/docs/introduction/terminology#mkv--mka--mks--mk3d",children:"Matroska"})," video container & the ",(0,i.jsx)(t.a,{href:"/docs/introduction/terminology#webm",children:"WebM"})," container. The open-source Matroska container (.MKV) is used by default in Aviator & is a universal multimedia container with broad video & audio support. WebM is designed for web compatibility. Aviator won't copy subtitles to WebM outputs because WebM is only officially compatible with ",(0,i.jsx)(t.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," subtitles. Both containers work out of the box with Aviator's AV1 video & Opus audio, but WebM output will be disabled if the Copy Audio switch is enabled because then we lose this format compliance assurance."]}),"\n",(0,i.jsx)(t.h2,{id:"credits",children:"Credits"}),"\n",(0,i.jsxs)(t.p,{children:["Aviator is actively developed by ",(0,i.jsx)(t.a,{href:"https://github.com/gianni-rosato/",children:"Gianni Rosato"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},9365:(e,t,a)=>{a.d(t,{A:()=>s});a(6540);var i=a(4164);const o={tabItem:"tabItem_Ymn6"};var n=a(4848);function s(e){let{children:t,hidden:a,className:s}=e;return(0,n.jsx)("div",{role:"tabpanel",className:(0,i.A)(o.tabItem,s),hidden:a,children:t})}},1470:(e,t,a)=>{a.d(t,{A:()=>A});var i=a(6540),o=a(4164),n=a(3104),s=a(6347),r=a(205),l=a(7485),u=a(1682),c=a(679);function d(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:a}=e;return(0,i.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:a,attributes:i,default:o}}=e;return{value:t,label:a,attributes:i,default:o}}))}(a);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function p(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const o=(0,s.W6)(),n=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,l.aZ)(n),(0,i.useCallback)((e=>{if(!n)return;const t=new URLSearchParams(o.location.search);t.set(n,e),o.replace({...o.location,search:t.toString()})}),[n,o])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:o}=e,n=h(e),[s,l]=(0,i.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const i=a.find((e=>e.default))??a[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:t,tabValues:n}))),[u,d]=m({queryString:a,groupId:o}),[f,v]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[o,n]=(0,c.Dv)(a);return[o,(0,i.useCallback)((e=>{a&&n.set(e)}),[a,n])]}({groupId:o}),b=(()=>{const e=u??f;return p({value:e,tabValues:n})?e:null})();(0,r.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,i.useCallback)((e=>{if(!p({value:e,tabValues:n}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),v(e)}),[d,v,n]),tabValues:n}}var v=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=a(4848);function x(e){let{className:t,block:a,selectedValue:i,selectValue:s,tabValues:r}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,n.a_)(),c=e=>{const t=e.currentTarget,a=l.indexOf(t),o=r[a].value;o!==i&&(u(t),s(o))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=l.indexOf(e.currentTarget)+1;t=l[a]??l[0];break}case"ArrowLeft":{const a=l.indexOf(e.currentTarget)-1;t=l[a]??l[l.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":a},t),children:r.map((e=>{let{value:t,label:a,attributes:n}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,ref:e=>l.push(e),onKeyDown:d,onClick:c,...n,className:(0,o.A)("tabs__item",b.tabItem,n?.className,{"tabs__item--active":i===t}),children:a??t},t)}))})}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const s=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===n));return e?(0,i.cloneElement)(e,{className:(0,o.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,i.cloneElement)(e,{key:t,hidden:e.props.value!==n})))})}function w(e){const t=f(e);return(0,g.jsxs)("div",{className:(0,o.A)("tabs-container",b.tabList),children:[(0,g.jsx)(x,{...t,...e}),(0,g.jsx)(y,{...t,...e})]})}function A(e){const t=(0,v.A)();return(0,g.jsx)(w,{...e,children:d(e.children)},String(t))}},8453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>r});var i=a(6540);const o={},n=i.createContext(o);function s(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4bbde8e.8982fcc9.js b/assets/js/b4bbde8e.8982fcc9.js new file mode 100644 index 000000000..8986a4a46 --- /dev/null +++ b/assets/js/b4bbde8e.8982fcc9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7989],{1660:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"audio/AAC","title":"AAC","description":"Explore the AAC audio codec, including its various profiles, encoders, & use cases.","source":"@site/docs/audio/AAC.mdx","sourceDirName":"audio","slug":"/audio/AAC","permalink":"/docs/audio/AAC","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/AAC.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"AAC","description":"Explore the AAC audio codec, including its various profiles, encoders, & use cases.","keywords":["AAC","Advanced Audio Coding","audio codec","audio","codec","audio encoding","audio decoding","audio compression","audio quality","audio formats","audio file formats","audio file","audio file type","audio file extension","audio file format","audio file types","audio file extensions","audio file formats"],"sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Intro","permalink":"/docs/audio/intro"},"next":{"title":"Opus","permalink":"/docs/audio/Opus"}}');var t=o(4848),a=o(8453);const r={title:"AAC",description:"Explore the AAC audio codec, including its various profiles, encoders, & use cases.",keywords:["AAC","Advanced Audio Coding","audio codec","audio","codec","audio encoding","audio decoding","audio compression","audio quality","audio formats","audio file formats","audio file","audio file type","audio file extension","audio file format","audio file types","audio file extensions","audio file formats"],sidebar_position:2},s="AAC",d={},c=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"AAC-LC",id:"aac-lc",level:3},{value:"AAC-LD & AAC-ELD",id:"aac-ld--aac-eld",level:3},{value:"HE-AAC",id:"he-aac",level:3},{value:"HE-AACv2",id:"he-aacv2",level:3},{value:"xHE-AAC",id:"xhe-aac",level:3},{value:"Encoders",id:"encoders",level:2},{value:"Fraunhofer FDK AAC",id:"fraunhofer-fdk-aac",level:3},{value:"Core Audio",id:"core-audio",level:3},{value:"FFmpeg AAC",id:"ffmpeg-aac",level:3},{value:"FAAC",id:"faac",level:3},{value:"Nero AAC",id:"nero-aac",level:3},{value:"Exhale",id:"exhale",level:3},{value:"Conclusion",id:"conclusion",level:2}];function l(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"aac",children:"AAC"})}),"\n",(0,t.jsx)(i.p,{children:"AAC, or Advanced Audio Coding, is an umbrella for a number of different codecs. When people refer to AAC, they are often referring to the commonly used AAC-LC profile developed as part of the original AAC standard in 1997 (although there is a distinction between this version of AAC-LC, called MPEG-2 AAC, & MPEG-4 AAC which is newer). However, there are a number of other variants that have been created over time. These include:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"AAC-LC (low-complexity AAC)"}),"\n",(0,t.jsx)(i.li,{children:"AAC-LD (low delay AAC)"}),"\n",(0,t.jsx)(i.li,{children:"AAC-ELD (enhanced low delay AAC)"}),"\n",(0,t.jsx)(i.li,{children:"HE-AAC (high efficiency AAC, uses Spectral Band Replication)"}),"\n",(0,t.jsx)(i.li,{children:"HE-AACv2 (high efficiency AAC v2, uses Spectral Band Replication + Parametric Stereo)"}),"\n",(0,t.jsx)(i.li,{children:"xHE-AAC (extended high efficiency AAC (kinda), uses USAC (Unified Speech & Audio Coding))"}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"AAC is even used as a Bluetooth audio codec for encoding audio streams & sending them to a Bluetooth audio device. Encoding & even decoding some of the above formats can prove to be difficult, so it is worth exploring each codec individually."}),"\n",(0,t.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,t.jsx)(i.p,{children:"Let's explore each codec individually."}),"\n",(0,t.jsx)(i.h3,{id:"aac-lc",children:"AAC-LC"}),"\n",(0,t.jsx)(i.p,{children:'While AAC-LC was introduced alongside two higher complexity profiles (AAC Main & AAC-SSR), AAC-LC has seen much more widespread adoption through various distribution mediums for video (often paired with AVC video) & audio alike. AAC-LC is ubiquitous within the Apple ecosystem & was (& still is) used on YouTube before their switch to primarily using Opus. Encoding AAC-LC can be done with relative ease, accessible through nearly every encoder in the "Encoders" section.'}),"\n",(0,t.jsx)(i.h3,{id:"aac-ld--aac-eld",children:"AAC-LD & AAC-ELD"}),"\n",(0,t.jsx)(i.p,{children:"AAC-LD & AAC-ELD are both designed to transmit audio in instances where latency is very important. Both are far more efficient than previous low-latency audio coding offerings. Over AAC-LD, AAC-ELD offers better audio quality through Spectral Band Replication, lower latency, & a greater quality range with a lower bitrate minimum & higher maximum."}),"\n",(0,t.jsx)(i.h3,{id:"he-aac",children:"HE-AAC"}),"\n",(0,t.jsx)(i.p,{children:"High Efficiency AAC introduces Spectral Band Replication (SBR) to the AAC specification for the purpose of higher quality audio at lower bitrates. SBR is an encoding technique that allows the decoder to reconstruct higher frequencies from an audio signal given lower frequencies & data that informs the decoder about information in the higher frequencies, allowing them to be effectively restored from this helper data. In short, lower frequencies are encoded with extra detail incorporated to allow the reconstruction of higher frequency information in an audio signal. This feature alone allows HE-AAC to be much more efficient than AAC-LC at lower bitrates; the gap closes substantially at higher bitrates, however."}),"\n",(0,t.jsx)(i.h3,{id:"he-aacv2",children:"HE-AACv2"}),"\n",(0,t.jsx)(i.p,{children:"High Efficiency AAC v2 introduces Parametric Stereo (PS), which further increases audio quality with an emphasis on lower bitrates. PS uses a mono signal downmixed from a multichannel stereo input alongside information about the spatial properties of the stereo input to allow the decoder to reconstruct a left & right channel using salient spatial data from the mono signal. HE-AACv2 combine PS with SBR for greater efficiency gains over HE-AAC & AAC-LC, although again the gap closes at higher bitrates."}),"\n",(0,t.jsx)(i.h3,{id:"xhe-aac",children:"xHE-AAC"}),"\n",(0,t.jsxs)(i.p,{children:["Extended High Efficiency AAC is actually slightly different from xHE-AAC. While Extended High Efficiency AAC specifically includes all of HE-AACv2's coding techniques as well as compression techniques from the USAC specification, the Extended High Efficiency AAC profile was designed in such a manner that building an encoder for the format would allow it to be perfectly backwards compatible with past variations of AAC. xHE-AAC is a codec that combines the Extended High Efficiency AAC profile with further USAC coding techniques, specifically within the ",(0,t.jsx)(i.em,{children:"MPEG-D DRC Loudness Control Profile"}),". For all intents and purposes, when someone refers to \"USAC audio,\" they probably mean xHE-AAC. xHE-AAC further extends performance at lower bitrates compared to past variants of AAC. USAC's specialty & purpose was to create an audio codec that didn't compromise music performance for speech & vice versa, but rather automatically tuned its coding technique selection to perform the best on any given source."]}),"\n",(0,t.jsx)(i.p,{children:"xHE-AAC is not widely supported. On a Mac, playback is only possible through QuickTime Player & other utilities which use CoreAudio for decoding. Windows 11 & Android support xHE-AAC natively, but Windows 10 & Linux will not allow you to play it back without some grief. The most effective way currently is to use an AAC plugin with foobar2000, although this plugin is 32-bit only, so you'll need 32-bit foobar2000. This works on Linux under WINE."}),"\n",(0,t.jsx)(i.h2,{id:"encoders",children:"Encoders"}),"\n",(0,t.jsx)(i.p,{children:"There are a number of ways to encode each format, which I'll outline below."}),"\n",(0,t.jsx)(i.h3,{id:"fraunhofer-fdk-aac",children:"Fraunhofer FDK AAC"}),"\n",(0,t.jsxs)(i.p,{children:["Fraunhofer FDK AAC is a high quality, open-source AAC encoder by ",(0,t.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Fraunhofer_Society",children:"Fraunhofer IIS"}),". It was introduced with the release of Android 4.1 and has since been forked to a ",(0,t.jsx)(i.a,{href:"https://github.com/mstorsjo/fdk-aac",children:"seperate repository"}),". Issues regarding the legality of its distribution have arisen since the Free Software Foundation declared the license incompatible with the GPL. The license does not grant the user rights to the patented technologies used in the source code, and therefore restricts its use. However, this topic is still debated as Debian does not consider FDK AAC free software while Red Hat does."]}),"\n",(0,t.jsx)(i.p,{children:"Another similar tool, FhG-AAC, performs similarly to FDK-AAC but with greater precision as it performs floating point operations. It can be used through the proprietary Windows media player Winamp."}),"\n",(0,t.jsxs)(i.p,{children:["FDK-AAC can encode the following formats:\n",(0,t.jsx)(i.code,{children:"AAC-LC AAC-LD AAC-ELD HE-AAC HE-AACv2"})]}),"\n",(0,t.jsx)(i.h3,{id:"core-audio",children:"Core Audio"}),"\n",(0,t.jsxs)(i.p,{children:["Apple's proprietary Core Audio Toolbox encoder is a popular, high-quality choice for encoding AAC. This encoder can be used in macOS via Apple's own ",(0,t.jsx)(i.code,{children:"afconvert"})," utility, or in FFmpeg by specifying ",(0,t.jsx)(i.code,{children:"aac_at"})," as the audio encoder. Windows users can also take advantage of Core Audio by using the free ",(0,t.jsx)(i.a,{href:"https://github.com/nu774/qaac",children:"qaac"})," command-line utility, but users will need to either have ",(0,t.jsx)(i.a,{href:"https://support.apple.com/en-ca/HT210384",children:"iTunes"})," installed, or extract the libraries from said installer, using the ",(0,t.jsx)(i.a,{href:"https://github.com/nu774/makeportable",children:"makeportable"})," script."]}),"\n",(0,t.jsxs)(i.p,{children:["Core Audio can encode the following formats: ",(0,t.jsx)(i.code,{children:"AAC-LC, HE-AAC, HE-AACv2"}),"*"]}),"\n",(0,t.jsxs)(i.p,{children:["*",(0,t.jsx)(i.code,{children:"HE-AACv2"})," encoding is only supported on macOS."]}),"\n",(0,t.jsx)(i.h3,{id:"ffmpeg-aac",children:"FFmpeg AAC"}),"\n",(0,t.jsx)(i.p,{children:"FFmpeg's native AAC encoder is known for being completely free & open source, licensed under the GNU General Public License (or LGPL, depending on how FFmpeg is configured). If you want a completely FOSS solution for encoding AAC, FFmpeg AAC is one of the only places you'll find this. It is not known for being particularly feature rich or high quality & doesn't support the entire profile of the AAC variants it can encode, but it gets the job done in most scenarios."}),"\n",(0,t.jsxs)(i.p,{children:["FFmpeg's AAC encoder can be called with a simple ",(0,t.jsx)(i.code,{children:"-c:a aac"})," parameter, but there are more granular options available. By default, the profile is ",(0,t.jsx)(i.code,{children:"aac_low"})," which encodes MPEG-4 AAC-LC. The ",(0,t.jsx)(i.code,{children:"mpeg2_aac_low"})," profile encodes simpler, lower-quality MPEG-2 AAC from 1997, while ",(0,t.jsx)(i.code,{children:"aac_main"})," encodes the more obscure main AAC profile from the 1997 MPEG-2 specification. Finally, ",(0,t.jsx)(i.code,{children:"aac-ltp"})," encodes AAC long-term prediction introduced in MPEG-4."]}),"\n",(0,t.jsxs)(i.p,{children:["Using FFmpeg AAC, we can encode the following formats:\n",(0,t.jsx)(i.code,{children:"AAC-LC"})]}),"\n",(0,t.jsx)(i.h3,{id:"faac",children:"FAAC"}),"\n",(0,t.jsxs)(i.p,{children:["FAAC is an old AAC encoder, name meaning Freeware Advanced Audio Coder. It is one of the lower quality options, & isn't recommended for general use. It only supports ",(0,t.jsx)(i.code,{children:"AAC-LC"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"nero-aac",children:"Nero AAC"}),"\n",(0,t.jsx)(i.p,{children:"The discontinued Nero AAC audio coder had its last release in 2010. The developer of FAAC worked on Nero AAC, & the Nero AAC encoder & decoder are proprietary. Nero AAC was known to produce decent quality output while it was maintained, although development has since stalled."}),"\n",(0,t.jsxs)(i.p,{children:["Nero AAC can encode the following formats:\n",(0,t.jsx)(i.code,{children:"AAC-LC, HE-AAC, HE-AACv2"})]}),"\n",(0,t.jsx)(i.h3,{id:"exhale",children:"Exhale"}),"\n",(0,t.jsx)(i.p,{children:"Exhale is the only encoder on this list capable of encoding xHE-AAC audio. While it does not excel at this task compared to proprietary competition, there isn't really a straightforward way to encode xHE-AAC outside of using exhale on most platforms right now. Given that fact, it is the only xHE-AAC encoder many can consider using due to the lack of real competition. It can encode Extended HE-AAC audio with or without eSBR, although encoding using eSBR produces higher quality results."}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"exhale"})," can encode the following formats:\n",(0,t.jsx)(i.code,{children:"xHE-AAC"})]}),"\n",(0,t.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,t.jsx)(i.p,{children:"Alternatives to AAC include Opus, Vorbis, MP3, & FLAC, among others."}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Vorbis & MP3 are considered to be worse, although Vorbis has its moments & is entirely royalty-free unlike AAC."}),"\n",(0,t.jsx)(i.li,{children:"FLAC is a lossless audio codec with an entirely different use case. It is important to reinforce that lossy audio codecs are not replacements for lossless, as good as they might get."}),"\n",(0,t.jsxs)(i.li,{children:["Opus is competitive with HE-AACv2 & xHE-AAC moreso than the older, worse variants, & is widely supported as well as royalty free. The open source reference encoder ",(0,t.jsx)(i.code,{children:"opusenc"})," is an excellent implementation of the format & the tooling is much easier to use compared to AAC's frankly nightmarish assortment of various options with numerous individual downsides. xHE-AAC is generally better than Opus, especially at lower bitrates, which is a fact that merits consideration."]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>r,x:()=>s});var n=o(6540);const t={},a=n.createContext(t);function r(e){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4bbde8e.a30040d0.js b/assets/js/b4bbde8e.a30040d0.js deleted file mode 100644 index 098c382d5..000000000 --- a/assets/js/b4bbde8e.a30040d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7989],{965:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=o(4848),t=o(8453);const a={title:"AAC",description:"Explore the AAC audio codec, including its various profiles, encoders, & use cases.",keywords:["AAC","Advanced Audio Coding","audio codec","audio","codec","audio encoding","audio decoding","audio compression","audio quality","audio formats","audio file formats","audio file","audio file type","audio file extension","audio file format","audio file types","audio file extensions","audio file formats"],sidebar_position:2},r="AAC",s={id:"audio/AAC",title:"AAC",description:"Explore the AAC audio codec, including its various profiles, encoders, & use cases.",source:"@site/docs/audio/AAC.mdx",sourceDirName:"audio",slug:"/audio/AAC",permalink:"/docs/audio/AAC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/AAC.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"AAC",description:"Explore the AAC audio codec, including its various profiles, encoders, & use cases.",keywords:["AAC","Advanced Audio Coding","audio codec","audio","codec","audio encoding","audio decoding","audio compression","audio quality","audio formats","audio file formats","audio file","audio file type","audio file extension","audio file format","audio file types","audio file extensions","audio file formats"],sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Intro",permalink:"/docs/audio/intro"},next:{title:"Opus",permalink:"/docs/audio/Opus"}},d={},c=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"AAC-LC",id:"aac-lc",level:3},{value:"AAC-LD & AAC-ELD",id:"aac-ld--aac-eld",level:3},{value:"HE-AAC",id:"he-aac",level:3},{value:"HE-AACv2",id:"he-aacv2",level:3},{value:"xHE-AAC",id:"xhe-aac",level:3},{value:"Encoders",id:"encoders",level:2},{value:"Fraunhofer FDK AAC",id:"fraunhofer-fdk-aac",level:3},{value:"Core Audio",id:"core-audio",level:3},{value:"FFmpeg AAC",id:"ffmpeg-aac",level:3},{value:"FAAC",id:"faac",level:3},{value:"Nero AAC",id:"nero-aac",level:3},{value:"Exhale",id:"exhale",level:3},{value:"Conclusion",id:"conclusion",level:2}];function l(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"aac",children:"AAC"})}),"\n",(0,n.jsx)(i.p,{children:"AAC, or Advanced Audio Coding, is an umbrella for a number of different codecs. When people refer to AAC, they are often referring to the commonly used AAC-LC profile developed as part of the original AAC standard in 1997 (although there is a distinction between this version of AAC-LC, called MPEG-2 AAC, & MPEG-4 AAC which is newer). However, there are a number of other variants that have been created over time. These include:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"AAC-LC (low-complexity AAC)"}),"\n",(0,n.jsx)(i.li,{children:"AAC-LD (low delay AAC)"}),"\n",(0,n.jsx)(i.li,{children:"AAC-ELD (enhanced low delay AAC)"}),"\n",(0,n.jsx)(i.li,{children:"HE-AAC (high efficiency AAC, uses Spectral Band Replication)"}),"\n",(0,n.jsx)(i.li,{children:"HE-AACv2 (high efficiency AAC v2, uses Spectral Band Replication + Parametric Stereo)"}),"\n",(0,n.jsx)(i.li,{children:"xHE-AAC (extended high efficiency AAC (kinda), uses USAC (Unified Speech & Audio Coding))"}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"AAC is even used as a Bluetooth audio codec for encoding audio streams & sending them to a Bluetooth audio device. Encoding & even decoding some of the above formats can prove to be difficult, so it is worth exploring each codec individually."}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsx)(i.p,{children:"Let's explore each codec individually."}),"\n",(0,n.jsx)(i.h3,{id:"aac-lc",children:"AAC-LC"}),"\n",(0,n.jsx)(i.p,{children:'While AAC-LC was introduced alongside two higher complexity profiles (AAC Main & AAC-SSR), AAC-LC has seen much more widespread adoption through various distribution mediums for video (often paired with AVC video) & audio alike. AAC-LC is ubiquitous within the Apple ecosystem & was (& still is) used on YouTube before their switch to primarily using Opus. Encoding AAC-LC can be done with relative ease, accessible through nearly every encoder in the "Encoders" section.'}),"\n",(0,n.jsx)(i.h3,{id:"aac-ld--aac-eld",children:"AAC-LD & AAC-ELD"}),"\n",(0,n.jsx)(i.p,{children:"AAC-LD & AAC-ELD are both designed to transmit audio in instances where latency is very important. Both are far more efficient than previous low-latency audio coding offerings. Over AAC-LD, AAC-ELD offers better audio quality through Spectral Band Replication, lower latency, & a greater quality range with a lower bitrate minimum & higher maximum."}),"\n",(0,n.jsx)(i.h3,{id:"he-aac",children:"HE-AAC"}),"\n",(0,n.jsx)(i.p,{children:"High Efficiency AAC introduces Spectral Band Replication (SBR) to the AAC specification for the purpose of higher quality audio at lower bitrates. SBR is an encoding technique that allows the decoder to reconstruct higher frequencies from an audio signal given lower frequencies & data that informs the decoder about information in the higher frequencies, allowing them to be effectively restored from this helper data. In short, lower frequencies are encoded with extra detail incorporated to allow the reconstruction of higher frequency information in an audio signal. This feature alone allows HE-AAC to be much more efficient than AAC-LC at lower bitrates; the gap closes substantially at higher bitrates, however."}),"\n",(0,n.jsx)(i.h3,{id:"he-aacv2",children:"HE-AACv2"}),"\n",(0,n.jsx)(i.p,{children:"High Efficiency AAC v2 introduces Parametric Stereo (PS), which further increases audio quality with an emphasis on lower bitrates. PS uses a mono signal downmixed from a multichannel stereo input alongside information about the spatial properties of the stereo input to allow the decoder to reconstruct a left & right channel using salient spatial data from the mono signal. HE-AACv2 combine PS with SBR for greater efficiency gains over HE-AAC & AAC-LC, although again the gap closes at higher bitrates."}),"\n",(0,n.jsx)(i.h3,{id:"xhe-aac",children:"xHE-AAC"}),"\n",(0,n.jsxs)(i.p,{children:["Extended High Efficiency AAC is actually slightly different from xHE-AAC. While Extended High Efficiency AAC specifically includes all of HE-AACv2's coding techniques as well as compression techniques from the USAC specification, the Extended High Efficiency AAC profile was designed in such a manner that building an encoder for the format would allow it to be perfectly backwards compatible with past variations of AAC. xHE-AAC is a codec that combines the Extended High Efficiency AAC profile with further USAC coding techniques, specifically within the ",(0,n.jsx)(i.em,{children:"MPEG-D DRC Loudness Control Profile"}),". For all intents and purposes, when someone refers to \"USAC audio,\" they probably mean xHE-AAC. xHE-AAC further extends performance at lower bitrates compared to past variants of AAC. USAC's specialty & purpose was to create an audio codec that didn't compromise music performance for speech & vice versa, but rather automatically tuned its coding technique selection to perform the best on any given source."]}),"\n",(0,n.jsx)(i.p,{children:"xHE-AAC is not widely supported. On a Mac, playback is only possible through QuickTime Player & other utilities which use CoreAudio for decoding. Windows 11 & Android support xHE-AAC natively, but Windows 10 & Linux will not allow you to play it back without some grief. The most effective way currently is to use an AAC plugin with foobar2000, although this plugin is 32-bit only, so you'll need 32-bit foobar2000. This works on Linux under WINE."}),"\n",(0,n.jsx)(i.h2,{id:"encoders",children:"Encoders"}),"\n",(0,n.jsx)(i.p,{children:"There are a number of ways to encode each format, which I'll outline below."}),"\n",(0,n.jsx)(i.h3,{id:"fraunhofer-fdk-aac",children:"Fraunhofer FDK AAC"}),"\n",(0,n.jsxs)(i.p,{children:["Fraunhofer FDK AAC is a high quality, open-source AAC encoder by ",(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Fraunhofer_Society",children:"Fraunhofer IIS"}),". It was introduced with the release of Android 4.1 and has since been forked to a ",(0,n.jsx)(i.a,{href:"https://github.com/mstorsjo/fdk-aac",children:"seperate repository"}),". Issues regarding the legality of its distribution have arisen since the Free Software Foundation declared the license incompatible with the GPL. The license does not grant the user rights to the patented technologies used in the source code, and therefore restricts its use. However, this topic is still debated as Debian does not consider FDK AAC free software while Red Hat does."]}),"\n",(0,n.jsx)(i.p,{children:"Another similar tool, FhG-AAC, performs similarly to FDK-AAC but with greater precision as it performs floating point operations. It can be used through the proprietary Windows media player Winamp."}),"\n",(0,n.jsxs)(i.p,{children:["FDK-AAC can encode the following formats:\n",(0,n.jsx)(i.code,{children:"AAC-LC AAC-LD AAC-ELD HE-AAC HE-AACv2"})]}),"\n",(0,n.jsx)(i.h3,{id:"core-audio",children:"Core Audio"}),"\n",(0,n.jsxs)(i.p,{children:["Apple's proprietary Core Audio Toolbox encoder is a popular, high-quality choice for encoding AAC. This encoder can be used in macOS via Apple's own ",(0,n.jsx)(i.code,{children:"afconvert"})," utility, or in FFmpeg by specifying ",(0,n.jsx)(i.code,{children:"aac_at"})," as the audio encoder. Windows users can also take advantage of Core Audio by using the free ",(0,n.jsx)(i.a,{href:"https://github.com/nu774/qaac",children:"qaac"})," command-line utility, but users will need to either have ",(0,n.jsx)(i.a,{href:"https://support.apple.com/en-ca/HT210384",children:"iTunes"})," installed, or extract the libraries from said installer, using the ",(0,n.jsx)(i.a,{href:"https://github.com/nu774/makeportable",children:"makeportable"})," script."]}),"\n",(0,n.jsxs)(i.p,{children:["Core Audio can encode the following formats: ",(0,n.jsx)(i.code,{children:"AAC-LC, HE-AAC, HE-AACv2"}),"*"]}),"\n",(0,n.jsxs)(i.p,{children:["*",(0,n.jsx)(i.code,{children:"HE-AACv2"})," encoding is only supported on macOS."]}),"\n",(0,n.jsx)(i.h3,{id:"ffmpeg-aac",children:"FFmpeg AAC"}),"\n",(0,n.jsx)(i.p,{children:"FFmpeg's native AAC encoder is known for being completely free & open source, licensed under the GNU General Public License (or LGPL, depending on how FFmpeg is configured). If you want a completely FOSS solution for encoding AAC, FFmpeg AAC is one of the only places you'll find this. It is not known for being particularly feature rich or high quality & doesn't support the entire profile of the AAC variants it can encode, but it gets the job done in most scenarios."}),"\n",(0,n.jsxs)(i.p,{children:["FFmpeg's AAC encoder can be called with a simple ",(0,n.jsx)(i.code,{children:"-c:a aac"})," parameter, but there are more granular options available. By default, the profile is ",(0,n.jsx)(i.code,{children:"aac_low"})," which encodes MPEG-4 AAC-LC. The ",(0,n.jsx)(i.code,{children:"mpeg2_aac_low"})," profile encodes simpler, lower-quality MPEG-2 AAC from 1997, while ",(0,n.jsx)(i.code,{children:"aac_main"})," encodes the more obscure main AAC profile from the 1997 MPEG-2 specification. Finally, ",(0,n.jsx)(i.code,{children:"aac-ltp"})," encodes AAC long-term prediction introduced in MPEG-4."]}),"\n",(0,n.jsxs)(i.p,{children:["Using FFmpeg AAC, we can encode the following formats:\n",(0,n.jsx)(i.code,{children:"AAC-LC"})]}),"\n",(0,n.jsx)(i.h3,{id:"faac",children:"FAAC"}),"\n",(0,n.jsxs)(i.p,{children:["FAAC is an old AAC encoder, name meaning Freeware Advanced Audio Coder. It is one of the lower quality options, & isn't recommended for general use. It only supports ",(0,n.jsx)(i.code,{children:"AAC-LC"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:"nero-aac",children:"Nero AAC"}),"\n",(0,n.jsx)(i.p,{children:"The discontinued Nero AAC audio coder had its last release in 2010. The developer of FAAC worked on Nero AAC, & the Nero AAC encoder & decoder are proprietary. Nero AAC was known to produce decent quality output while it was maintained, although development has since stalled."}),"\n",(0,n.jsxs)(i.p,{children:["Nero AAC can encode the following formats:\n",(0,n.jsx)(i.code,{children:"AAC-LC, HE-AAC, HE-AACv2"})]}),"\n",(0,n.jsx)(i.h3,{id:"exhale",children:"Exhale"}),"\n",(0,n.jsx)(i.p,{children:"Exhale is the only encoder on this list capable of encoding xHE-AAC audio. While it does not excel at this task compared to proprietary competition, there isn't really a straightforward way to encode xHE-AAC outside of using exhale on most platforms right now. Given that fact, it is the only xHE-AAC encoder many can consider using due to the lack of real competition. It can encode Extended HE-AAC audio with or without eSBR, although encoding using eSBR produces higher quality results."}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"exhale"})," can encode the following formats:\n",(0,n.jsx)(i.code,{children:"xHE-AAC"})]}),"\n",(0,n.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(i.p,{children:"Alternatives to AAC include Opus, Vorbis, MP3, & FLAC, among others."}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Vorbis & MP3 are considered to be worse, although Vorbis has its moments & is entirely royalty-free unlike AAC."}),"\n",(0,n.jsx)(i.li,{children:"FLAC is a lossless audio codec with an entirely different use case. It is important to reinforce that lossy audio codecs are not replacements for lossless, as good as they might get."}),"\n",(0,n.jsxs)(i.li,{children:["Opus is competitive with HE-AACv2 & xHE-AAC moreso than the older, worse variants, & is widely supported as well as royalty free. The open source reference encoder ",(0,n.jsx)(i.code,{children:"opusenc"})," is an excellent implementation of the format & the tooling is much easier to use compared to AAC's frankly nightmarish assortment of various options with numerous individual downsides. xHE-AAC is generally better than Opus, especially at lower bitrates, which is a fact that merits consideration."]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>r,x:()=>s});var n=o(6540);const t={},a=n.createContext(t);function r(e){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b59b8cf7.43a6a0c1.js b/assets/js/b59b8cf7.43a6a0c1.js deleted file mode 100644 index 0e93a13de..000000000 --- a/assets/js/b59b8cf7.43a6a0c1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1271],{5423:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var i=t(4848),n=t(8453);const s={title:"Vorbis",sidebar_position:5},r="Vorbis",a={id:"audio/Vorbis",title:"Vorbis",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/Vorbis.mdx",sourceDirName:"audio",slug:"/audio/Vorbis",permalink:"/docs/audio/Vorbis",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Vorbis.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"Vorbis",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"MP3",permalink:"/docs/audio/MP3"},next:{title:"Speex",permalink:"/docs/audio/Speex"}},c={},d=[];function u(e){const o={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"vorbis",children:"Vorbis"})}),"\n",(0,i.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(o.p,{children:["Vorbis is an open-source audio codec that has seen great success in its usage by Spotify, among others. It is the default audio codec for Minecraft's sounds & music. It has largely been replaced by ",(0,i.jsx)(o.a,{href:"/docs/audio/Opus",children:"Opus"}),"."]})]})}function l(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>r,x:()=>a});var i=t(6540);const n={},s=i.createContext(n);function r(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b59b8cf7.ac260982.js b/assets/js/b59b8cf7.ac260982.js new file mode 100644 index 000000000..5d8087af6 --- /dev/null +++ b/assets/js/b59b8cf7.ac260982.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1271],{4631:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>a,contentTitle:()=>d,default:()=>l,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"audio/Vorbis","title":"Vorbis","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/audio/Vorbis.mdx","sourceDirName":"audio","slug":"/audio/Vorbis","permalink":"/docs/audio/Vorbis","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Vorbis.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"Vorbis","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"MP3","permalink":"/docs/audio/MP3"},"next":{"title":"Speex","permalink":"/docs/audio/Speex"}}');var s=o(4848),t=o(8453);const r={title:"Vorbis",sidebar_position:5},d="Vorbis",a={},c=[{value:"Usage",id:"usage",level:2},{value:"Encoder",id:"encoder",level:3},{value:"Decoder",id:"decoder",level:3}];function u(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"vorbis",children:"Vorbis"})}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(i.p,{children:["Vorbis is an open-source audio codec first released in 2000, maintainted by the Xiph.org Foundation. It has seen great success in its usage by Spotify, among others. It is the default audio codec for Minecraft's sounds & music. It has largely been replaced by ",(0,s.jsx)(i.a,{href:"/docs/audio/Opus",children:"Opus"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsxs)(i.p,{children:["Vorbis is supported in ",(0,s.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"ffmpeg"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"encoder",children:"Encoder"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"ffmpeg -i input.wav -c:a libvorbis output.ogg\n"})}),"\n",(0,s.jsx)(i.h3,{id:"decoder",children:"Decoder"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"ffmpeg -i input.ogg output.wav\n"})}),"\n",(0,s.jsxs)(i.p,{children:["See ",(0,s.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"ffmpeg"})," for more options."]})]})}function l(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,i,o)=>{o.d(i,{R:()=>r,x:()=>d});var n=o(6540);const s={},t=n.createContext(s);function r(e){const i=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b8af02bf.68d91565.js b/assets/js/b8af02bf.68d91565.js deleted file mode 100644 index 7a5d387f2..000000000 --- a/assets/js/b8af02bf.68d91565.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3222],{1158:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=t(4848),n=t(8453);const s={title:"JPEG 2000",sidebar_position:5},a="JPEG 2000",r={id:"images/JPEG2000",title:"JPEG 2000",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/JPEG2000.mdx",sourceDirName:"images",slug:"/images/JPEG2000",permalink:"/docs/images/JPEG2000",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG2000.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"JPEG 2000",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"WebP",permalink:"/docs/images/WebP"},next:{title:"AVIF",permalink:"/docs/images/AVIF"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"jpeg-2000",children:"JPEG 2000"})}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(i.p,{children:'JPEG-2000 is an older image compression format that uses wavelet technology to achieve high compression ratios while maintaining image quality. It supports both lossy and lossless compression, and is commonly used in applications such as digital photography, medical imaging, and video surveillance. JPEG-2000 files can be transparently compressed and decompressed using a variety of software tools and libraries, making it a flexible and widely-supported format for image storage & transmission. JPEG-2000 never effectively took off on the Web, but digital cinema distribution is often done with JPEG-2000. A "DCP" is a "Digital Cinema Package," which is a format used to distribute and play back digital movies in theaters. These DCPs are often compressed losslessly with JPEG-2000.'})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var o=t(6540);const n={},s=o.createContext(n);function a(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b8af02bf.6bd5e392.js b/assets/js/b8af02bf.6bd5e392.js new file mode 100644 index 000000000..0859f8462 --- /dev/null +++ b/assets/js/b8af02bf.6bd5e392.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3222],{3801:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"images/JPEG2000","title":"JPEG 2000","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/images/JPEG2000.mdx","sourceDirName":"images","slug":"/images/JPEG2000","permalink":"/docs/images/JPEG2000","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG2000.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"JPEG 2000","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"WebP","permalink":"/docs/images/WebP"},"next":{"title":"AVIF","permalink":"/docs/images/AVIF"}}');var o=t(4848),n=t(8453);const a={title:"JPEG 2000",sidebar_position:5},r="JPEG 2000",c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"jpeg-2000",children:"JPEG 2000"})}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(i.p,{children:'JPEG-2000 is an older image compression format that uses wavelet technology to achieve high compression ratios while maintaining image quality. It supports both lossy and lossless compression, and is commonly used in applications such as digital photography, medical imaging, and video surveillance. JPEG-2000 files can be transparently compressed and decompressed using a variety of software tools and libraries, making it a flexible and widely-supported format for image storage & transmission. JPEG-2000 never effectively took off on the Web, but digital cinema distribution is often done with JPEG-2000. A "DCP" is a "Digital Cinema Package," which is a format used to distribute and play back digital movies in theaters. These DCPs are often compressed losslessly with JPEG-2000.'})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var s=t(6540);const o={},n=s.createContext(o);function a(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bb17976f.a0392243.js b/assets/js/bb17976f.a0392243.js new file mode 100644 index 000000000..12107b8a2 --- /dev/null +++ b/assets/js/bb17976f.a0392243.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8943],{6676:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"encoders/aom-psy101","title":"aom-psy101","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/encoders/aom-psy101.mdx","sourceDirName":"encoders","slug":"/encoders/aom-psy101","permalink":"/docs/encoders/aom-psy101","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aom-psy101.mdx","tags":[],"version":"current","sidebarPosition":19,"frontMatter":{"title":"aom-psy101","sidebar_position":19,"keywords":["AV1","encoding","video encoding","AOM AV1"]},"sidebar":"tutorialSidebar","previous":{"title":"aom-av1-lavish","permalink":"/docs/encoders/aom-av1-lavish"},"next":{"title":"uavs3e","permalink":"/docs/encoders/uavs3e"}}');var r=a(4848),s=a(8453),i=a(1470),o=a(9365);const l={title:"aom-psy101",sidebar_position:19,keywords:["AV1","encoding","video encoding","AOM AV1"]},c="aom-psy101",d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"aom-psy101",children:"aom-psy101"})}),"\n",(0,r.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,r.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,r.jsx)(n.admonition,{title:"Community Fork",type:"info",children:(0,r.jsxs)(n.p,{children:["This entry is about a fork of aomenc called aom-psy101. If you'd like to learn about the mainline aomenc encoder before reading, visit our ",(0,r.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc wiki entry"}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["Mainline aomenc is unfortunately not perfect. It suffers from bad defaults, a heavy focus on the perceptually flawed ",(0,r.jsx)(n.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," metric, misleading settings, and other issues. Fortunately, there are a couple of forks developed by the encoding community that were created to combat aomenc's underlying issues."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"})," ",(0,r.jsx)(n.em,{children:"No longer maintained as of 13th January 2023"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/encoders/aom-av1-lavish",children:"aom-av1-lavish"})," ",(0,r.jsx)(n.em,{children:"No longer maintained as of 4th June 2024"})]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://gitlab.com/damian101/aom-psy101",children:"aom-psy101"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/porcino/aom-av1ador",children:"aom-av1ador"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"These forks fix up the poor decisions made by the original AOM devs and most importantly introduce new parameters and tunes to help fine-tune the encoder even more."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://gitlab.com/damian101/aom-psy101",children:"aom-psy101"})," is a fork of aomenc that aims to improve the encoding quality and speed of AV1. It is developed by ",(0,r.jsx)(n.a,{href:"https://gitlab.com/damian101",children:"damian101"}),", a talented AV1 community developer."]}),"\n",(0,r.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,r.jsxs)(n.p,{children:["aomenc is available in FFmpeg via ",(0,r.jsx)(n.code,{children:"libaom-av1"}),", check if you have it by running ",(0,r.jsx)(n.code,{children:"ffmpeg -h encoder=libaom-av1"}),". You can input non-FFmpeg standard aomenc parameters via ",(0,r.jsx)(n.code,{children:"-aom-params"}),"."]}),"\n",(0,r.jsx)(n.admonition,{title:"Mainline aomenc",type:"caution",children:(0,r.jsx)(n.p,{children:"Unless you compile FFmpeg yourself with aom-psy101, you will be using the mainline aomenc. Compiling from source yourself with the aomenc libraries provided by aom-psy101 is the only way to use it with FFmpeg."})}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsxs)(o.A,{value:"unixlike",label:"Linux & macOS",default:!0,children:[(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Clone the psy101 repo:"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the psy101 repo"',children:"git clone https://gitlab.com/damian101/aom-psy101\ncd aom-psy101 && mkdir aom_build && cd aom_build\n"})}),(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["Configure compilation. The following flags are set to ensure the ",(0,r.jsx)(n.code,{children:"aomenc"})," binary is build for optimal performance:"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Set CMake flags"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -pipe -march=native" -DCMAKE_C_FLAGS="-flto -pipe -march=native"\n'})}),(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsx)(n.li,{children:"Compile:"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Compile"',children:"make -j$(nproc)\n"})}),(0,r.jsxs)(n.ol,{start:"4",children:["\n",(0,r.jsx)(n.li,{children:"Install to your system. This may require elevated privileges:"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Install"',children:"make install\n"})})]}),(0,r.jsxs)(o.A,{value:"wind",label:"Windows",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"MSYS2"})," is the best option for building in Windows, as it provides a Unix-like environment for compilation."]}),(0,r.jsxs)(n.ol,{start:"0",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,r.jsx)(n.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Close any MSYS2 Console that you have open, start the Clang64 console & install the required dependencies:"}),"\n"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"pacman -S git perl mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-ninja mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-nasm\n"})}),(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsx)(n.li,{children:"Clone the psy101 repo:"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the psy101 repo"',children:"git clone https://gitlab.com/damian101/aom-psy101\ncd aom-psy101 && mkdir aom_build && cd aom_build\n"})}),(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["Configure compilation. The following flags are set to ensure the ",(0,r.jsx)(n.code,{children:"aomenc"})," binary is build for optimal performance:"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Set CMake flags"',children:'LDFLAGS=-static cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -pipe -march=native" -DCMAKE_C_FLAGS="-flto -pipe -march=native"\n'})}),(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsx)(n.li,{children:"Compile:"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Compile"',children:"ninja\n"})}),(0,r.jsxs)(n.p,{children:["The resulting binary will be available within the home folder of the location where you installed MSYS2 (usually ",(0,r.jsx)(n.code,{children:"C:"}),"). Navigate there, and then to ",(0,r.jsx)(n.code,{children:"aom-psy101\\aom_build"})," folder; the binary should be there."]})]})]})]})}function m(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,n,a)=>{a.d(n,{A:()=>i});a(6540);var t=a(4164);const r={tabItem:"tabItem_Ymn6"};var s=a(4848);function i(e){let{children:n,hidden:a,className:i}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,i),hidden:a,children:n})}},1470:(e,n,a)=>{a.d(n,{A:()=>w});var t=a(6540),r=a(4164),s=a(3104),i=a(6347),o=a(205),l=a(7485),c=a(1682),d=a(679);function u(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:a}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:a,attributes:t,default:r}}=e;return{value:n,label:a,attributes:t,default:r}}))}(a);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,a])}function m(e){let{value:n,tabValues:a}=e;return a.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:a}=e;const r=(0,i.W6)(),s=function(e){let{queryString:n=!1,groupId:a}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:n,groupId:a});return[(0,l.aZ)(s),(0,t.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})}),[s,r])]}function f(e){const{defaultValue:n,queryString:a=!1,groupId:r}=e,s=h(e),[i,l]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=a.find((e=>e.default))??a[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s}))),[c,u]=p({queryString:a,groupId:r}),[f,b]=function(e){let{groupId:n}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,s]=(0,d.Dv)(a);return[r,(0,t.useCallback)((e=>{a&&s.set(e)}),[a,s])]}({groupId:r}),g=(()=>{const e=c??f;return m({value:e,tabValues:s})?e:null})();(0,o.A)((()=>{g&&l(g)}),[g]);return{selectedValue:i,selectValue:(0,t.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),b(e)}),[u,b,s]),tabValues:s}}var b=a(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=a(4848);function y(e){let{className:n,block:a,selectedValue:t,selectValue:i,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const n=e.currentTarget,a=l.indexOf(n),r=o[a].value;r!==t&&(c(n),i(r))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const a=l.indexOf(e.currentTarget)+1;n=l[a]??l[0];break}case"ArrowLeft":{const a=l.indexOf(e.currentTarget)-1;n=l[a]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},n),children:o.map((e=>{let{value:n,label:a,attributes:s}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>l.push(e),onKeyDown:u,onClick:d,...s,className:(0,r.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":t===n}),children:a??n},n)}))})}function v(e){let{lazy:n,children:a,selectedValue:s}=e;const i=(Array.isArray(a)?a:[a]).filter(Boolean);if(n){const e=i.find((e=>e.props.value===s));return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:i.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function j(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,x.jsx)(y,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function w(e){const n=(0,b.A)();return(0,x.jsx)(j,{...e,children:u(e.children)},String(n))}},8453:(e,n,a)=>{a.d(n,{R:()=>i,x:()=>o});var t=a(6540);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bb17976f.d85080c7.js b/assets/js/bb17976f.d85080c7.js deleted file mode 100644 index 8595e60e5..000000000 --- a/assets/js/bb17976f.d85080c7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8943],{2591:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var t=a(4848),r=a(8453),i=a(1470),s=a(9365);const o={title:"aom-psy101",sidebar_position:19,keywords:["AV1","encoding","video encoding","AOM AV1"]},l="aom-psy101",c={id:"encoders/aom-psy101",title:"aom-psy101",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/aom-psy101.mdx",sourceDirName:"encoders",slug:"/encoders/aom-psy101",permalink:"/docs/encoders/aom-psy101",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aom-psy101.mdx",tags:[],version:"current",sidebarPosition:19,frontMatter:{title:"aom-psy101",sidebar_position:19,keywords:["AV1","encoding","video encoding","AOM AV1"]},sidebar:"tutorialSidebar",previous:{title:"aom-av1-lavish",permalink:"/docs/encoders/aom-av1-lavish"},next:{title:"uavs3e",permalink:"/docs/encoders/uavs3e"}},d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"aom-psy101",children:"aom-psy101"})}),"\n",(0,t.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsx)(n.admonition,{title:"Community Fork",type:"info",children:(0,t.jsxs)(n.p,{children:["This entry is about a fork of aomenc called aom-psy101. If you'd like to learn about the mainline aomenc encoder before reading, visit our ",(0,t.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc wiki entry"}),"."]})}),"\n",(0,t.jsxs)(n.p,{children:["Mainline aomenc is unfortunately not perfect. It suffers from bad defaults, a heavy focus on the perceptually flawed ",(0,t.jsx)(n.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," metric, misleading settings, and other issues. Fortunately, there are a couple of forks developed by the encoding community that were created to combat aomenc's underlying issues."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"})," ",(0,t.jsx)(n.em,{children:"No longer maintained as of 13th January 2023"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/docs/encoders/aom-av1-lavish",children:"aom-av1-lavish"})," ",(0,t.jsx)(n.em,{children:"No longer maintained as of 4th June 2024"})]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/damian101/aom-psy101",children:"aom-psy101"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/porcino/aom-av1ador",children:"aom-av1ador"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"These forks fix up the poor decisions made by the original AOM devs and most importantly introduce new parameters and tunes to help fine-tune the encoder even more."}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://gitlab.com/damian101/aom-psy101",children:"aom-psy101"})," is a fork of aomenc that aims to improve the encoding quality and speed of AV1. It is developed by ",(0,t.jsx)(n.a,{href:"https://gitlab.com/damian101",children:"damian101"}),", a talented AV1 community developer."]}),"\n",(0,t.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,t.jsxs)(n.p,{children:["aomenc is available in FFmpeg via ",(0,t.jsx)(n.code,{children:"libaom-av1"}),", check if you have it by running ",(0,t.jsx)(n.code,{children:"ffmpeg -h encoder=libaom-av1"}),". You can input non-FFmpeg standard aomenc parameters via ",(0,t.jsx)(n.code,{children:"-aom-params"}),"."]}),"\n",(0,t.jsx)(n.admonition,{title:"Mainline aomenc",type:"caution",children:(0,t.jsx)(n.p,{children:"Unless you compile FFmpeg yourself with aom-psy101, you will be using the mainline aomenc. Compiling from source yourself with the aomenc libraries provided by aom-psy101 is the only way to use it with FFmpeg."})}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsxs)(s.A,{value:"unixlike",label:"Linux & macOS",default:!0,children:[(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Clone the psy101 repo:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the psy101 repo"',children:"git clone https://gitlab.com/damian101/aom-psy101\ncd aom-psy101 && mkdir aom_build && cd aom_build\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["Configure compilation. The following flags are set to ensure the ",(0,t.jsx)(n.code,{children:"aomenc"})," binary is build for optimal performance:"]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Set CMake flags"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -pipe -march=native" -DCMAKE_C_FLAGS="-flto -pipe -march=native"\n'})}),(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsx)(n.li,{children:"Compile:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Compile"',children:"make -j$(nproc)\n"})}),(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsx)(n.li,{children:"Install to your system. This may require elevated privileges:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Install"',children:"make install\n"})})]}),(0,t.jsxs)(s.A,{value:"wind",label:"Windows",children:[(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"MSYS2"})," is the best option for building in Windows, as it provides a Unix-like environment for compilation."]}),(0,t.jsxs)(n.ol,{start:"0",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,t.jsx)(n.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Close any MSYS2 Console that you have open, start the Clang64 console & install the required dependencies:"}),"\n"]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pacman -S git perl mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-ninja mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-nasm\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"Clone the psy101 repo:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the psy101 repo"',children:"git clone https://gitlab.com/damian101/aom-psy101\ncd aom-psy101 && mkdir aom_build && cd aom_build\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["Configure compilation. The following flags are set to ensure the ",(0,t.jsx)(n.code,{children:"aomenc"})," binary is build for optimal performance:"]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Set CMake flags"',children:'LDFLAGS=-static cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -pipe -march=native" -DCMAKE_C_FLAGS="-flto -pipe -march=native"\n'})}),(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsx)(n.li,{children:"Compile:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Compile"',children:"ninja\n"})}),(0,t.jsxs)(n.p,{children:["The resulting binary will be available within the home folder of the location where you installed MSYS2 (usually ",(0,t.jsx)(n.code,{children:"C:"}),"). Navigate there, and then to ",(0,t.jsx)(n.code,{children:"aom-psy101\\aom_build"})," folder; the binary should be there."]})]})]})]})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},9365:(e,n,a)=>{a.d(n,{A:()=>s});a(6540);var t=a(4164);const r={tabItem:"tabItem_Ymn6"};var i=a(4848);function s(e){let{children:n,hidden:a,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,s),hidden:a,children:n})}},1470:(e,n,a)=>{a.d(n,{A:()=>w});var t=a(6540),r=a(4164),i=a(3104),s=a(6347),o=a(205),l=a(7485),c=a(1682),d=a(679);function u(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:a}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:a,attributes:t,default:r}}=e;return{value:n,label:a,attributes:t,default:r}}))}(a);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,a])}function m(e){let{value:n,tabValues:a}=e;return a.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:a}=e;const r=(0,s.W6)(),i=function(e){let{queryString:n=!1,groupId:a}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:n,groupId:a});return[(0,l.aZ)(i),(0,t.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function f(e){const{defaultValue:n,queryString:a=!1,groupId:r}=e,i=h(e),[s,l]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=a.find((e=>e.default))??a[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:i}))),[c,u]=p({queryString:a,groupId:r}),[f,b]=function(e){let{groupId:n}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,d.Dv)(a);return[r,(0,t.useCallback)((e=>{a&&i.set(e)}),[a,i])]}({groupId:r}),g=(()=>{const e=c??f;return m({value:e,tabValues:i})?e:null})();(0,o.A)((()=>{g&&l(g)}),[g]);return{selectedValue:s,selectValue:(0,t.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),b(e)}),[u,b,i]),tabValues:i}}var b=a(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=a(4848);function y(e){let{className:n,block:a,selectedValue:t,selectValue:s,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),d=e=>{const n=e.currentTarget,a=l.indexOf(n),r=o[a].value;r!==t&&(c(n),s(r))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const a=l.indexOf(e.currentTarget)+1;n=l[a]??l[0];break}case"ArrowLeft":{const a=l.indexOf(e.currentTarget)-1;n=l[a]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},n),children:o.map((e=>{let{value:n,label:a,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>l.push(e),onKeyDown:u,onClick:d,...i,className:(0,r.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":t===n}),children:a??n},n)}))})}function v(e){let{lazy:n,children:a,selectedValue:i}=e;const s=(Array.isArray(a)?a:[a]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===i));return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function j(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,x.jsx)(y,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function w(e){const n=(0,b.A)();return(0,x.jsx)(j,{...e,children:u(e.children)},String(n))}},8453:(e,n,a)=>{a.d(n,{R:()=>s,x:()=>o});var t=a(6540);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc32b9c5.a0a9d727.js b/assets/js/bc32b9c5.a0a9d727.js new file mode 100644 index 000000000..014884422 --- /dev/null +++ b/assets/js/bc32b9c5.a0a9d727.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[786],{5426:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"metrics/XPSNR","title":"XPSNR","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/metrics/XPSNR.mdx","sourceDirName":"metrics","slug":"/metrics/XPSNR","permalink":"/docs/metrics/XPSNR","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/XPSNR.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"XPSNR","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"VMAF","permalink":"/docs/metrics/VMAF"},"next":{"title":"Butteraugli","permalink":"/docs/metrics/butteraugli"}}');var s=i(4848),r=i(8453);const o={title:"XPSNR",sidebar_position:1},a="XPSNR",l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Notes",id:"notes",level:2},{value:"Comparing to SSIMULACRA 2",id:"comparing-to-ssimulacra-2",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"xpsnr",children:"XPSNR"})}),"\n",(0,s.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsx)(n.p,{children:"XPSNR is a distortion measurement algorithm for video quality assessment, based on the concept of the peak signal to noise ratio (PSNR), tuned to better reflect the human visual system."}),"\n",(0,s.jsxs)(n.p,{children:["XPSNR is considered to be a highly reputable visual quality metric according to its correlation with subjective results relative to its impressive speed.\nUnlike image-first metrics like ",(0,s.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"}),", XPSNR is a video-focused metric, and uses temporal information to compute its score."]}),"\n",(0,s.jsxs)(n.p,{children:["The reference implementation by Fraunhofer HHI is a ",(0,s.jsx)(n.a,{href:"https://github.com/fraunhoferhhi/xpsnr",children:"FFmpeg 7.0 plug-in"}),", and there is a ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/sxpsnr",children:"community-built standalone implementation"})," available as well.\nFor more details about the algorithm and its design, ",(0,s.jsx)(n.a,{href:"https://www.itu.int/pub/S-JOURNAL-ICTS.V3I1-2020-8",children:"a scientific paper is available"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(n.p,{children:"XPSNR comes as an FFmpeg 7.0 plug-in. The process of installing it is somewhat straightforward:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Download the source code for FFmpeg 7.0:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone -b release/7.0 https://git.ffmpeg.org/ffmpeg.git ffmpeg\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsx)(n.li,{children:"Download the code for the XPSNR plug-in:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/fraunhoferhhi/xpsnr\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"3",children:["\n",(0,s.jsx)(n.li,{children:"Copy the plug-in files from XPSNR's code to FFmpeg's:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cp xpsnr/libavfilter/* ffmpeg/libavfilter/\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"4",children:["\n",(0,s.jsx)(n.li,{children:"Configure and compile FFmpeg:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cd ffmpeg\n./configure ...\nmake -j $(nproc)\n"})}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.p,{children:"XPSNR is used as an FFmpeg filter, similarly to the built-in PSNR plugin:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'./ffmpeg -i ref.mkv -i test.mkv -lavfi xpsnr="stats_file=xpsnr.log" -f null -\n'})}),"\n",(0,s.jsx)(n.h2,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Being the reference implementation an FFmpeg plug-in and not a standalone binary is inconvenient for some workflows.\nCurrently, there are some attempts at making a ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/sxpsnr",children:"standalone XPSNR binary"}),", although they are not very widespread yet."]}),"\n",(0,s.jsxs)(n.li,{children:["XPSNR uses a PSNR-like scoring system: a logarithmic scale in range 0..inf.\nThis is considerably harder to interpret than other metrics (e.g. ",(0,s.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA 2"})," or ",(0,s.jsx)(n.a,{href:"/docs/metrics/VMAF",children:"VMAF"}),");\nand the threshold to what constitutes good quality is content-dependent.\n(Preliminary testing seems to indicate that anything above a XPSNR score of 42.00 is visually lossless.)"]}),"\n",(0,s.jsxs)(n.li,{children:['XPSNR scores are computed independently for the luma (Y) and two chroma (U, V) components of videos,\nthus actually providing 3 scores.\nAlthough the developers argue that using the minimum of these 3 scores as "definitive score"\n(i.e. better correlates to human impressions),\nsome people in the community prefer using a weighted sum: ',(0,s.jsx)(n.code,{children:"(4 * XPSNR_Y + XPSNR_U + XPSNR_V) / 6"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"comparing-to-ssimulacra-2",children:"Comparing to SSIMULACRA 2"}),"\n",(0,s.jsx)(n.p,{children:"The main advantage of XPSNR over SSIMULACRA 2 is that it is considerably faster to compute.\nXPSNR can achieve real-time speeds for 1080p 24 fps video, making it more convenient to quickly compare test encodes."}),"\n",(0,s.jsx)(n.p,{children:"Regarding their visual assessment capabilities, XPSNR and SSIMULACRA 2 seem to complement each other quite well,\nhaving both their own strong points and weak points with specific video content.\nIf possible, using both at the same time provides great benefits for video quality assessment and comparison."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>a});var t=i(6540);const s={},r=t.createContext(s);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc32b9c5.ea617b31.js b/assets/js/bc32b9c5.ea617b31.js deleted file mode 100644 index 86d24190d..000000000 --- a/assets/js/bc32b9c5.ea617b31.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[786],{8450:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var t=i(4848),s=i(8453);const r={title:"XPSNR",sidebar_position:1},o="XPSNR",a={id:"metrics/XPSNR",title:"XPSNR",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/XPSNR.mdx",sourceDirName:"metrics",slug:"/metrics/XPSNR",permalink:"/docs/metrics/XPSNR",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/XPSNR.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"XPSNR",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"VMAF",permalink:"/docs/metrics/VMAF"},next:{title:"Butteraugli",permalink:"/docs/metrics/butteraugli"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Notes",id:"notes",level:2},{value:"Comparing to SSIMULACRA 2",id:"comparing-to-ssimulacra-2",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"xpsnr",children:"XPSNR"})}),"\n",(0,t.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsx)(n.p,{children:"XPSNR is a distortion measurement algorithm for video quality assessment, based on the concept of the peak signal to noise ratio (PSNR), tuned to better reflect the human visual system."}),"\n",(0,t.jsxs)(n.p,{children:["XPSNR is considered to be a highly reputable visual quality metric according to its correlation with subjective results relative to its impressive speed.\nUnlike image-first metrics like ",(0,t.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"}),", XPSNR is a video-focused metric, and uses temporal information to compute its score."]}),"\n",(0,t.jsxs)(n.p,{children:["The reference implementation by Fraunhofer HHI is a ",(0,t.jsx)(n.a,{href:"https://github.com/fraunhoferhhi/xpsnr",children:"FFmpeg 7.0 plug-in"}),", and there is a ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato/sxpsnr",children:"community-built standalone implementation"})," available as well.\nFor more details about the algorithm and its design, ",(0,t.jsx)(n.a,{href:"https://www.itu.int/pub/S-JOURNAL-ICTS.V3I1-2020-8",children:"a scientific paper is available"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"XPSNR comes as an FFmpeg 7.0 plug-in. The process of installing it is somewhat straightforward:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Download the source code for FFmpeg 7.0:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone -b release/7.0 https://git.ffmpeg.org/ffmpeg.git ffmpeg\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"Download the code for the XPSNR plug-in:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/fraunhoferhhi/xpsnr\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsx)(n.li,{children:"Copy the plug-in files from XPSNR's code to FFmpeg's:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cp xpsnr/libavfilter/* ffmpeg/libavfilter/\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsx)(n.li,{children:"Configure and compile FFmpeg:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd ffmpeg\n./configure ...\nmake -j $(nproc)\n"})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.p,{children:"XPSNR is used as an FFmpeg filter, similarly to the built-in PSNR plugin:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'./ffmpeg -i ref.mkv -i test.mkv -lavfi xpsnr="stats_file=xpsnr.log" -f null -\n'})}),"\n",(0,t.jsx)(n.h2,{id:"notes",children:"Notes"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Being the reference implementation an FFmpeg plug-in and not a standalone binary is inconvenient for some workflows.\nCurrently, there are some attempts at making a ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato/sxpsnr",children:"standalone XPSNR binary"}),", although they are not very widespread yet."]}),"\n",(0,t.jsxs)(n.li,{children:["XPSNR uses a PSNR-like scoring system: a logarithmic scale in range 0..inf.\nThis is considerably harder to interpret than other metrics (e.g. ",(0,t.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA 2"})," or ",(0,t.jsx)(n.a,{href:"/docs/metrics/VMAF",children:"VMAF"}),");\nand the threshold to what constitutes good quality is content-dependent.\n(Preliminary testing seems to indicate that anything above a XPSNR score of 42.00 is visually lossless.)"]}),"\n",(0,t.jsxs)(n.li,{children:['XPSNR scores are computed independently for the luma (Y) and two chroma (U, V) components of videos,\nthus actually providing 3 scores.\nAlthough the developers argue that using the minimum of these 3 scores as "definitive score"\n(i.e. better correlates to human impressions),\nsome people in the community prefer using a weighted sum: ',(0,t.jsx)(n.code,{children:"(4 * XPSNR_Y + XPSNR_U + XPSNR_V) / 6"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"comparing-to-ssimulacra-2",children:"Comparing to SSIMULACRA 2"}),"\n",(0,t.jsx)(n.p,{children:"The main advantage of XPSNR over SSIMULACRA 2 is that it is considerably faster to compute.\nXPSNR can achieve real-time speeds for 1080p 24 fps video, making it more convenient to quickly compare test encodes."}),"\n",(0,t.jsx)(n.p,{children:"Regarding their visual assessment capabilities, XPSNR and SSIMULACRA 2 seem to complement each other quite well,\nhaving both their own strong points and weak points with specific video content.\nIf possible, using both at the same time provides great benefits for video quality assessment and comparison."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>a});var t=i(6540);const s={},r=t.createContext(s);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bd173b27.2ce9d3ca.js b/assets/js/bd173b27.2ce9d3ca.js new file mode 100644 index 000000000..9e765c482 --- /dev/null +++ b/assets/js/bd173b27.2ce9d3ca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1651],{3004:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"data/xz","title":"xz","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/data/xz.mdx","sourceDirName":"data","slug":"/data/xz","permalink":"/docs/data/xz","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/xz.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"xz","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"7z","permalink":"/docs/data/7z"},"next":{"title":"brotli","permalink":"/docs/data/brotli"}}');var t=s(4848),o=s(8453);const r={title:"xz",sidebar_position:5},a="XZ",d={},l=[{value:"Usage",id:"usage",level:2},{value:"Compression",id:"compression",level:3},{value:"Decompression",id:"decompression",level:3}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"xz",children:"XZ"})}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(i.p,{children:["XZ is a data compression format and utility based on the Lempel-Ziv-Markov Chain Algorithm (LZMA). The XZ format itself is an improvement on LZMA, allowing for preprocessing filters similar to ",(0,t.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"})," to increase the resulting archive's compression ratio."]}),"\n",(0,t.jsxs)(i.p,{children:["XZ can only compress one file at a time, so making a ",(0,t.jsx)(i.a,{href:"/docs/data/tar",children:"tar"})," archive of the files you'd like to compress (if there are multiple) is necessary when using XZ."]}),"\n",(0,t.jsx)(i.p,{children:"XZ is more widely supported when compared to other data compression formats, seeing support across iOS, macOS, and many Linux distributions by default. To decompress & compress XZ on Windows, you will likely need the 7-Zip archive utility."}),"\n",(0,t.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsxs)(i.p,{children:["This usage is for the ",(0,t.jsx)(i.code,{children:"xz"})," utility on linux, but is applicable to other platforms where xz can be used. It should be noted that ",(0,t.jsx)(i.code,{children:"xz"}),"'s default behavior is to delete the original file after it has completed the relevant compression or decompression operation, but this can be stopped with the flag below. An arbitary number of files may be passed to xz and it will individually complete the specified operation on each given file."]}),"\n",(0,t.jsx)(i.h3,{id:"compression",children:"Compression"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"xz {file}\n"})}),"\n",(0,t.jsxs)(i.p,{children:["This will result in a file named ",(0,t.jsx)(i.code,{children:"{file}.xz"})," being created in the current working directory."]}),"\n",(0,t.jsx)(i.p,{children:"A more advanced variant is listed here:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"xz -# --extreme -M 800Mib -T 2 -k {file}\n"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"-#"})," is a number between 0 and 9 specifying speed presets, 0 being the fastest and 9 slowest."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"--extreme"})," is an option allowing xz to use more time than the standard preset level."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"-M {size}"})," is an option restricting the memory usage of ",(0,t.jsx)(i.code,{children:"xz"})," either as a percentage of system memory or an absolute amount."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"-T {threads}"})," is an option restricting the number of threads used by ",(0,t.jsx)(i.code,{children:"xz"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"-k"})," prevents xz from deleting the input file."]}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"decompression",children:"Decompression"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"xz -d {file}.xz\n"})}),"\n",(0,t.jsx)(i.p,{children:"This decompresses the xz archive to it's original file."}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"-M {size}"})," is an option restricting the memory usage of ",(0,t.jsx)(i.code,{children:"xz"})," either as a percentage of system memory or an absolute amount."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"-T {threads}"})," is an option restricting the number of threads used by ",(0,t.jsx)(i.code,{children:"xz"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"-k"})," prevents xz from deleting the input file."]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var n=s(6540);const t={},o=n.createContext(t);function r(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bd173b27.fb7135b6.js b/assets/js/bd173b27.fb7135b6.js deleted file mode 100644 index f20954b18..000000000 --- a/assets/js/bd173b27.fb7135b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1651],{4646:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var s=n(4848),t=n(8453);const o={title:"xz",sidebar_position:5},r="XZ",a={id:"data/xz",title:"xz",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/xz.mdx",sourceDirName:"data",slug:"/data/xz",permalink:"/docs/data/xz",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/xz.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"xz",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"7z",permalink:"/docs/data/7z"},next:{title:"brotli",permalink:"/docs/data/brotli"}},d={},l=[{value:"Usage",id:"usage",level:2},{value:"Compression",id:"compression",level:3},{value:"Decompression",id:"decompression",level:3}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"xz",children:"XZ"})}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(i.p,{children:["XZ is a data compression format and utility based on the Lempel-Ziv-Markov Chain Algorithm (LZMA). The XZ format itself is an improvement on LZMA, allowing for preprocessing filters similar to ",(0,s.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"})," to increase the resulting archive's compression ratio."]}),"\n",(0,s.jsxs)(i.p,{children:["XZ can only compress one file at a time, so making a ",(0,s.jsx)(i.a,{href:"/docs/data/tar",children:"tar"})," archive of the files you'd like to compress (if there are multiple) is necessary when using XZ."]}),"\n",(0,s.jsx)(i.p,{children:"XZ is more widely supported when compared to other data compression formats, seeing support across iOS, macOS, and many Linux distributions by default. To decompress & compress XZ on Windows, you will likely need the 7-Zip archive utility."}),"\n",(0,s.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsxs)(i.p,{children:["This usage is for the ",(0,s.jsx)(i.code,{children:"xz"})," utility on linux, but is applicable to other platforms where xz can be used. It should be noted that ",(0,s.jsx)(i.code,{children:"xz"}),"'s default behavior is to delete the original file after it has completed the relevant compression or decompression operation, but this can be stopped with the flag below. An arbitary number of files may be passed to xz and it will individually complete the specified operation on each given file."]}),"\n",(0,s.jsx)(i.h3,{id:"compression",children:"Compression"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"xz {file}\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This will result in a file named ",(0,s.jsx)(i.code,{children:"{file}.xz"})," being created in the current working directory."]}),"\n",(0,s.jsx)(i.p,{children:"A more advanced variant is listed here:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"xz -# --extreme -M 800Mib -T 2 -k {file}\n"})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"-#"})," is a number between 0 and 9 specifying speed presets, 0 being the fastest and 9 slowest."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"--extreme"})," is an option allowing xz to use more time than the standard preset level."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"-M {size}"})," is an option restricting the memory usage of ",(0,s.jsx)(i.code,{children:"xz"})," either as a percentage of system memory or an absolute amount."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"-T {threads}"})," is an option restricting the number of threads used by ",(0,s.jsx)(i.code,{children:"xz"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"-k"})," prevents xz from deleting the input file."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"decompression",children:"Decompression"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"xz -d {file}.xz\n"})}),"\n",(0,s.jsx)(i.p,{children:"This decompresses the xz archive to it's original file."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"-M {size}"})," is an option restricting the memory usage of ",(0,s.jsx)(i.code,{children:"xz"})," either as a percentage of system memory or an absolute amount."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"-T {threads}"})," is an option restricting the number of threads used by ",(0,s.jsx)(i.code,{children:"xz"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"-k"})," prevents xz from deleting the input file."]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>a});var s=n(6540);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/be236901.1119a8ec.js b/assets/js/be236901.1119a8ec.js deleted file mode 100644 index 2770dfaba..000000000 --- a/assets/js/be236901.1119a8ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6795],{7090:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var t=i(4848),o=i(8453);const r={title:"Contribution Guide",sidebar_label:"\u2712\ufe0f Contribution Guide",sidebar_position:13},s="Contribution Guide",l={id:"contribution-guide",title:"Contribution Guide",description:"Codec Wiki - community-maintained wiki for all things encoding.",source:"@site/docs/contribution-guide.mdx",sourceDirName:".",slug:"/contribution-guide",permalink:"/docs/contribution-guide",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/contribution-guide.mdx",tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"Contribution Guide",sidebar_label:"\u2712\ufe0f Contribution Guide",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"\ud83d\uddc3\ufe0f Resources",permalink:"/docs/resources"},next:{title:"\u2753 FAQ",permalink:"/docs/FAQ"}},c={},a=[{value:"Before You Contribute",id:"before-you-contribute",level:2},{value:"Connect With Us",id:"connect-with-us",level:3},{value:"Clone & Push Instructions",id:"clone--push-instructions",level:2},{value:"Website",id:"website",level:2},{value:"Installation",id:"installation",level:3},{value:"Local Development",id:"local-development",level:3},{value:"Build",id:"build",level:3},{value:"Deployment",id:"deployment",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"contribution-guide",children:"Contribution Guide"})}),"\n",(0,t.jsx)(n.p,{children:"Codec Wiki - community-maintained wiki for all things encoding."}),"\n",(0,t.jsx)(n.h2,{id:"before-you-contribute",children:"Before You Contribute"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"By contributing to the Codec Wiki, you are communicating that you have read & agreed to our Terms & Conditions, Privacy Policy, & Code of Conduct."}),"\n",(0,t.jsx)(n.li,{children:"Ensure your understanding of the material you're contributing is sufficient to a point where it is useful to the project. It is perfectly acceptable not to get everything right the first time, but always double-check your contributions for factual correctness."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Our current priority is filling out the existing pages with content. Please assist in doing this, if possible, before considering adding new pages."})}),"\n",(0,t.jsx)(n.p,{children:"If you're unsure the content in your entry is completely correct or you believe your entry needs review, please attach the following message at the top of your entry:"}),"\n",(0,t.jsx)(n.admonition,{title:"Pending Review",type:"caution",children:(0,t.jsx)(n.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,t.jsx)(n.p,{children:"If you're aware your entry is too short or incomplete, please add the following message to the top of your entry:"}),"\n",(0,t.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsx)(n.p,{children:"If you've added a new page & you aren't sure what should go there (this isn't recommended while there are still so many empty pages to be filled), add the following message as your page entry:"}),"\n",(0,t.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsx)(n.h3,{id:"connect-with-us",children:"Connect With Us"}),"\n",(0,t.jsx)(n.p,{children:'If you\'d like to join the "AV1 for Dummies" Discord server to communicate with other passionate contributors helping this project, please join using the widget below:'}),"\n",(0,t.jsx)("iframe",{src:"https://discord.com/widget?id=1163724583472472138&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, we have a (soon to be) bridged Revolt server linked ",(0,t.jsx)(n.a,{href:"https://rvlt.gg/eSERRhSG",children:"right here"}),". Revolt is an open-source Discord alternative, which you can read more about on ",(0,t.jsx)(n.a,{href:"https://github.com/revoltchat/legal/blob/master/About.mdx#communication-is-critical",children:"this page"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"clone--push-instructions",children:"Clone & Push Instructions"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Make sure to clone from & edit the"})," ",(0,t.jsx)(n.code,{children:"main"})," ",(0,t.jsx)(n.strong,{children:"branch only, & push your final changes to the"})," ",(0,t.jsx)(n.code,{children:"deployment"})," ",(0,t.jsx)(n.strong,{children:"branch according to the instructions below. Also be sure to use node 18 LTS, as later versions tend to be troublesome."})]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"don't forget to add unimportant files to the .gitignore before making any commits"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Clone from the ",(0,t.jsx)(n.code,{children:"main"})," branch to start to make a contribution:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"% git clone git@github.com:av1-community-contributors/av1-wiki.github.io.git -b main\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"Test your changes locally before making a commit:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"% yarn\n% yarn start\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsxs)(n.li,{children:["Push changes to ",(0,t.jsx)(n.code,{children:"main"})," branch:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'% git add .\n% git commit -m "Commit Message"\n% git push -u origin main\n'})}),"\n",(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsxs)(n.li,{children:["Deploy to ",(0,t.jsx)(n.code,{children:"deployment"})," branch to make live on site:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"% GIT_USER= DEPLOYMENT_BRANCH=deployment yarn deploy\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Docusaurus Info"})}),"\n",(0,t.jsx)(n.h2,{id:"website",children:"Website"}),"\n",(0,t.jsxs)(n.p,{children:["This website is built using ",(0,t.jsx)(n.a,{href:"https://docusaurus.io/",children:"Docusaurus 3"}),", a modern static website generator."]}),"\n",(0,t.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ yarn\n"})}),"\n",(0,t.jsx)(n.h3,{id:"local-development",children:"Local Development"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ yarn start\n"})}),"\n",(0,t.jsx)(n.p,{children:"This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server."}),"\n",(0,t.jsx)(n.h3,{id:"build",children:"Build"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ yarn build\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This command generates static content into the ",(0,t.jsx)(n.code,{children:"build"})," directory and can be served using any static contents hosting service."]}),"\n",(0,t.jsx)(n.h3,{id:"deployment",children:"Deployment"}),"\n",(0,t.jsx)(n.p,{children:"See the initial instructions at the top."})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>l});var t=i(6540);const o={},r=t.createContext(o);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/be236901.b34449f2.js b/assets/js/be236901.b34449f2.js new file mode 100644 index 000000000..2e02ef7e9 --- /dev/null +++ b/assets/js/be236901.b34449f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6795],{4317:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"contribution-guide","title":"Contribution Guide","description":"Codec Wiki - community-maintained wiki for all things encoding.","source":"@site/docs/contribution-guide.mdx","sourceDirName":".","slug":"/contribution-guide","permalink":"/docs/contribution-guide","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/contribution-guide.mdx","tags":[],"version":"current","sidebarPosition":13,"frontMatter":{"title":"Contribution Guide","sidebar_label":"\u2712\ufe0f Contribution Guide","sidebar_position":13},"sidebar":"tutorialSidebar","previous":{"title":"\ud83d\uddc3\ufe0f Resources","permalink":"/docs/resources"},"next":{"title":"\u2753 FAQ","permalink":"/docs/FAQ"}}');var o=i(4848),r=i(8453);const s={title:"Contribution Guide",sidebar_label:"\u2712\ufe0f Contribution Guide",sidebar_position:13},l="Contribution Guide",c={},a=[{value:"Before You Contribute",id:"before-you-contribute",level:2},{value:"Connect With Us",id:"connect-with-us",level:3},{value:"Clone & Push Instructions",id:"clone--push-instructions",level:2},{value:"Website",id:"website",level:2},{value:"Installation",id:"installation",level:3},{value:"Local Development",id:"local-development",level:3},{value:"Build",id:"build",level:3},{value:"Deployment",id:"deployment",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"contribution-guide",children:"Contribution Guide"})}),"\n",(0,o.jsx)(n.p,{children:"Codec Wiki - community-maintained wiki for all things encoding."}),"\n",(0,o.jsx)(n.h2,{id:"before-you-contribute",children:"Before You Contribute"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"By contributing to the Codec Wiki, you are communicating that you have read & agreed to our Terms & Conditions, Privacy Policy, & Code of Conduct."}),"\n",(0,o.jsx)(n.li,{children:"Ensure your understanding of the material you're contributing is sufficient to a point where it is useful to the project. It is perfectly acceptable not to get everything right the first time, but always double-check your contributions for factual correctness."}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Our current priority is filling out the existing pages with content. Please assist in doing this, if possible, before considering adding new pages."})}),"\n",(0,o.jsx)(n.p,{children:"If you're unsure the content in your entry is completely correct or you believe your entry needs review, please attach the following message at the top of your entry:"}),"\n",(0,o.jsx)(n.admonition,{title:"Pending Review",type:"caution",children:(0,o.jsx)(n.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,o.jsx)(n.p,{children:"If you're aware your entry is too short or incomplete, please add the following message to the top of your entry:"}),"\n",(0,o.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,o.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,o.jsx)(n.p,{children:"If you've added a new page & you aren't sure what should go there (this isn't recommended while there are still so many empty pages to be filled), add the following message as your page entry:"}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(n.h3,{id:"connect-with-us",children:"Connect With Us"}),"\n",(0,o.jsx)(n.p,{children:'If you\'d like to join the "AV1 for Dummies" Discord server to communicate with other passionate contributors helping this project, please join using the widget below:'}),"\n",(0,o.jsx)("iframe",{src:"https://discord.com/widget?id=1163724583472472138&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"}),"\n",(0,o.jsxs)(n.p,{children:["Alternatively, we have a (soon to be) bridged Revolt server linked ",(0,o.jsx)(n.a,{href:"https://rvlt.gg/eSERRhSG",children:"right here"}),". Revolt is an open-source Discord alternative, which you can read more about on ",(0,o.jsx)(n.a,{href:"https://github.com/revoltchat/legal/blob/master/About.mdx#communication-is-critical",children:"this page"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"clone--push-instructions",children:"Clone & Push Instructions"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Make sure to clone from & edit the"})," ",(0,o.jsx)(n.code,{children:"main"})," ",(0,o.jsx)(n.strong,{children:"branch only, & push your final changes to the"})," ",(0,o.jsx)(n.code,{children:"deployment"})," ",(0,o.jsx)(n.strong,{children:"branch according to the instructions below. Also be sure to use node 18 LTS, as later versions tend to be troublesome."})]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.em,{children:"don't forget to add unimportant files to the .gitignore before making any commits"})}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Clone from the ",(0,o.jsx)(n.code,{children:"main"})," branch to start to make a contribution:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"% git clone git@github.com:av1-community-contributors/av1-wiki.github.io.git -b main\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsx)(n.li,{children:"Test your changes locally before making a commit:"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"% yarn\n% yarn start\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["Push changes to ",(0,o.jsx)(n.code,{children:"main"})," branch:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'% git add .\n% git commit -m "Commit Message"\n% git push -u origin main\n'})}),"\n",(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsxs)(n.li,{children:["Deploy to ",(0,o.jsx)(n.code,{children:"deployment"})," branch to make live on site:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"% GIT_USER= DEPLOYMENT_BRANCH=deployment yarn deploy\n"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.em,{children:"Docusaurus Info"})}),"\n",(0,o.jsx)(n.h2,{id:"website",children:"Website"}),"\n",(0,o.jsxs)(n.p,{children:["This website is built using ",(0,o.jsx)(n.a,{href:"https://docusaurus.io/",children:"Docusaurus 3"}),", a modern static website generator."]}),"\n",(0,o.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"$ yarn\n"})}),"\n",(0,o.jsx)(n.h3,{id:"local-development",children:"Local Development"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"$ yarn start\n"})}),"\n",(0,o.jsx)(n.p,{children:"This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server."}),"\n",(0,o.jsx)(n.h3,{id:"build",children:"Build"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"$ yarn build\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This command generates static content into the ",(0,o.jsx)(n.code,{children:"build"})," directory and can be served using any static contents hosting service."]}),"\n",(0,o.jsx)(n.h3,{id:"deployment",children:"Deployment"}),"\n",(0,o.jsx)(n.p,{children:"See the initial instructions at the top."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>l});var t=i(6540);const o={},r=t.createContext(o);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bf9d09b6.3ec2a4e8.js b/assets/js/bf9d09b6.3ec2a4e8.js deleted file mode 100644 index f83036e94..000000000 --- a/assets/js/bf9d09b6.3ec2a4e8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8270],{6491:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>j,frontMatter:()=>l,metadata:()=>h,toc:()=>a});var n=r(4848),s=r(8453),i=r(1470),d=r(9365);const l={title:"SVT-HEVC",sidebar_position:10},c="SVT-HEVC",h={id:"encoders/SVT-HEVC",title:"SVT-HEVC",description:'SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the "Scalable Video Technology" project lineup by Intel.',source:"@site/docs/encoders/SVT-HEVC.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-HEVC.mdx",tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"SVT-HEVC",sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"SVT-VP9",permalink:"/docs/encoders/SVT-VP9"},next:{title:"Kvazaar",permalink:"/docs/encoders/Kvazaar"}},o={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Normal usage",id:"normal-usage",level:3},{value:"Encoding HDR",id:"encoding-hdr",level:3},{value:"Encoding with Dolby Vision",id:"encoding-with-dolby-vision",level:3},{value:"List of all configuration parameters",id:"list-of-all-configuration-parameters",level:2}];function x(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"svt-hevc",children:"SVT-HEVC"})}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC",children:"SVT-HEVC"})," (Scalable Video Technology for HEVC) is an open source ",(0,n.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265 / HEVC"})," software encoder developed by Intel made specifically to ",(0,n.jsx)(t.strong,{children:"only support x86"}),'. As the name suggests, it is part of the "',(0,n.jsx)(t.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"Scalable Video Technology"}),'" project lineup by Intel.']}),"\n",(0,n.jsxs)(t.p,{children:["The encoder is written in C with some parts in Assembly and licensed under ",(0,n.jsx)(t.strong,{children:"BSD+Patent"}),"."]}),"\n",(0,n.jsx)(t.admonition,{type:"info",children:(0,n.jsxs)(t.p,{children:["It is recommended to use ",(0,n.jsx)(t.a,{href:"/docs/encoders/x265",children:"x265"})," instead as it performs much better in quality."]})}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-HEVC is only available in FFmpeg when it is compiled with their provided ",(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/tree/master/ffmpeg_plugin",children:"plugin"}),". Otherwise it is via ",(0,n.jsx)(t.code,{children:"libsvt_hevc"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=libsvt_hevc"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"SVT-HEVC supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(i.A,{children:[(0,n.jsxs)(d.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsx)(t.p,{children:"To build SVT-AV1 from source, first clone the SVT-HEVC repository & enter the build directory."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Clone SVT-HEVC and cd"',children:"git clone https://github.com/OpenVisualCloud/SVT-HEVC\ncd SVT-HEVC/Build/linux\n"})}),(0,n.jsxs)(t.p,{children:["In the directory, simply run ",(0,n.jsx)(t.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.5.1 or higher and either GCC or Clang. It is recommended to use Clang when building SVT-HEVC."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Statically build release"',children:"./build.sh static release\n"})}),(0,n.jsxs)(t.p,{children:["The compiled binaries will be in the ",(0,n.jsx)(t.code,{children:"Bin/Release"})," directory."]})]}),(0,n.jsx)(d.A,{value:"windows",label:"Windows",children:(0,n.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})})]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.h3,{id:"normal-usage",children:"Normal usage"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Simple Y4M input with QP 20, and raw 265 bitstream output"',children:"SvtHevcEncApp -i input.y4m -q 20 -b output.265\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Preset 4, CRF 20, Y4M input"',children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -b output.265\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | SvtHevcEncApp -i stdin -q 20 -encMode 4 -b output.265\n"})}),"\n",(0,n.jsx)(t.admonition,{type:"danger",children:(0,n.jsxs)(t.p,{children:["SVT-HEVC currently does not have the ability to detect EOF (End of File) within Y4M pipes (",(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/issues/634#issuecomment-1434911798",children:"issue"}),"), so the encode process will go on indefinitely until your drive is full.\nThe only known solution is to manually set the number of frames to encode via ",(0,n.jsx)(t.code,{children:"-n"}),"."]})}),"\n",(0,n.jsx)(t.h3,{id:"encoding-hdr",children:"Encoding HDR"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -hdr -max-cll XXX -max-fall XXX -master-display G(0.265,0.690)B(0.150,0.060)R(0.680,0.320)WP(0.3127,0.3290)L(1000,0.0100) -b output.265\n"})}),"\n",(0,n.jsx)(t.p,{children:"Remember sure to adjust the HDR metadata accordingly."}),"\n",(0,n.jsx)(t.h3,{id:"encoding-with-dolby-vision",children:"Encoding with Dolby Vision"}),"\n",(0,n.jsx)(t.p,{children:"The ability to encode with Dolby Vision via RPU file is surprisingly present within SVT-HEVC, although it is limited to Profile 8.1."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -hdr -dolby-vision-rpu RPUFile.bin -dolby-vision-profile 81 -max-cll XXX -max-fall XXX -master-display G(0.265,0.690)B(0.150,0.060)R(0.680,0.320)WP(0.3127,0.3290)L(1000,0.0100) -b output.265\n"})}),"\n",(0,n.jsx)(t.p,{children:"Remember sure to adjust the HDR metadata accordingly."}),"\n",(0,n.jsx)(t.h2,{id:"list-of-all-configuration-parameters",children:"List of all configuration parameters"}),"\n",(0,n.jsxs)(t.p,{children:['As with every SVT line-up, they redirect you to read their "User Guide" instead of presenting what each and every parameter do in the ',(0,n.jsx)(t.code,{children:"--help"})," page.\nThe table below is an exact copy from their user guide taken from ",(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/blob/master/Docs/svt-hevc_encoder_user_guide.md",children:"GitHub"})," for backup purposes. Feel free to read them."]}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Encoder Parameter as shown in the configuration file"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Command Line parameter"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Range"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Default"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Description"})})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Channel Number"})}),(0,n.jsx)(t.td,{children:"-nch"}),(0,n.jsx)(t.td,{children:"[1 - 6]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Number of encode instances"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ConfigFile"})}),(0,n.jsx)(t.td,{children:"-c"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Configuration file path"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"InputFile"})}),(0,n.jsx)(t.td,{children:"-i"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Input file path and name"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"StreamFile"})}),(0,n.jsx)(t.td,{children:"-b"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Output bitstream file path and name"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ErrorFile"})}),(0,n.jsx)(t.td,{children:"-errlog"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"stderr"}),(0,n.jsx)(t.td,{children:"Error log displaying configuration or encode errors"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ReconFile"})}),(0,n.jsx)(t.td,{children:"-o"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsxs)(t.td,{children:["Output reconstructed yuv used for debug purposes. ",(0,n.jsx)(t.strong,{children:"Note:"})," using this feature will affect the speed of the encoder significantly. This should only be used for debugging purposes."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UseQpFile"})}),(0,n.jsx)(t.td,{children:"-use-q-file"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"When set to 1, overwrite the picture qp assignment using qp values in QpFile"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"QpFile"})}),(0,n.jsx)(t.td,{children:"-qp-file"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Path to qp file"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SegmentOvFile"})}),(0,n.jsx)(t.td,{children:"-segment-ov-file"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Path to segment override file which will allow for sharpness improvement and bit rate reduction on a per segment basis. Refer to config/SVTSegmentOvFile.txt for details."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"EncoderMode"})}),(0,n.jsx)(t.td,{children:"-encMode"}),(0,n.jsx)(t.td,{children:"[0 - 11]"}),(0,n.jsx)(t.td,{children:"7"}),(0,n.jsx)(t.td,{children:"A preset defining the quality vs density tradeoff point that the encoding is to be performed at. (e.g. 0 is the highest quality mode, 11 is the highest density mode). Section 3.4 outlines the preset availability per resolution"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"EncoderBitDepth"})}),(0,n.jsx)(t.td,{children:"-bit-depth"}),(0,n.jsx)(t.td,{children:"[8, 10]"}),(0,n.jsx)(t.td,{children:"8"}),(0,n.jsx)(t.td,{children:"Specifies the bit depth of input video"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"EncoderColorFormat"})}),(0,n.jsx)(t.td,{children:"-color-format"}),(0,n.jsx)(t.td,{children:"[1, 2, 3]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Specifies the chroma subsampling of input video(1: 420, 2: 422, 3: 444)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"CompressedTenBitFormat"})}),(0,n.jsx)(t.td,{children:"-compressed-ten-bit-format"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Offline packing of the 2bits: requires two bits packed input (0: OFF, 1: ON)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SourceWidth"})}),(0,n.jsx)(t.td,{children:"-w"}),(0,n.jsx)(t.td,{children:"[64 - 8192]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Input source width"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SourceHeight"})}),(0,n.jsx)(t.td,{children:"-h"}),(0,n.jsx)(t.td,{children:"[64 - 4320]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Input source height"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameToBeEncoded"})}),(0,n.jsx)(t.td,{children:"-n"}),(0,n.jsx)(t.td,{children:"[0 - 2^31 -1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Number of frames to be encoded, if number of frames is > number of frames in file, the encoder will loop to the beginning and continue the encode. 0 encodes the full clip."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BufferedInput"})}),(0,n.jsx)(t.td,{children:"-nb"}),(0,n.jsx)(t.td,{children:"[-1, 1 to 2^31 -1]"}),(0,n.jsx)(t.td,{children:"-1"}),(0,n.jsx)(t.td,{children:"number of frames to preload to the RAM before the start of the encode. If -nb = 100 and \u2013n 1000 --\x3e the encoder will encode the first 100 frames of the video 10 times. Use -1 to not preload any frames. This parameter is best used to eliminate the impact of disk reading on encoding speed and is most noticeable when frames sizes are 4k or 8k. Because frames are repeated when value specified (-nb) is less than the total frame count (-n), you should expect bitstreams to be different."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Profile"})}),(0,n.jsx)(t.td,{children:"-profile"}),(0,n.jsx)(t.td,{children:"[1,2]"}),(0,n.jsx)(t.td,{children:"2"}),(0,n.jsx)(t.td,{children:"1: Main, 2: Main 10"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Tier"})}),(0,n.jsx)(t.td,{children:"-tier"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0: Main, 1: High"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Level"})}),(0,n.jsx)(t.td,{children:"-level"}),(0,n.jsx)(t.td,{children:"[1, 2, 2.1,3, 3.1, 4, 4.1, 5, 5.1, 5.2, 6, 6.1, 6.2]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0 to 6.2 [0 for auto determine Level]"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameRate"})}),(0,n.jsx)(t.td,{children:"-fps"}),(0,n.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,n.jsx)(t.td,{children:"60"}),(0,n.jsx)(t.td,{children:"If the number is less than 1000, the input frame rate is an integer number between 1 and 60, else the input number is in Q16 format (shifted by 16 bits) [Max allowed is 240 fps]. If FrameRateNumerator and FrameRateDenominator are both !=0 the encoder will ignore this parameter"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameRateNumerator"})}),(0,n.jsx)(t.td,{children:"-fps-num"}),(0,n.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Frame rate numerator e.g. 6000 When zero, the encoder will use \u2013fps if FrameRateDenominator is also zero, otherwise an error is returned"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameRateDenominator"})}),(0,n.jsx)(t.td,{children:"-fps-denom"}),(0,n.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Frame rate denominator e.g. 100 When zero, the encoder will use \u2013fps if FrameRateNumerator is also zero, otherwise an error is returned"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Injector"})}),(0,n.jsx)(t.td,{children:"-inj"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enable injection of input frames at the specified framerate (0: OFF, 1: ON)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"InjectorFrameRate"})}),(0,n.jsx)(t.td,{children:"-inj-frm-rt"}),(0,n.jsx)(t.td,{children:"[1 - 240]"}),(0,n.jsx)(t.td,{children:"60"}),(0,n.jsx)(t.td,{children:"Frame Rate used for the injector. Recommended to match the encoder speed."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SpeedControlFlag"})}),(0,n.jsx)(t.td,{children:"-speed-ctrl"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables the Speed Control functionality to achieve the real-time encoding speed defined by \u2013fps. When this parameter is set to 1 it forces \u2013inj to be 1 and -inj-frm-rt to be set to \u2013fps."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"InterlacedVideo"})}),(0,n.jsx)(t.td,{children:"-interlaced-video"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"1 : encoder will signal interlaced signal in the stream
0 : assumes progressive signal"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SeparateFields"})}),(0,n.jsx)(t.td,{children:"-separate-fields"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"1 : Interlaced input, application will separate top and bottom fields and encode it as progressive.
0 : Treat video as progressive video"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"HierarchicalLevels"})}),(0,n.jsx)(t.td,{children:"-hierarchical-levels"}),(0,n.jsx)(t.td,{children:"[0 \u2013 3]"}),(0,n.jsx)(t.td,{children:"3"}),(0,n.jsx)(t.td,{children:"0 : Flat
1: 2-Level Hierarchy
2: 3-Level Hierarchy
3: 4-Level Hierarchy
Minigop Size = (2^HierarchicalLevels)
(e.g. 3 == > 7B pyramid, 2 ==> 3B Pyramid)
Refer to Appendix A.1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BaseLayerSwitchMode"})}),(0,n.jsx)(t.td,{children:"-base-layer-switch-mode"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0 : Use B-frames in the base layer pointing to the same past picture
1 : Use P-frames in the base layer
Refer to Appendix A.1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"PredStructure"})}),(0,n.jsx)(t.td,{children:"-pred-struct"}),(0,n.jsx)(t.td,{children:"[0 \u2013 2]"}),(0,n.jsx)(t.td,{children:"2"}),(0,n.jsx)(t.td,{children:"0: Low Delay P
1: Low Delay B
2: Random Access
Refer to Appendix A.1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"IntraPeriod"})}),(0,n.jsx)(t.td,{children:"-intra-period"}),(0,n.jsx)(t.td,{children:"[-2 - 255]"}),(0,n.jsx)(t.td,{children:"-2"}),(0,n.jsx)(t.td,{children:"Distance between Intra Frame inserted.
-1 denotes no intra update.
-2 denotes auto."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"IntraRefreshType"})}),(0,n.jsx)(t.td,{children:"-irefresh-type"}),(0,n.jsx)(t.td,{children:"[-1,N]"}),(0,n.jsx)(t.td,{children:"-1"}),(0,n.jsx)(t.td,{children:"-1: CRA (Open GOP)
>=0: IDR (Closed GOP, N is headers insertion interval, 0 supported if CQP, >=0 supported if VBR)
Refer to Appendix A.3"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"QP"})}),(0,n.jsx)(t.td,{children:"-q"}),(0,n.jsx)(t.td,{children:"[0 - 51]"}),(0,n.jsx)(t.td,{children:"32"}),(0,n.jsx)(t.td,{children:"Initial quantization parameter for the Intra pictures used when RateControlMode 0 (CQP)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"LoopFilterDisable"})}),(0,n.jsx)(t.td,{children:"-dlf"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"When set to 1 disables the Deblocking Loop Filtering"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SAO"})}),(0,n.jsx)(t.td,{children:"-sao"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"When set to 0 the encoder will not use the Sample Adaptive Filter"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UseDefaultMeHme"})}),(0,n.jsx)(t.td,{children:"-use-default-me-hme"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"0 : Overwrite Default ME HME parameters
1 : Use default ME HME parameters, dependent on width and height"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"HME"})}),(0,n.jsx)(t.td,{children:"-hme"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enable HME, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SearchAreaWidth"})}),(0,n.jsx)(t.td,{children:"-search-w"}),(0,n.jsx)(t.td,{children:"[1 - 256]"}),(0,n.jsx)(t.td,{children:"Depends on input resolution"}),(0,n.jsx)(t.td,{children:"Motion vector search area width"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SearchAreaHeight"})}),(0,n.jsx)(t.td,{children:"-search-h"}),(0,n.jsx)(t.td,{children:"[1 - 256]"}),(0,n.jsx)(t.td,{children:"Depends on input resolution"}),(0,n.jsx)(t.td,{children:"Motion vector search area height"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ConstrainedIntra"})}),(0,n.jsx)(t.td,{children:"-constrd-intra"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Allow the use of Constrained Intra, when enabled, this features yields to sending two PPSs in the HEVC Elementary streams
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"RateControlMode"})}),(0,n.jsx)(t.td,{children:"-rc"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0 : CQP , 1 : VBR"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TargetBitRate"})}),(0,n.jsx)(t.td,{children:"-tbr"}),(0,n.jsx)(t.td,{children:"Any Number"}),(0,n.jsx)(t.td,{children:"7000000"}),(0,n.jsx)(t.td,{children:"Target bitrate in bits / second. Only used when RateControlMode is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"vbvMaxrate"})}),(0,n.jsx)(t.td,{children:"-vbv-maxrate"}),(0,n.jsx)(t.td,{children:"Any Number"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"VBVMaxrate in bits / second. Only used when RateControlMode is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"vbvBufsize"})}),(0,n.jsx)(t.td,{children:"-vbv-bufsize"}),(0,n.jsx)(t.td,{children:"Any Number"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"VBV BufferSize in bits / second. Only used when RateControlMode is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"vbvBufInit"})}),(0,n.jsx)(t.td,{children:"-vbv-init"}),(0,n.jsx)(t.td,{children:"[0 - 100]"}),(0,n.jsx)(t.td,{children:"90"}),(0,n.jsx)(t.td,{children:"Sets the initial percentage size that the VBV buffer is filled to"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"hrdFlag"})}),(0,n.jsx)(t.td,{children:"-hrd"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["Sets the HRD (Hypothetical Reference Decoder) Flag in the encoded stream, 0 = OFF, 1 = ON When",(0,n.jsx)("br",{}),"hrdFlag is set to 1, vbvMaxrate and vbvBufsize must be greater than 0"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MaxQpAllowed"})}),(0,n.jsx)(t.td,{children:"-max-qp"}),(0,n.jsx)(t.td,{children:"[0 - 51]"}),(0,n.jsx)(t.td,{children:"48"}),(0,n.jsx)(t.td,{children:"Maximum QP value allowed for rate control use. Only used when RateControlMode is set to 1. Has to be >= MinQpAllowed"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MinQpAllowed"})}),(0,n.jsx)(t.td,{children:"-min-qp"}),(0,n.jsx)(t.td,{children:"[0 - 50]"}),(0,n.jsx)(t.td,{children:"10"}),(0,n.jsx)(t.td,{children:"Minimum QP value allowed for rate control use. Only used when RateControlMode is set to 1. Has to be < MaxQpAllowed"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"LookAheadDistance"})}),(0,n.jsx)(t.td,{children:"-lad"}),(0,n.jsx)(t.td,{children:"[0 - 250]"}),(0,n.jsx)(t.td,{children:"Depending on BRC mode"}),(0,n.jsx)(t.td,{children:"When RateControlMode is set to 1 it's best to set this parameter to be equal to the Intra period value (such is the default set by the encoder). When CQP is chosen, then a (2 * minigopsize +1) look ahead is recommended."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SceneChangeDetection"})}),(0,n.jsx)(t.td,{children:"-scd"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables the scene change detection algorithm
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BitRateReduction"})}),(0,n.jsx)(t.td,{children:"-brr"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables visual quality algorithms to reduce the output bitrate with minimal or no subjective visual quality impact.
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ImproveSharpness"})}),(0,n.jsx)(t.td,{children:"-sharp"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"This is a visual quality knob that allows the use of adaptive quantization within the picture and enables visual quality algorithms that improve the sharpness of the background. This feature is only available for 4k and 8k resolutions
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"VideoUsabilityInfo"})}),(0,n.jsx)(t.td,{children:"-vid-info"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables or disables sending a vui structure in the HEVC Elementary bitstream. 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"HighDynamicRangeInput"})}),(0,n.jsx)(t.td,{children:"-hdr"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"When set to 1, signals HDR10 input in the output HEVC elementary bitstream and forces VideoUsabilityInfo to 1.
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"AccessUnitDelimiter"})}),(0,n.jsx)(t.td,{children:"-ua-delm"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BufferingPeriod"})}),(0,n.jsx)(t.td,{children:"-pbuff"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"PictureTiming"})}),(0,n.jsx)(t.td,{children:"-tpic"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON.
If 1, VideoUsabilityInfo should be also set to 1."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"RegisteredUserData"})}),(0,n.jsx)(t.td,{children:"-reg-user-data"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UnregisteredUserData"})}),(0,n.jsx)(t.td,{children:"-unreg-user-data"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"RecoveryPoint"})}),(0,n.jsx)(t.td,{children:"-recovery-point"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TemporalId"})}),(0,n.jsx)(t.td,{children:"-temporal-id"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"0 = OFF
1 = Insert temporal ID in NAL units"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"AsmType"})}),(0,n.jsx)(t.td,{children:"-asm"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Assembly instruction set
(0: C Only, 1: Automatically select highest assembly instruction set supported)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"LogicalProcessors"})}),(0,n.jsx)(t.td,{children:"-lp"}),(0,n.jsx)(t.td,{children:"[0, total number of logical processor]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The number of logical processor which encoder threads run on.Refer to Appendix A.2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FirstLogicalProcessor"})}),(0,n.jsx)(t.td,{children:"-flp"}),(0,n.jsx)(t.td,{children:"[0, the index of last logical processor]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The index of first logical processor which encoder threads run on.Refer to Appendix A.2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TargetSocket"})}),(0,n.jsx)(t.td,{children:"-ss"}),(0,n.jsx)(t.td,{children:"[-1,1]"}),(0,n.jsx)(t.td,{children:"-1"}),(0,n.jsx)(t.td,{children:"For dual socket systems, this can specify which socket the encoder runs on. Refer to Appendix A.2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ThreadCount"})}),(0,n.jsx)(t.td,{children:"-thread-count"}),(0,n.jsx)(t.td,{children:"[0,N]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The number of threads to get created and run, 0 = AUTO"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SwitchThreadsToRtPriority"})}),(0,n.jsx)(t.td,{children:"-rt"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables threads to real time priority, 0 = OFF, 1 = ON (only works on Linux)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FPSInVPS"})}),(0,n.jsx)(t.td,{children:"-fpsinvps"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables the VPS timing info, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TileRowCount"})}),(0,n.jsx)(t.td,{children:"-tile_row_cnt"}),(0,n.jsx)(t.td,{children:"[1,22]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Tile count in the Row"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TileColumnCount"})}),(0,n.jsx)(t.td,{children:"-tile_col_cnt"}),(0,n.jsx)(t.td,{children:"[1,20]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Tile count in the column"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TileSliceMode"})}),(0,n.jsx)(t.td,{children:"-tile_slice_mode"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Per slice per tile, only valid for multi-tile"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UnrestrictedMotionVector"})}),(0,n.jsx)(t.td,{children:"-umv"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables unrestricted motion vectors
0 = OFF(motion vectors are constrained within frame or tile boundary)
1 = ON.
For MCTS support, set -umv 0 with valid TileRowCount and TileColumnCount"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MaxCLL"})}),(0,n.jsx)(t.td,{children:"-max-cll"}),(0,n.jsx)(t.td,{children:"[0 , 2^16-1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Maximum content light level (MaxCLL) as required by the Consumer Electronics Association 861.3 specification. Applicable for HDR content. If specified, signaled only when HighDynamicRangeInput is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MaxFALL"})}),(0,n.jsx)(t.td,{children:"-max-fall"}),(0,n.jsx)(t.td,{children:"[0 , 2^16-1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Maximum Frame Average light level (MaxFALL) as required by the Consumer Electronics Association 861.3 specification. Applicable for HDR content. If specified, signaled only when HighDynamicRangeInput is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UseMasterDisplay"})}),(0,n.jsx)(t.td,{children:"-use-master-display"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables or disables the MasterDisplayColorVolume
0 = OFF
1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MasterDisplay"})}),(0,n.jsx)(t.td,{children:"-master-display"}),(0,n.jsx)(t.td,{children:"For R, G, B and whitepoint [0, 2^16-1]. For max, min luminance [0, 2^32-1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SMPTE ST 2086 mastering display color volume SEI info, specified as a string. The string format is \u201cG(%hu,%hu)B(%hu,%hu)R(%hu,% hu)WP(%hu,%hu)L(%u,%u)\u201d where %hu are unsigned 16bit integers and %u are unsigned 32bit integers. The SEI includes X, Y display primaries for RGB channels and white point (WP) in units of 0.00002 and max, min luminance (L) values in units of 0.0001 candela per meter square. Applicable for HDR content. Example for a P3D65 1000-nits monitor,G(13250,34500)B(7500,3 000)R(34000,16000)WP(15635,16 450)L(10000000,1)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"DolbyVisionRpuFile"})}),(0,n.jsx)(t.td,{children:"-dolby-vision-rpu"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Path to the file containing Dolby Vision RPU metadata"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"DolbyVisionProfile"})}),(0,n.jsx)(t.td,{children:"-dolby-vision-profile"}),(0,n.jsx)(t.td,{children:"8.1 or 81"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Generate bitstreams confirming to the specified Dolby Vision profile 8.1. When specified, enables HighDynamicRangeInput automatically. Applicable only for 10-bit input content. MasterDisplay should be set for using dolby vision profile 81. Pass the dynamic metadata through DolbyVisionRpuFile option"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"NaluFile"})}),(0,n.jsx)(t.td,{children:"-nalu-file"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsxs)(t.td,{children:["Path to the file containing CEA 608/708 metadata. Text file should contain the userSEI in POC order as per below format: ",(0,n.jsx)(t.code,{children:"/"}),". Currently only PREFIX_SEI messages are supported"]})]})]})]})]})}function j(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(x,{...e})}):x(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>d});r(6540);var n=r(4164);const s={tabItem:"tabItem_Ymn6"};var i=r(4848);function d(e){let{children:t,hidden:r,className:d}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,d),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),s=r(4164),i=r(3104),d=r(6347),l=r(205),c=r(7485),h=r(1682),o=r(679);function a(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function x(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return a(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:s}}=e;return{value:t,label:r,attributes:n,default:s}}))}(r);return function(e){const t=(0,h.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function j(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function u(e){let{queryString:t=!1,groupId:r}=e;const s=(0,d.W6)(),i=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,c.aZ)(i),(0,n.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(s.location.search);t.set(i,e),s.replace({...s.location,search:t.toString()})}),[i,s])]}function p(e){const{defaultValue:t,queryString:r=!1,groupId:s}=e,i=x(e),[d,c]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!j({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:i}))),[h,a]=u({queryString:r,groupId:s}),[p,m]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,i]=(0,o.Dv)(r);return[s,(0,n.useCallback)((e=>{r&&i.set(e)}),[r,i])]}({groupId:s}),g=(()=>{const e=h??p;return j({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{g&&c(g)}),[g]);return{selectedValue:d,selectValue:(0,n.useCallback)((e=>{if(!j({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);c(e),a(e),m(e)}),[a,m,i]),tabValues:i}}var m=r(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=r(4848);function b(e){let{className:t,block:r,selectedValue:n,selectValue:d,tabValues:l}=e;const c=[],{blockElementScrollPositionUntilNextRender:h}=(0,i.a_)(),o=e=>{const t=e.currentTarget,r=c.indexOf(t),s=l[r].value;s!==n&&(h(t),d(s))},a=e=>{let t=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:i}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>c.push(e),onKeyDown:a,onClick:o,...i,className:(0,s.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function v(e){let{lazy:t,children:r,selectedValue:i}=e;const d=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=d.find((e=>e.props.value===i));return e?(0,n.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:d.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function y(e){const t=p(e);return(0,f.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,f.jsx)(b,{...t,...e}),(0,f.jsx)(v,{...t,...e})]})}function w(e){const t=(0,m.A)();return(0,f.jsx)(y,{...e,children:a(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>l});var n=r(6540);const s={},i=n.createContext(s);function d(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bf9d09b6.c0b10498.js b/assets/js/bf9d09b6.c0b10498.js new file mode 100644 index 000000000..468a8d283 --- /dev/null +++ b/assets/js/bf9d09b6.c0b10498.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8270],{8714:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>h,default:()=>j,frontMatter:()=>c,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"encoders/SVT-HEVC","title":"SVT-HEVC","description":"SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the \\"Scalable Video Technology\\" project lineup by Intel.","source":"@site/docs/encoders/SVT-HEVC.mdx","sourceDirName":"encoders","slug":"/encoders/SVT-HEVC","permalink":"/docs/encoders/SVT-HEVC","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-HEVC.mdx","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"SVT-HEVC","sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"SVT-VP9","permalink":"/docs/encoders/SVT-VP9"},"next":{"title":"Kvazaar","permalink":"/docs/encoders/Kvazaar"}}');var s=r(4848),i=r(8453),d=r(1470),l=r(9365);const c={title:"SVT-HEVC",sidebar_position:10},h="SVT-HEVC",o={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Normal usage",id:"normal-usage",level:3},{value:"Encoding HDR",id:"encoding-hdr",level:3},{value:"Encoding with Dolby Vision",id:"encoding-with-dolby-vision",level:3},{value:"List of all configuration parameters",id:"list-of-all-configuration-parameters",level:2}];function x(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"svt-hevc",children:"SVT-HEVC"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC",children:"SVT-HEVC"})," (Scalable Video Technology for HEVC) is an open source ",(0,s.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265 / HEVC"})," software encoder developed by Intel made specifically to ",(0,s.jsx)(t.strong,{children:"only support x86"}),'. As the name suggests, it is part of the "',(0,s.jsx)(t.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"Scalable Video Technology"}),'" project lineup by Intel.']}),"\n",(0,s.jsxs)(t.p,{children:["The encoder is written in C with some parts in Assembly and licensed under ",(0,s.jsx)(t.strong,{children:"BSD+Patent"}),"."]}),"\n",(0,s.jsx)(t.admonition,{type:"info",children:(0,s.jsxs)(t.p,{children:["It is recommended to use ",(0,s.jsx)(t.a,{href:"/docs/encoders/x265",children:"x265"})," instead as it performs much better in quality."]})}),"\n",(0,s.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(t.p,{children:["SVT-HEVC is only available in FFmpeg when it is compiled with their provided ",(0,s.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/tree/master/ffmpeg_plugin",children:"plugin"}),". Otherwise it is via ",(0,s.jsx)(t.code,{children:"libsvt_hevc"}),", to check if you have it, run ",(0,s.jsx)(t.code,{children:"ffmpeg -h encoder=libsvt_hevc"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,s.jsx)(t.p,{children:"SVT-HEVC supports the following color spaces:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Format"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,s.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YUV420P"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(t.td,{children:"8-bit"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YUV420P10LE"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(d.A,{children:[(0,s.jsxs)(l.A,{value:"unixlike",label:"Linux & macOS",children:[(0,s.jsx)(t.p,{children:"To build SVT-AV1 from source, first clone the SVT-HEVC repository & enter the build directory."}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Clone SVT-HEVC and cd"',children:"git clone https://github.com/OpenVisualCloud/SVT-HEVC\ncd SVT-HEVC/Build/linux\n"})}),(0,s.jsxs)(t.p,{children:["In the directory, simply run ",(0,s.jsx)(t.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.5.1 or higher and either GCC or Clang. It is recommended to use Clang when building SVT-HEVC."]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Statically build release"',children:"./build.sh static release\n"})}),(0,s.jsxs)(t.p,{children:["The compiled binaries will be in the ",(0,s.jsx)(t.code,{children:"Bin/Release"})," directory."]})]}),(0,s.jsx)(l.A,{value:"windows",label:"Windows",children:(0,s.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,s.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})})]}),"\n",(0,s.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(t.h3,{id:"normal-usage",children:"Normal usage"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Simple Y4M input with QP 20, and raw 265 bitstream output"',children:"SvtHevcEncApp -i input.y4m -q 20 -b output.265\n"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Preset 4, CRF 20, Y4M input"',children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -b output.265\n"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | SvtHevcEncApp -i stdin -q 20 -encMode 4 -b output.265\n"})}),"\n",(0,s.jsx)(t.admonition,{type:"danger",children:(0,s.jsxs)(t.p,{children:["SVT-HEVC currently does not have the ability to detect EOF (End of File) within Y4M pipes (",(0,s.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/issues/634#issuecomment-1434911798",children:"issue"}),"), so the encode process will go on indefinitely until your drive is full.\nThe only known solution is to manually set the number of frames to encode via ",(0,s.jsx)(t.code,{children:"-n"}),"."]})}),"\n",(0,s.jsx)(t.h3,{id:"encoding-hdr",children:"Encoding HDR"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -hdr -max-cll XXX -max-fall XXX -master-display G(0.265,0.690)B(0.150,0.060)R(0.680,0.320)WP(0.3127,0.3290)L(1000,0.0100) -b output.265\n"})}),"\n",(0,s.jsx)(t.p,{children:"Remember sure to adjust the HDR metadata accordingly."}),"\n",(0,s.jsx)(t.h3,{id:"encoding-with-dolby-vision",children:"Encoding with Dolby Vision"}),"\n",(0,s.jsx)(t.p,{children:"The ability to encode with Dolby Vision via RPU file is surprisingly present within SVT-HEVC, although it is limited to Profile 8.1."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -hdr -dolby-vision-rpu RPUFile.bin -dolby-vision-profile 81 -max-cll XXX -max-fall XXX -master-display G(0.265,0.690)B(0.150,0.060)R(0.680,0.320)WP(0.3127,0.3290)L(1000,0.0100) -b output.265\n"})}),"\n",(0,s.jsx)(t.p,{children:"Remember sure to adjust the HDR metadata accordingly."}),"\n",(0,s.jsx)(t.h2,{id:"list-of-all-configuration-parameters",children:"List of all configuration parameters"}),"\n",(0,s.jsxs)(t.p,{children:['As with every SVT line-up, they redirect you to read their "User Guide" instead of presenting what each and every parameter do in the ',(0,s.jsx)(t.code,{children:"--help"})," page.\nThe table below is an exact copy from their user guide taken from ",(0,s.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/blob/master/Docs/svt-hevc_encoder_user_guide.md",children:"GitHub"})," for backup purposes. Feel free to read them."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:(0,s.jsx)(t.strong,{children:"Encoder Parameter as shown in the configuration file"})}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.strong,{children:"Command Line parameter"})}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.strong,{children:"Range"})}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.strong,{children:"Default"})}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.strong,{children:"Description"})})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Channel Number"})}),(0,s.jsx)(t.td,{children:"-nch"}),(0,s.jsx)(t.td,{children:"[1 - 6]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Number of encode instances"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"ConfigFile"})}),(0,s.jsx)(t.td,{children:"-c"}),(0,s.jsx)(t.td,{children:"any string"}),(0,s.jsx)(t.td,{children:"null"}),(0,s.jsx)(t.td,{children:"Configuration file path"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"InputFile"})}),(0,s.jsx)(t.td,{children:"-i"}),(0,s.jsx)(t.td,{children:"any string"}),(0,s.jsx)(t.td,{children:"null"}),(0,s.jsx)(t.td,{children:"Input file path and name"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"StreamFile"})}),(0,s.jsx)(t.td,{children:"-b"}),(0,s.jsx)(t.td,{children:"any string"}),(0,s.jsx)(t.td,{children:"null"}),(0,s.jsx)(t.td,{children:"Output bitstream file path and name"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"ErrorFile"})}),(0,s.jsx)(t.td,{children:"-errlog"}),(0,s.jsx)(t.td,{children:"any string"}),(0,s.jsx)(t.td,{children:"stderr"}),(0,s.jsx)(t.td,{children:"Error log displaying configuration or encode errors"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"ReconFile"})}),(0,s.jsx)(t.td,{children:"-o"}),(0,s.jsx)(t.td,{children:"any string"}),(0,s.jsx)(t.td,{children:"null"}),(0,s.jsxs)(t.td,{children:["Output reconstructed yuv used for debug purposes. ",(0,s.jsx)(t.strong,{children:"Note:"})," using this feature will affect the speed of the encoder significantly. This should only be used for debugging purposes."]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"UseQpFile"})}),(0,s.jsx)(t.td,{children:"-use-q-file"}),(0,s.jsx)(t.td,{children:"[0, 1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"When set to 1, overwrite the picture qp assignment using qp values in QpFile"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"QpFile"})}),(0,s.jsx)(t.td,{children:"-qp-file"}),(0,s.jsx)(t.td,{children:"any string"}),(0,s.jsx)(t.td,{children:"null"}),(0,s.jsx)(t.td,{children:"Path to qp file"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SegmentOvFile"})}),(0,s.jsx)(t.td,{children:"-segment-ov-file"}),(0,s.jsx)(t.td,{children:"any string"}),(0,s.jsx)(t.td,{children:"null"}),(0,s.jsx)(t.td,{children:"Path to segment override file which will allow for sharpness improvement and bit rate reduction on a per segment basis. Refer to config/SVTSegmentOvFile.txt for details."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"EncoderMode"})}),(0,s.jsx)(t.td,{children:"-encMode"}),(0,s.jsx)(t.td,{children:"[0 - 11]"}),(0,s.jsx)(t.td,{children:"7"}),(0,s.jsx)(t.td,{children:"A preset defining the quality vs density tradeoff point that the encoding is to be performed at. (e.g. 0 is the highest quality mode, 11 is the highest density mode). Section 3.4 outlines the preset availability per resolution"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"EncoderBitDepth"})}),(0,s.jsx)(t.td,{children:"-bit-depth"}),(0,s.jsx)(t.td,{children:"[8, 10]"}),(0,s.jsx)(t.td,{children:"8"}),(0,s.jsx)(t.td,{children:"Specifies the bit depth of input video"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"EncoderColorFormat"})}),(0,s.jsx)(t.td,{children:"-color-format"}),(0,s.jsx)(t.td,{children:"[1, 2, 3]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Specifies the chroma subsampling of input video(1: 420, 2: 422, 3: 444)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"CompressedTenBitFormat"})}),(0,s.jsx)(t.td,{children:"-compressed-ten-bit-format"}),(0,s.jsx)(t.td,{children:"[0, 1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Offline packing of the 2bits: requires two bits packed input (0: OFF, 1: ON)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SourceWidth"})}),(0,s.jsx)(t.td,{children:"-w"}),(0,s.jsx)(t.td,{children:"[64 - 8192]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Input source width"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SourceHeight"})}),(0,s.jsx)(t.td,{children:"-h"}),(0,s.jsx)(t.td,{children:"[64 - 4320]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Input source height"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"FrameToBeEncoded"})}),(0,s.jsx)(t.td,{children:"-n"}),(0,s.jsx)(t.td,{children:"[0 - 2^31 -1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Number of frames to be encoded, if number of frames is > number of frames in file, the encoder will loop to the beginning and continue the encode. 0 encodes the full clip."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"BufferedInput"})}),(0,s.jsx)(t.td,{children:"-nb"}),(0,s.jsx)(t.td,{children:"[-1, 1 to 2^31 -1]"}),(0,s.jsx)(t.td,{children:"-1"}),(0,s.jsx)(t.td,{children:"number of frames to preload to the RAM before the start of the encode. If -nb = 100 and \u2013n 1000 --\x3e the encoder will encode the first 100 frames of the video 10 times. Use -1 to not preload any frames. This parameter is best used to eliminate the impact of disk reading on encoding speed and is most noticeable when frames sizes are 4k or 8k. Because frames are repeated when value specified (-nb) is less than the total frame count (-n), you should expect bitstreams to be different."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Profile"})}),(0,s.jsx)(t.td,{children:"-profile"}),(0,s.jsx)(t.td,{children:"[1,2]"}),(0,s.jsx)(t.td,{children:"2"}),(0,s.jsx)(t.td,{children:"1: Main, 2: Main 10"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Tier"})}),(0,s.jsx)(t.td,{children:"-tier"}),(0,s.jsx)(t.td,{children:"[0, 1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"0: Main, 1: High"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Level"})}),(0,s.jsx)(t.td,{children:"-level"}),(0,s.jsx)(t.td,{children:"[1, 2, 2.1,3, 3.1, 4, 4.1, 5, 5.1, 5.2, 6, 6.1, 6.2]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"0 to 6.2 [0 for auto determine Level]"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"FrameRate"})}),(0,s.jsx)(t.td,{children:"-fps"}),(0,s.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,s.jsx)(t.td,{children:"60"}),(0,s.jsx)(t.td,{children:"If the number is less than 1000, the input frame rate is an integer number between 1 and 60, else the input number is in Q16 format (shifted by 16 bits) [Max allowed is 240 fps]. If FrameRateNumerator and FrameRateDenominator are both !=0 the encoder will ignore this parameter"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"FrameRateNumerator"})}),(0,s.jsx)(t.td,{children:"-fps-num"}),(0,s.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Frame rate numerator e.g. 6000 When zero, the encoder will use \u2013fps if FrameRateDenominator is also zero, otherwise an error is returned"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"FrameRateDenominator"})}),(0,s.jsx)(t.td,{children:"-fps-denom"}),(0,s.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Frame rate denominator e.g. 100 When zero, the encoder will use \u2013fps if FrameRateNumerator is also zero, otherwise an error is returned"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Injector"})}),(0,s.jsx)(t.td,{children:"-inj"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Enable injection of input frames at the specified framerate (0: OFF, 1: ON)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"InjectorFrameRate"})}),(0,s.jsx)(t.td,{children:"-inj-frm-rt"}),(0,s.jsx)(t.td,{children:"[1 - 240]"}),(0,s.jsx)(t.td,{children:"60"}),(0,s.jsx)(t.td,{children:"Frame Rate used for the injector. Recommended to match the encoder speed."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SpeedControlFlag"})}),(0,s.jsx)(t.td,{children:"-speed-ctrl"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Enables the Speed Control functionality to achieve the real-time encoding speed defined by \u2013fps. When this parameter is set to 1 it forces \u2013inj to be 1 and -inj-frm-rt to be set to \u2013fps."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"InterlacedVideo"})}),(0,s.jsx)(t.td,{children:"-interlaced-video"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"1 : encoder will signal interlaced signal in the stream
0 : assumes progressive signal"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SeparateFields"})}),(0,s.jsx)(t.td,{children:"-separate-fields"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"1 : Interlaced input, application will separate top and bottom fields and encode it as progressive.
0 : Treat video as progressive video"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"HierarchicalLevels"})}),(0,s.jsx)(t.td,{children:"-hierarchical-levels"}),(0,s.jsx)(t.td,{children:"[0 \u2013 3]"}),(0,s.jsx)(t.td,{children:"3"}),(0,s.jsx)(t.td,{children:"0 : Flat
1: 2-Level Hierarchy
2: 3-Level Hierarchy
3: 4-Level Hierarchy
Minigop Size = (2^HierarchicalLevels)
(e.g. 3 == > 7B pyramid, 2 ==> 3B Pyramid)
Refer to Appendix A.1"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"BaseLayerSwitchMode"})}),(0,s.jsx)(t.td,{children:"-base-layer-switch-mode"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"0 : Use B-frames in the base layer pointing to the same past picture
1 : Use P-frames in the base layer
Refer to Appendix A.1"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"PredStructure"})}),(0,s.jsx)(t.td,{children:"-pred-struct"}),(0,s.jsx)(t.td,{children:"[0 \u2013 2]"}),(0,s.jsx)(t.td,{children:"2"}),(0,s.jsx)(t.td,{children:"0: Low Delay P
1: Low Delay B
2: Random Access
Refer to Appendix A.1"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"IntraPeriod"})}),(0,s.jsx)(t.td,{children:"-intra-period"}),(0,s.jsx)(t.td,{children:"[-2 - 255]"}),(0,s.jsx)(t.td,{children:"-2"}),(0,s.jsx)(t.td,{children:"Distance between Intra Frame inserted.
-1 denotes no intra update.
-2 denotes auto."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"IntraRefreshType"})}),(0,s.jsx)(t.td,{children:"-irefresh-type"}),(0,s.jsx)(t.td,{children:"[-1,N]"}),(0,s.jsx)(t.td,{children:"-1"}),(0,s.jsx)(t.td,{children:"-1: CRA (Open GOP)
>=0: IDR (Closed GOP, N is headers insertion interval, 0 supported if CQP, >=0 supported if VBR)
Refer to Appendix A.3"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"QP"})}),(0,s.jsx)(t.td,{children:"-q"}),(0,s.jsx)(t.td,{children:"[0 - 51]"}),(0,s.jsx)(t.td,{children:"32"}),(0,s.jsx)(t.td,{children:"Initial quantization parameter for the Intra pictures used when RateControlMode 0 (CQP)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"LoopFilterDisable"})}),(0,s.jsx)(t.td,{children:"-dlf"}),(0,s.jsx)(t.td,{children:"[0, 1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"When set to 1 disables the Deblocking Loop Filtering"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SAO"})}),(0,s.jsx)(t.td,{children:"-sao"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"When set to 0 the encoder will not use the Sample Adaptive Filter"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"UseDefaultMeHme"})}),(0,s.jsx)(t.td,{children:"-use-default-me-hme"}),(0,s.jsx)(t.td,{children:"[0, 1]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"0 : Overwrite Default ME HME parameters
1 : Use default ME HME parameters, dependent on width and height"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"HME"})}),(0,s.jsx)(t.td,{children:"-hme"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Enable HME, 0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SearchAreaWidth"})}),(0,s.jsx)(t.td,{children:"-search-w"}),(0,s.jsx)(t.td,{children:"[1 - 256]"}),(0,s.jsx)(t.td,{children:"Depends on input resolution"}),(0,s.jsx)(t.td,{children:"Motion vector search area width"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SearchAreaHeight"})}),(0,s.jsx)(t.td,{children:"-search-h"}),(0,s.jsx)(t.td,{children:"[1 - 256]"}),(0,s.jsx)(t.td,{children:"Depends on input resolution"}),(0,s.jsx)(t.td,{children:"Motion vector search area height"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"ConstrainedIntra"})}),(0,s.jsx)(t.td,{children:"-constrd-intra"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Allow the use of Constrained Intra, when enabled, this features yields to sending two PPSs in the HEVC Elementary streams
0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"RateControlMode"})}),(0,s.jsx)(t.td,{children:"-rc"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"0 : CQP , 1 : VBR"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"TargetBitRate"})}),(0,s.jsx)(t.td,{children:"-tbr"}),(0,s.jsx)(t.td,{children:"Any Number"}),(0,s.jsx)(t.td,{children:"7000000"}),(0,s.jsx)(t.td,{children:"Target bitrate in bits / second. Only used when RateControlMode is set to 1"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"vbvMaxrate"})}),(0,s.jsx)(t.td,{children:"-vbv-maxrate"}),(0,s.jsx)(t.td,{children:"Any Number"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"VBVMaxrate in bits / second. Only used when RateControlMode is set to 1"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"vbvBufsize"})}),(0,s.jsx)(t.td,{children:"-vbv-bufsize"}),(0,s.jsx)(t.td,{children:"Any Number"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"VBV BufferSize in bits / second. Only used when RateControlMode is set to 1"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"vbvBufInit"})}),(0,s.jsx)(t.td,{children:"-vbv-init"}),(0,s.jsx)(t.td,{children:"[0 - 100]"}),(0,s.jsx)(t.td,{children:"90"}),(0,s.jsx)(t.td,{children:"Sets the initial percentage size that the VBV buffer is filled to"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"hrdFlag"})}),(0,s.jsx)(t.td,{children:"-hrd"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsxs)(t.td,{children:["Sets the HRD (Hypothetical Reference Decoder) Flag in the encoded stream, 0 = OFF, 1 = ON When",(0,s.jsx)("br",{}),"hrdFlag is set to 1, vbvMaxrate and vbvBufsize must be greater than 0"]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"MaxQpAllowed"})}),(0,s.jsx)(t.td,{children:"-max-qp"}),(0,s.jsx)(t.td,{children:"[0 - 51]"}),(0,s.jsx)(t.td,{children:"48"}),(0,s.jsx)(t.td,{children:"Maximum QP value allowed for rate control use. Only used when RateControlMode is set to 1. Has to be >= MinQpAllowed"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"MinQpAllowed"})}),(0,s.jsx)(t.td,{children:"-min-qp"}),(0,s.jsx)(t.td,{children:"[0 - 50]"}),(0,s.jsx)(t.td,{children:"10"}),(0,s.jsx)(t.td,{children:"Minimum QP value allowed for rate control use. Only used when RateControlMode is set to 1. Has to be < MaxQpAllowed"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"LookAheadDistance"})}),(0,s.jsx)(t.td,{children:"-lad"}),(0,s.jsx)(t.td,{children:"[0 - 250]"}),(0,s.jsx)(t.td,{children:"Depending on BRC mode"}),(0,s.jsx)(t.td,{children:"When RateControlMode is set to 1 it's best to set this parameter to be equal to the Intra period value (such is the default set by the encoder). When CQP is chosen, then a (2 * minigopsize +1) look ahead is recommended."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SceneChangeDetection"})}),(0,s.jsx)(t.td,{children:"-scd"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Enables or disables the scene change detection algorithm
0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"BitRateReduction"})}),(0,s.jsx)(t.td,{children:"-brr"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Enables visual quality algorithms to reduce the output bitrate with minimal or no subjective visual quality impact.
0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"ImproveSharpness"})}),(0,s.jsx)(t.td,{children:"-sharp"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"This is a visual quality knob that allows the use of adaptive quantization within the picture and enables visual quality algorithms that improve the sharpness of the background. This feature is only available for 4k and 8k resolutions
0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"VideoUsabilityInfo"})}),(0,s.jsx)(t.td,{children:"-vid-info"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Enables or disables sending a vui structure in the HEVC Elementary bitstream. 0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"HighDynamicRangeInput"})}),(0,s.jsx)(t.td,{children:"-hdr"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"When set to 1, signals HDR10 input in the output HEVC elementary bitstream and forces VideoUsabilityInfo to 1.
0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"AccessUnitDelimiter"})}),(0,s.jsx)(t.td,{children:"-ua-delm"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"BufferingPeriod"})}),(0,s.jsx)(t.td,{children:"-pbuff"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"PictureTiming"})}),(0,s.jsx)(t.td,{children:"-tpic"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON.
If 1, VideoUsabilityInfo should be also set to 1."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"RegisteredUserData"})}),(0,s.jsx)(t.td,{children:"-reg-user-data"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"UnregisteredUserData"})}),(0,s.jsx)(t.td,{children:"-unreg-user-data"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"RecoveryPoint"})}),(0,s.jsx)(t.td,{children:"-recovery-point"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"TemporalId"})}),(0,s.jsx)(t.td,{children:"-temporal-id"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"0 = OFF
1 = Insert temporal ID in NAL units"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"AsmType"})}),(0,s.jsx)(t.td,{children:"-asm"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Assembly instruction set
(0: C Only, 1: Automatically select highest assembly instruction set supported)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"LogicalProcessors"})}),(0,s.jsx)(t.td,{children:"-lp"}),(0,s.jsx)(t.td,{children:"[0, total number of logical processor]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"The number of logical processor which encoder threads run on.Refer to Appendix A.2"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"FirstLogicalProcessor"})}),(0,s.jsx)(t.td,{children:"-flp"}),(0,s.jsx)(t.td,{children:"[0, the index of last logical processor]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"The index of first logical processor which encoder threads run on.Refer to Appendix A.2"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"TargetSocket"})}),(0,s.jsx)(t.td,{children:"-ss"}),(0,s.jsx)(t.td,{children:"[-1,1]"}),(0,s.jsx)(t.td,{children:"-1"}),(0,s.jsx)(t.td,{children:"For dual socket systems, this can specify which socket the encoder runs on. Refer to Appendix A.2"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"ThreadCount"})}),(0,s.jsx)(t.td,{children:"-thread-count"}),(0,s.jsx)(t.td,{children:"[0,N]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"The number of threads to get created and run, 0 = AUTO"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"SwitchThreadsToRtPriority"})}),(0,s.jsx)(t.td,{children:"-rt"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Enables or disables threads to real time priority, 0 = OFF, 1 = ON (only works on Linux)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"FPSInVPS"})}),(0,s.jsx)(t.td,{children:"-fpsinvps"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Enables or disables the VPS timing info, 0 = OFF, 1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"TileRowCount"})}),(0,s.jsx)(t.td,{children:"-tile_row_cnt"}),(0,s.jsx)(t.td,{children:"[1,22]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Tile count in the Row"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"TileColumnCount"})}),(0,s.jsx)(t.td,{children:"-tile_col_cnt"}),(0,s.jsx)(t.td,{children:"[1,20]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Tile count in the column"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"TileSliceMode"})}),(0,s.jsx)(t.td,{children:"-tile_slice_mode"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Per slice per tile, only valid for multi-tile"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"UnrestrictedMotionVector"})}),(0,s.jsx)(t.td,{children:"-umv"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"1"}),(0,s.jsx)(t.td,{children:"Enables or disables unrestricted motion vectors
0 = OFF(motion vectors are constrained within frame or tile boundary)
1 = ON.
For MCTS support, set -umv 0 with valid TileRowCount and TileColumnCount"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"MaxCLL"})}),(0,s.jsx)(t.td,{children:"-max-cll"}),(0,s.jsx)(t.td,{children:"[0 , 2^16-1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Maximum content light level (MaxCLL) as required by the Consumer Electronics Association 861.3 specification. Applicable for HDR content. If specified, signaled only when HighDynamicRangeInput is set to 1"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"MaxFALL"})}),(0,s.jsx)(t.td,{children:"-max-fall"}),(0,s.jsx)(t.td,{children:"[0 , 2^16-1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Maximum Frame Average light level (MaxFALL) as required by the Consumer Electronics Association 861.3 specification. Applicable for HDR content. If specified, signaled only when HighDynamicRangeInput is set to 1"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"UseMasterDisplay"})}),(0,s.jsx)(t.td,{children:"-use-master-display"}),(0,s.jsx)(t.td,{children:"[0,1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Enables or disables the MasterDisplayColorVolume
0 = OFF
1 = ON"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"MasterDisplay"})}),(0,s.jsx)(t.td,{children:"-master-display"}),(0,s.jsx)(t.td,{children:"For R, G, B and whitepoint [0, 2^16-1]. For max, min luminance [0, 2^32-1]"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"SMPTE ST 2086 mastering display color volume SEI info, specified as a string. The string format is \u201cG(%hu,%hu)B(%hu,%hu)R(%hu,% hu)WP(%hu,%hu)L(%u,%u)\u201d where %hu are unsigned 16bit integers and %u are unsigned 32bit integers. The SEI includes X, Y display primaries for RGB channels and white point (WP) in units of 0.00002 and max, min luminance (L) values in units of 0.0001 candela per meter square. Applicable for HDR content. Example for a P3D65 1000-nits monitor,G(13250,34500)B(7500,3 000)R(34000,16000)WP(15635,16 450)L(10000000,1)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"DolbyVisionRpuFile"})}),(0,s.jsx)(t.td,{children:"-dolby-vision-rpu"}),(0,s.jsx)(t.td,{children:"any string"}),(0,s.jsx)(t.td,{children:"null"}),(0,s.jsx)(t.td,{children:"Path to the file containing Dolby Vision RPU metadata"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"DolbyVisionProfile"})}),(0,s.jsx)(t.td,{children:"-dolby-vision-profile"}),(0,s.jsx)(t.td,{children:"8.1 or 81"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{children:"Generate bitstreams confirming to the specified Dolby Vision profile 8.1. When specified, enables HighDynamicRangeInput automatically. Applicable only for 10-bit input content. MasterDisplay should be set for using dolby vision profile 81. Pass the dynamic metadata through DolbyVisionRpuFile option"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"NaluFile"})}),(0,s.jsx)(t.td,{children:"-nalu-file"}),(0,s.jsx)(t.td,{children:"any string"}),(0,s.jsx)(t.td,{children:"null"}),(0,s.jsxs)(t.td,{children:["Path to the file containing CEA 608/708 metadata. Text file should contain the userSEI in POC order as per below format: ",(0,s.jsx)(t.code,{children:"/"}),". Currently only PREFIX_SEI messages are supported"]})]})]})]})]})}function j(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(x,{...e})}):x(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>d});r(6540);var n=r(4164);const s={tabItem:"tabItem_Ymn6"};var i=r(4848);function d(e){let{children:t,hidden:r,className:d}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,d),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),s=r(4164),i=r(3104),d=r(6347),l=r(205),c=r(7485),h=r(1682),o=r(679);function a(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function x(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return a(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:s}}=e;return{value:t,label:r,attributes:n,default:s}}))}(r);return function(e){const t=(0,h.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function j(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function u(e){let{queryString:t=!1,groupId:r}=e;const s=(0,d.W6)(),i=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,c.aZ)(i),(0,n.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(s.location.search);t.set(i,e),s.replace({...s.location,search:t.toString()})}),[i,s])]}function p(e){const{defaultValue:t,queryString:r=!1,groupId:s}=e,i=x(e),[d,c]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!j({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:i}))),[h,a]=u({queryString:r,groupId:s}),[p,m]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,i]=(0,o.Dv)(r);return[s,(0,n.useCallback)((e=>{r&&i.set(e)}),[r,i])]}({groupId:s}),g=(()=>{const e=h??p;return j({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{g&&c(g)}),[g]);return{selectedValue:d,selectValue:(0,n.useCallback)((e=>{if(!j({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);c(e),a(e),m(e)}),[a,m,i]),tabValues:i}}var m=r(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=r(4848);function b(e){let{className:t,block:r,selectedValue:n,selectValue:d,tabValues:l}=e;const c=[],{blockElementScrollPositionUntilNextRender:h}=(0,i.a_)(),o=e=>{const t=e.currentTarget,r=c.indexOf(t),s=l[r].value;s!==n&&(h(t),d(s))},a=e=>{let t=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:i}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>c.push(e),onKeyDown:a,onClick:o,...i,className:(0,s.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function v(e){let{lazy:t,children:r,selectedValue:i}=e;const d=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=d.find((e=>e.props.value===i));return e?(0,n.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:d.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function y(e){const t=p(e);return(0,f.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,f.jsx)(b,{...t,...e}),(0,f.jsx)(v,{...t,...e})]})}function w(e){const t=(0,m.A)();return(0,f.jsx)(y,{...e,children:a(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>l});var n=r(6540);const s={},i=n.createContext(s);function d(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c15d9823.62f9ce37.js b/assets/js/c15d9823.5567b29d.js similarity index 75% rename from assets/js/c15d9823.62f9ce37.js rename to assets/js/c15d9823.5567b29d.js index a79cd5815..3b853e2cd 100644 --- a/assets/js/c15d9823.62f9ce37.js +++ b/assets/js/c15d9823.5567b29d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8146],{9328:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":7,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8146],{9328:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":8,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/c19fbcae.26a90190.js b/assets/js/c19fbcae.26a90190.js deleted file mode 100644 index 0f06029f4..000000000 --- a/assets/js/c19fbcae.26a90190.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4501],{5341:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var i=o(4848),n=o(8453);const r={title:"ALAC",sidebar_position:7},s="ALAC",a={id:"audio/ALAC",title:"ALAC",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/ALAC.mdx",sourceDirName:"audio",slug:"/audio/ALAC",permalink:"/docs/audio/ALAC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/ALAC.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"ALAC",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Speex",permalink:"/docs/audio/Speex"},next:{title:"FLAC",permalink:"/docs/audio/FLAC"}},c={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"alac",children:"ALAC"})}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var i=o(6540);const n={},r=i.createContext(n);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c19fbcae.9b91b544.js b/assets/js/c19fbcae.9b91b544.js new file mode 100644 index 000000000..5fc76ec06 --- /dev/null +++ b/assets/js/c19fbcae.9b91b544.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4501],{8455:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"audio/ALAC","title":"ALAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/audio/ALAC.mdx","sourceDirName":"audio","slug":"/audio/ALAC","permalink":"/docs/audio/ALAC","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/ALAC.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"ALAC","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"Speex","permalink":"/docs/audio/Speex"},"next":{"title":"FLAC","permalink":"/docs/audio/FLAC"}}');var i=o(4848),s=o(8453);const r={title:"ALAC",sidebar_position:7},a="ALAC",c={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"alac",children:"ALAC"})}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>a});var n=o(6540);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c224274c.8ac21b1d.js b/assets/js/c224274c.8ac21b1d.js new file mode 100644 index 000000000..ab09e2fb1 --- /dev/null +++ b/assets/js/c224274c.8ac21b1d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3356],{8659:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"video/AVS3","title":"AVS3","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/video/AVS3.mdx","sourceDirName":"video","slug":"/video/AVS3","permalink":"/docs/video/AVS3","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AVS3.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"AVS3","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"AV1","permalink":"/docs/video/AV1"},"next":{"title":"VC-1","permalink":"/docs/video/VC-1"}}');var t=i(4848),s=i(8453);const r={title:"AVS3",sidebar_position:7},a="AVS3",d={},c=[];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"avs3",children:"AVS3"})}),"\n",(0,t.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(n.p,{children:["AVS3 is the most recent codec from the AVS family. It aims to bring a significant coding improvement over AVS2 and ",(0,t.jsx)(n.a,{href:"/docs/video/HEVC",children:"HEVC"}),". The specification was divided into 2 phases, the first one (main profile) finished in 2019 and the second (high profile) in 2021."]}),"\n",(0,t.jsx)(n.p,{children:"AVS3 has more flexible coding tree and block partitioning shemes compared to previous generation AVS codecs. It also employs new DCT-VII and DST-VII transforms. The work on AVS3 was sponsored by organizations including Peking University, Pengcheng Laboratory and Huawei."}),"\n",(0,t.jsxs)(n.p,{children:["In 2022 it was ",(0,t.jsx)(n.a,{href:"https://dvb.org/news/dvb-test-content-for-vvc-and-avs3-codecs-now-available",children:"added"})," to worldwide DVB standard alongside ",(0,t.jsx)(n.a,{href:"/docs/video/VVC",children:"VVC"}),". As of 2024 there several hardware AVS3 decoders including Mediatek and HiSilicon. We should be seeing more AVS3 in hardware since it was added to DVB toolbox."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/uavs3",children:"uavs3"})," is an open source high performance software encoder and decoder of AVS3-P2. The project was initialized by the Peking University Shenzhen Graduate School and over the time was optimized for x86 and arm processors. FFmpeg since version 6 supports only avs3 decoding via ",(0,t.jsx)(n.a,{href:"https://github.com/uavs3/uavs3d",children:"uavs3d"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Intel partnered with Boya and created ",(0,t.jsx)(n.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"SVT-AVS3"})," which to my knowledge is not available to the public. The only open-source encoder available to general public is ",(0,t.jsx)(n.a,{href:"/docs/encoders/uavs3e",children:"uavs3e"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var o=i(6540);const t={},s=o.createContext(t);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c224274c.ebb6a550.js b/assets/js/c224274c.ebb6a550.js deleted file mode 100644 index 443d2e1c1..000000000 --- a/assets/js/c224274c.ebb6a550.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3356],{4736:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=i(4848),t=i(8453);const s={title:"AVS3",sidebar_position:7},r="AVS3",a={id:"video/AVS3",title:"AVS3",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/AVS3.mdx",sourceDirName:"video",slug:"/video/AVS3",permalink:"/docs/video/AVS3",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AVS3.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"AVS3",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AV1",permalink:"/docs/video/AV1"},next:{title:"VC-1",permalink:"/docs/video/VC-1"}},d={},c=[];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"avs3",children:"AVS3"})}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(n.p,{children:["AVS3 is the most recent codec from the AVS family. It aims to bring a significant coding improvement over AVS2 and ",(0,o.jsx)(n.a,{href:"/docs/video/HEVC",children:"HEVC"}),". The specification was divided into 2 phases, the first one (main profile) finished in 2019 and the second (high profile) in 2021."]}),"\n",(0,o.jsx)(n.p,{children:"AVS3 has more flexible coding tree and block partitioning shemes compared to previous generation AVS codecs. It also employs new DCT-VII and DST-VII transforms. The work on AVS3 was sponsored by organizations including Peking University, Pengcheng Laboratory and Huawei."}),"\n",(0,o.jsxs)(n.p,{children:["In 2022 it was ",(0,o.jsx)(n.a,{href:"https://dvb.org/news/dvb-test-content-for-vvc-and-avs3-codecs-now-available",children:"added"})," to worldwide DVB standard alongside ",(0,o.jsx)(n.a,{href:"/docs/video/VVC",children:"VVC"}),". As of 2024 there several hardware AVS3 decoders including Mediatek and HiSilicon. We should be seeing more AVS3 in hardware since it was added to DVB toolbox."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://github.com/uavs3",children:"uavs3"})," is an open source high performance software encoder and decoder of AVS3-P2. The project was initialized by the Peking University Shenzhen Graduate School and over the time was optimized for x86 and arm processors. FFmpeg since version 6 supports only avs3 decoding via ",(0,o.jsx)(n.a,{href:"https://github.com/uavs3/uavs3d",children:"uavs3d"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Intel partnered with Boya and created ",(0,o.jsx)(n.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"SVT-AVS3"})," which to my knowledge is not available to the public. The only open-source encoder available to general public is ",(0,o.jsx)(n.a,{href:"/docs/encoders/uavs3e",children:"uavs3e"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var o=i(6540);const t={},s=o.createContext(t);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.570c464d.js b/assets/js/c4f5d8e4.570c464d.js new file mode 100644 index 000000000..f50f72cda --- /dev/null +++ b/assets/js/c4f5d8e4.570c464d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2634],{1459:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(6540);var s=n(4164),r=n(8774),i=n(4586),o=n(7823);const c={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};var a=n(4848);function l(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)("header",{className:(0,s.A)("hero hero--primary",c.heroBanner),children:(0,a.jsxs)("div",{className:"container",children:[(0,a.jsx)("h1",{className:"hero__title",children:e.title}),(0,a.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,a.jsx)("div",{className:c.buttons,children:(0,a.jsx)(r.A,{className:"button button--secondary button--lg",to:"/docs/introduction/prologue",children:"Start learning!"})})]})})}function d(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)(o.A,{title:`${e.title}`,description:`${e.tagline}`,children:(0,a.jsx)(l,{})})}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.771b41be.js b/assets/js/c4f5d8e4.771b41be.js deleted file mode 100644 index ab916391c..000000000 --- a/assets/js/c4f5d8e4.771b41be.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2634],{1459:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(6540);var s=n(4164),r=n(8774),i=n(4586),o=n(263);const c={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};var a=n(4848);function l(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)("header",{className:(0,s.A)("hero hero--primary",c.heroBanner),children:(0,a.jsxs)("div",{className:"container",children:[(0,a.jsx)("h1",{className:"hero__title",children:e.title}),(0,a.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,a.jsx)("div",{className:c.buttons,children:(0,a.jsx)(r.A,{className:"button button--secondary button--lg",to:"/docs/introduction/prologue",children:"Start learning!"})})]})})}function d(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)(o.A,{title:`${e.title}`,description:`${e.tagline}`,children:(0,a.jsx)(l,{})})}}}]); \ No newline at end of file diff --git a/assets/js/c7deb2e0.0c155dde.js b/assets/js/c7deb2e0.0c155dde.js new file mode 100644 index 000000000..0319d192c --- /dev/null +++ b/assets/js/c7deb2e0.0c155dde.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9551],{2359:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"audio/WavPack","title":"WavPack","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/audio/WavPack.mdx","sourceDirName":"audio","slug":"/audio/WavPack","permalink":"/docs/audio/WavPack","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/WavPack.mdx","tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"title":"WavPack","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"FLAC","permalink":"/docs/audio/FLAC"},"next":{"title":"AVC / H.264","permalink":"/docs/video/AVC"}}');var o=i(4848),r=i(8453);const a={title:"WavPack",sidebar_position:8},d="WavPack",t={},c=[{value:"Features",id:"features",level:2},{value:"Hybrid Mode",id:"hybrid-mode",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Encoders",id:"encoders",level:2},{value:"wavpack",id:"wavpack-1",level:3},{value:"FFmpeg",id:"ffmpeg",level:3},{value:"Adoption issues",id:"adoption-issues",level:2},{value:"Notes",id:"notes",level:2}];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"wavpack",children:"WavPack"})}),"\n",(0,o.jsx)(s.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(s.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(s.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(s.p,{children:["WavPack is an open-source lossless audio codec with support for lossless & lossy compression with a unique hybrid compression mode for compressing a lossy audio stream alongside a lossless reference. Created by David Bryant in 1998, it gained a lot of software support, although not as much as ",(0,o.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["Compressed file size is somewhat between ",(0,o.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"})," and heavier state-of-art lossless audio compressors like TAK, OptimFrog or SAC. Compared to ",(0,o.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),", WavPack usually gives a lower bitrate at the expense of slightly more resource usage."]}),"\n",(0,o.jsx)(s.h2,{id:"features",children:"Features"}),"\n",(0,o.jsx)(s.p,{children:"WavPack is one of the most robust and feature-rich lossless audio codecs. Some notable features include:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid mode"})}),"\n",(0,o.jsx)(s.li,{children:"Support for 1-32 bit integer/floating point audio streams"}),"\n",(0,o.jsxs)(s.li,{children:["Muxable into Matroska ",(0,o.jsx)(s.code,{children:".mkv"})," container"]}),"\n",(0,o.jsx)(s.li,{children:"Multichannel with up to 4096 channels"}),"\n",(0,o.jsx)(s.li,{children:"APEv2/ID3v1 tagging format"}),"\n",(0,o.jsx)(s.li,{children:"RIFF chunks support"}),"\n",(0,o.jsx)(s.li,{children:"Multithreaded encoding/decoding"}),"\n",(0,o.jsx)(s.li,{children:"Error detection using CRC32 checksums and optionally also MD5 hash of original audio data"}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"hybrid-mode",children:"Hybrid Mode"}),"\n",(0,o.jsxs)(s.p,{children:["Hybrid Mode is not to be confused with hybrid codecs like ",(0,o.jsx)(s.a,{href:"/docs/audio/Opus",children:"Opus"}),". WavPack uses the same algorithm for both lossy and lossless mode. When using lossy mode, the encoder transmits only the unary magnitude and the sign bit of Recursive Golomb encoded residuals. During decoding, those data points can be further enhanced if the correction file is provided."]}),"\n",(0,o.jsxs)(s.p,{children:["WavPack can produce 2 output files when using Hybrid Mode. The main ",(0,o.jsx)(s.code,{children:".wv"})," file with truncated (lossy) residuals and a ",(0,o.jsx)(s.code,{children:".wvc"})," correction file containing the enhancement layer. When both files are provided to the decoder, it should be able to recreate original audio data. Otherwise, if only the ",(0,o.jsx)(s.code,{children:".wv"})," file is available, the decoder will decode lossy audio stream."]}),"\n",(0,o.jsx)(s.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,o.jsxs)(s.p,{children:["Like in many lossless audio codecs, WavPack only encodes the prediction error value. In the default ",(0,o.jsx)(s.code,{children:"fast"})," mode, prediction is just extrapolation of the previous two samples. More sophisticated predictors are used with higher encoding modes.\nDue to poor performance, unpredictability, and other problems with floating-point arithmetic in CPUs of its time, WavPack only uses integer arithmetic even when operating on IEEE float data. Nowadays, many of those issues were addressed, however it could still make porting WavPack to chips with no FPU support much easier."]}),"\n",(0,o.jsx)(s.p,{children:"The encoding process consists of 3 main steps:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsx)(s.p,{children:"Joint stereo processing - Converts the stereo channels to the standard difference and average, removing inter-channel correlations."}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsx)(s.p,{children:"Multipass decorrelation - Includes multiple prediction passes where the number of passes and predictor type depend on the selected encoding mode, removing intra-channel correlations between neighboring audio samples."}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsx)(s.p,{children:"Entropy coding the residuals with Recursive Golomb Coding - Instead of Rice Coding, the author proposed a new technique that combines Golomb and Elias gamma code to better address the nature of audio data."}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"encoders",children:"Encoders"}),"\n",(0,o.jsx)(s.h3,{id:"wavpack-1",children:"wavpack"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",metastring:'title="Default options"',children:"wavpack input.wav -o out.wv\n"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",metastring:'title="Fast, lowest compression, md5 hash"',children:"wavpack input.wav -f -m -o out.wv\n"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",metastring:'title="Very slow, highest compression, 8 threads"',children:"wavpack input.wav -hh -x6 --threads=8 -o out.wv\n"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",metastring:'title="Lossy, slow, 240kbps"',children:"wavpack input.wav -b240 -h -x3 -o out.lsy.wv\n"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",metastring:'title="Highest hybrid compression, very slow, 4bps"',children:"wavpack input.wav -b4 -cc -hh -x6 -o out.hyb.wv\n"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"wvunpack"})," can be used to decode resulting ",(0,o.jsx)(s.code,{children:".wv"})," files, however most major ",(0,o.jsx)(s.a,{href:"/docs/video-players",children:"media players"})," like MPV or VLC already have (limited) WavPack support."]}),"\n",(0,o.jsx)(s.p,{children:"Options:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-f"})," Faster encode/decode at the expense of larger file size"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-h"})," Slower encode/decode with higher compression"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-hh"})," Slowest encode/decode with highest compression"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-x0"})," Disable extra filters"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-x3"})," Try all predefined filters, slow, higher compression"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-x6"})," Generate custom filters, very slow, best compression"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-b240"})," Enable lossy mode, set bitrate to ",(0,o.jsx)(s.code,{children:"240kbps"})," (acceptable range is ",(0,o.jsx)(s.code,{children:"24"}),"-",(0,o.jsx)(s.code,{children:"9600"})," but it won't get lower than ",(0,o.jsx)(s.code,{children:"2 bits per sample"}),")"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-b4"})," Enable lossy mode, set ",(0,o.jsx)(s.code,{children:"bits per sample"})," to ",(0,o.jsx)(s.code,{children:"4"})," (acceptable range is ",(0,o.jsx)(s.code,{children:"2"}),"-",(0,o.jsx)(s.code,{children:"23.9"}),")"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-c"})," Enable hybrid mode (will produce ",(0,o.jsx)(s.code,{children:".wv"})," and ",(0,o.jsx)(s.code,{children:".wvc"})," file)"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-cc"})," Enable and optimize for hybrid mode, might lower decoding speed and hurt quality"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"-m"})," Include MD5 hash of original audio data in the output file"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"--threads=8"})," Use ",(0,o.jsx)(s.code,{children:"8"})," threads (acceptable range is ",(0,o.jsx)(s.code,{children:"1"}),"-",(0,o.jsx)(s.code,{children:"12"}),")"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(s.p,{children:["For more detailed description of all available options, see the ",(0,o.jsx)(s.a,{href:"https://www.wavpack.com/wavpack_doc.html",children:"manual"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," has its own native WavPack encoder and decoder. It used to also support ",(0,o.jsx)(s.code,{children:"libwavpack"})," with ",(0,o.jsx)(s.code,{children:"--enable-libwavpack"}),", however it was ",(0,o.jsx)(s.a,{href:"https://hydrogenaud.io/index.php/topic,120038.0.html",children:"removed"})," due to interface incompleteness."]}),"\n",(0,o.jsxs)(s.p,{children:["The native encoder is single-threaded and doesn't support neither Lossy or ",(0,o.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid"})," Mode. It uses the ",(0,o.jsx)(s.code,{children:"-compression_level"})," parameter to control speed to compression ratio."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",metastring:'title="Fastest, lowest compression"',children:"ffmpeg -i input.wav -compression_level 0 out.wv\n"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",metastring:'title="Slowest, highest compression"',children:"ffmpeg -i input.wav -compression_level 8 out.wv\n"})}),"\n",(0,o.jsxs)(s.p,{children:["For all possible parameters, consult the ",(0,o.jsx)(s.a,{href:"https://www.ffmpeg.org/ffmpeg-codecs.html#wavpack",children:"FFmpeg documentation"}),"."]}),"\n",(0,o.jsx)(s.h2,{id:"adoption-issues",children:"Adoption issues"}),"\n",(0,o.jsxs)(s.p,{children:["As of 2024, WavPack has been largely superseded by ",(0,o.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),", which became the de facto standard for lossless audio on the Web and in Hardware."]}),"\n",(0,o.jsxs)(s.p,{children:["The implementation of WavPack in media software is often incomplete. FFmpeg doesn't support ",(0,o.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid Mode"}),", and other media players usually don't support it either. There are also ",(0,o.jsx)(s.a,{href:"https://www.reddit.com/r/ffmpeg/comments/tpptoi/using_hybrid_wavpack_in_video/",children:"issues"})," with its support in the ",(0,o.jsx)(s.code,{children:".mkv"})," container."]}),"\n",(0,o.jsxs)(s.p,{children:["Without this feature, WavPack doesn't provide much benefit over already widespread ",(0,o.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),". The compressed file might be slightly smaller, however music streaming companies tend to choose well-standardized FLAC which also has the benefit of ",(0,o.jsx)(s.code,{children:"DRM"})," support in the ",(0,o.jsx)(s.code,{children:".mp4"})," container (apparently very important thing on the modern web)."]}),"\n",(0,o.jsxs)(s.p,{children:["Even if ",(0,o.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid Mode"})," had better software support, the minimum lossy setting is ",(0,o.jsx)(s.code,{children:"2 bits per sample"}),". That translates to around ",(0,o.jsx)(s.code,{children:"200kbps"})," with stereo audio track which is quite high. The quality of WavPack lossy mode is also somewhat lacking compared to modern lossy codecs such as ",(0,o.jsx)(s.a,{href:"/docs/audio/Opus",children:"Opus"})," or ",(0,o.jsx)(s.a,{href:"/docs/audio/AAC",children:"AAC"})," because it doesn't utilize any psychoacoustic model."]}),"\n",(0,o.jsx)(s.h2,{id:"notes",children:"Notes"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["WavPack was one of the first compressed lossless audio codecs preceding Monkey's Audio (2000), ",(0,o.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"})," (2001), OptimFROG (2002) and ",(0,o.jsx)(s.a,{href:"/docs/audio/ALAC",children:"ALAC"})," (2004)."]}),"\n",(0,o.jsx)(s.li,{children:"OptimFROG Dualstream is a feature of OptimFROG codec serving a similar purpose to WavPack Hybrid, however it was introduced much later."}),"\n",(0,o.jsxs)(s.li,{children:["Apparently there are some devices with WavPack ",(0,o.jsx)(s.a,{href:"https://hydrogenaud.io/index.php/topic,119143.0.html",children:"Hardware Support"}),"."]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"References:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.a,{href:"https://www.wavpack.com/WavPack.pdf",children:"WavPack Compression Techniques"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.a,{href:"https://www.wavpack.com/technical.htm",children:"WavPack Technical Document"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.a,{href:"https://web.archive.org/web/20160705230053/http://www.wavpack.com/file_format.txt",children:"Old WavPack File Format Specification"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.a,{href:"https://wiki.hydrogenaud.io/index.php?title=WavPack",children:"Hydrogenaudio Wiki"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.a,{href:"https://wiki.multimedia.cx/index.php/WavPack",children:"Multimedia.cx Wiki"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/WavPack",children:"Wikipedia"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.a,{href:"https://ffmpeg.org/doxygen/3.3/wavpackenc_8c_source.html",children:"FFmpeg WavPack Source"})}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,s,i)=>{i.d(s,{R:()=>a,x:()=>d});var n=i(6540);const o={},r=n.createContext(o);function a(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c7deb2e0.2f90776e.js b/assets/js/c7deb2e0.2f90776e.js deleted file mode 100644 index 2df983807..000000000 --- a/assets/js/c7deb2e0.2f90776e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9551],{9009:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=i(4848),o=i(8453);const r={title:"WavPack",sidebar_position:8},d="WavPack",a={id:"audio/WavPack",title:"WavPack",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/WavPack.mdx",sourceDirName:"audio",slug:"/audio/WavPack",permalink:"/docs/audio/WavPack",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/WavPack.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"WavPack",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"FLAC",permalink:"/docs/audio/FLAC"},next:{title:"AVC / H.264",permalink:"/docs/video/AVC"}},t={},c=[{value:"Features",id:"features",level:2},{value:"Hybrid Mode",id:"hybrid-mode",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Encoders",id:"encoders",level:2},{value:"wavpack",id:"wavpack-1",level:3},{value:"FFmpeg",id:"ffmpeg",level:3},{value:"Adoption issues",id:"adoption-issues",level:2},{value:"Notes",id:"notes",level:2}];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"wavpack",children:"WavPack"})}),"\n",(0,n.jsx)(s.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(s.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(s.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(s.p,{children:["WavPack is an open-source lossless audio codec with support for lossless & lossy compression with a unique hybrid compression mode for compressing a lossy audio stream alongside a lossless reference. Created by David Bryant in 1998, it gained a lot of software support, although not as much as ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),"."]}),"\n",(0,n.jsxs)(s.p,{children:["Compressed file size is somewhat between ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"})," and heavier state-of-art lossless audio compressors like TAK, OptimFrog or SAC. Compared to ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),", WavPack usually gives a lower bitrate at the expense of slightly more resource usage."]}),"\n",(0,n.jsx)(s.h2,{id:"features",children:"Features"}),"\n",(0,n.jsx)(s.p,{children:"WavPack is one of the most robust and feature-rich lossless audio codecs. Some notable features include:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid mode"})}),"\n",(0,n.jsx)(s.li,{children:"Support for 1-32 bit integer/floating point audio streams"}),"\n",(0,n.jsxs)(s.li,{children:["Muxable into Matroska ",(0,n.jsx)(s.code,{children:".mkv"})," container"]}),"\n",(0,n.jsx)(s.li,{children:"Multichannel with up to 4096 channels"}),"\n",(0,n.jsx)(s.li,{children:"APEv2/ID3v1 tagging format"}),"\n",(0,n.jsx)(s.li,{children:"RIFF chunks support"}),"\n",(0,n.jsx)(s.li,{children:"Multithreaded encoding/decoding"}),"\n",(0,n.jsx)(s.li,{children:"Error detection using CRC32 checksums and optionally also MD5 hash of original audio data"}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"hybrid-mode",children:"Hybrid Mode"}),"\n",(0,n.jsxs)(s.p,{children:["Hybrid Mode is not to be confused with hybrid codecs like ",(0,n.jsx)(s.a,{href:"/docs/audio/Opus",children:"Opus"}),". WavPack uses the same algorithm for both lossy and lossless mode. When using lossy mode, the encoder transmits only the unary magnitude and the sign bit of Recursive Golomb encoded residuals. During decoding, those data points can be further enhanced if the correction file is provided."]}),"\n",(0,n.jsxs)(s.p,{children:["WavPack can produce 2 output files when using Hybrid Mode. The main ",(0,n.jsx)(s.code,{children:".wv"})," file with truncated (lossy) residuals and a ",(0,n.jsx)(s.code,{children:".wvc"})," correction file containing the enhancement layer. When both files are provided to the decoder, it should be able to recreate original audio data. Otherwise, if only the ",(0,n.jsx)(s.code,{children:".wv"})," file is available, the decoder will decode lossy audio stream."]}),"\n",(0,n.jsx)(s.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsxs)(s.p,{children:["Like in many lossless audio codecs, WavPack only encodes the prediction error value. In the default ",(0,n.jsx)(s.code,{children:"fast"})," mode, prediction is just extrapolation of the previous two samples. More sophisticated predictors are used with higher encoding modes.\nDue to poor performance, unpredictability, and other problems with floating-point arithmetic in CPUs of its time, WavPack only uses integer arithmetic even when operating on IEEE float data. Nowadays, many of those issues were addressed, however it could still make porting WavPack to chips with no FPU support much easier."]}),"\n",(0,n.jsx)(s.p,{children:"The encoding process consists of 3 main steps:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Joint stereo processing - Converts the stereo channels to the standard difference and average, removing inter-channel correlations."}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Multipass decorrelation - Includes multiple prediction passes where the number of passes and predictor type depend on the selected encoding mode, removing intra-channel correlations between neighboring audio samples."}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Entropy coding the residuals with Recursive Golomb Coding - Instead of Rice Coding, the author proposed a new technique that combines Golomb and Elias gamma code to better address the nature of audio data."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"encoders",children:"Encoders"}),"\n",(0,n.jsx)(s.h3,{id:"wavpack-1",children:"wavpack"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Default options"',children:"wavpack input.wav -o out.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Fast, lowest compression, md5 hash"',children:"wavpack input.wav -f -m -o out.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Very slow, highest compression, 8 threads"',children:"wavpack input.wav -hh -x6 --threads=8 -o out.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Lossy, slow, 240kbps"',children:"wavpack input.wav -b240 -h -x3 -o out.lsy.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Highest hybrid compression, very slow, 4bps"',children:"wavpack input.wav -b4 -cc -hh -x6 -o out.hyb.wv\n"})}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"wvunpack"})," can be used to decode resulting ",(0,n.jsx)(s.code,{children:".wv"})," files, however most major ",(0,n.jsx)(s.a,{href:"/docs/video-players",children:"media players"})," like MPV or VLC already have (limited) WavPack support."]}),"\n",(0,n.jsx)(s.p,{children:"Options:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-f"})," Faster encode/decode at the expense of larger file size"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-h"})," Slower encode/decode with higher compression"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-hh"})," Slowest encode/decode with highest compression"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-x0"})," Disable extra filters"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-x3"})," Try all predefined filters, slow, higher compression"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-x6"})," Generate custom filters, very slow, best compression"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-b240"})," Enable lossy mode, set bitrate to ",(0,n.jsx)(s.code,{children:"240kbps"})," (acceptable range is ",(0,n.jsx)(s.code,{children:"24"}),"-",(0,n.jsx)(s.code,{children:"9600"})," but it won't get lower than ",(0,n.jsx)(s.code,{children:"2 bits per sample"}),")"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-b4"})," Enable lossy mode, set ",(0,n.jsx)(s.code,{children:"bits per sample"})," to ",(0,n.jsx)(s.code,{children:"4"})," (acceptable range is ",(0,n.jsx)(s.code,{children:"2"}),"-",(0,n.jsx)(s.code,{children:"23.9"}),")"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-c"})," Enable hybrid mode (will produce ",(0,n.jsx)(s.code,{children:".wv"})," and ",(0,n.jsx)(s.code,{children:".wvc"})," file)"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-cc"})," Enable and optimize for hybrid mode, might lower decoding speed and hurt quality"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-m"})," Include MD5 hash of original audio data in the output file"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"--threads=8"})," Use ",(0,n.jsx)(s.code,{children:"8"})," threads (acceptable range is ",(0,n.jsx)(s.code,{children:"1"}),"-",(0,n.jsx)(s.code,{children:"12"}),")"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["For more detailed description of all available options, see the ",(0,n.jsx)(s.a,{href:"https://www.wavpack.com/wavpack_doc.html",children:"manual"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," has its own native WavPack encoder and decoder. It used to also support ",(0,n.jsx)(s.code,{children:"libwavpack"})," with ",(0,n.jsx)(s.code,{children:"--enable-libwavpack"}),", however it was ",(0,n.jsx)(s.a,{href:"https://hydrogenaud.io/index.php/topic,120038.0.html",children:"removed"})," due to interface incompleteness."]}),"\n",(0,n.jsxs)(s.p,{children:["The native encoder is single-threaded and doesn't support neither Lossy or ",(0,n.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid"})," Mode. It uses the ",(0,n.jsx)(s.code,{children:"-compression_level"})," parameter to control speed to compression ratio."]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Fastest, lowest compression"',children:"ffmpeg -i input.wav -compression_level 0 out.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Slowest, highest compression"',children:"ffmpeg -i input.wav -compression_level 8 out.wv\n"})}),"\n",(0,n.jsxs)(s.p,{children:["For all possible parameters, consult the ",(0,n.jsx)(s.a,{href:"https://www.ffmpeg.org/ffmpeg-codecs.html#wavpack",children:"FFmpeg documentation"}),"."]}),"\n",(0,n.jsx)(s.h2,{id:"adoption-issues",children:"Adoption issues"}),"\n",(0,n.jsxs)(s.p,{children:["As of 2024, WavPack has been largely superseded by ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),", which became the de facto standard for lossless audio on the Web and in Hardware."]}),"\n",(0,n.jsxs)(s.p,{children:["The implementation of WavPack in media software is often incomplete. FFmpeg doesn't support ",(0,n.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid Mode"}),", and other media players usually don't support it either. There are also ",(0,n.jsx)(s.a,{href:"https://www.reddit.com/r/ffmpeg/comments/tpptoi/using_hybrid_wavpack_in_video/",children:"issues"})," with its support in the ",(0,n.jsx)(s.code,{children:".mkv"})," container."]}),"\n",(0,n.jsxs)(s.p,{children:["Without this feature, WavPack doesn't provide much benefit over already widespread ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),". The compressed file might be slightly smaller, however music streaming companies tend to choose well-standardized FLAC which also has the benefit of ",(0,n.jsx)(s.code,{children:"DRM"})," support in the ",(0,n.jsx)(s.code,{children:".mp4"})," container (apparently very important thing on the modern web)."]}),"\n",(0,n.jsxs)(s.p,{children:["Even if ",(0,n.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid Mode"})," had better software support, the minimum lossy setting is ",(0,n.jsx)(s.code,{children:"2 bits per sample"}),". That translates to around ",(0,n.jsx)(s.code,{children:"200kbps"})," with stereo audio track which is quite high. The quality of WavPack lossy mode is also somewhat lacking compared to modern lossy codecs such as ",(0,n.jsx)(s.a,{href:"/docs/audio/Opus",children:"Opus"})," or ",(0,n.jsx)(s.a,{href:"/docs/audio/AAC",children:"AAC"})," because it doesn't utilize any psychoacoustic model."]}),"\n",(0,n.jsx)(s.h2,{id:"notes",children:"Notes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["WavPack was one of the first compressed lossless audio codecs preceding Monkey's Audio (2000), ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"})," (2001), OptimFROG (2002) and ",(0,n.jsx)(s.a,{href:"/docs/audio/ALAC",children:"ALAC"})," (2004)."]}),"\n",(0,n.jsx)(s.li,{children:"OptimFROG Dualstream is a feature of OptimFROG codec serving a similar purpose to WavPack Hybrid, however it was introduced much later."}),"\n",(0,n.jsxs)(s.li,{children:["Apparently there are some devices with WavPack ",(0,n.jsx)(s.a,{href:"https://hydrogenaud.io/index.php/topic,119143.0.html",children:"Hardware Support"}),"."]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"References:"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.wavpack.com/WavPack.pdf",children:"WavPack Compression Techniques"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.wavpack.com/technical.htm",children:"WavPack Technical Document"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://web.archive.org/web/20160705230053/http://www.wavpack.com/file_format.txt",children:"Old WavPack File Format Specification"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://wiki.hydrogenaud.io/index.php?title=WavPack",children:"Hydrogenaudio Wiki"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://wiki.multimedia.cx/index.php/WavPack",children:"Multimedia.cx Wiki"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/WavPack",children:"Wikipedia"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://ffmpeg.org/doxygen/3.3/wavpackenc_8c_source.html",children:"FFmpeg WavPack Source"})}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,s,i)=>{i.d(s,{R:()=>d,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function d(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c92fe796.26342a37.js b/assets/js/c92fe796.26342a37.js deleted file mode 100644 index 8293936fc..000000000 --- a/assets/js/c92fe796.26342a37.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3034],{3083:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var t=n(4848),s=n(8453);const r={title:"ffmpeg",sidebar_position:3},o="FFmpeg",d={id:"utilities/ffmpeg",title:"ffmpeg",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/utilities/ffmpeg.mdx",sourceDirName:"utilities",slug:"/utilities/ffmpeg",permalink:"/docs/utilities/ffmpeg",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/ffmpeg.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"ffmpeg",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Av1an",permalink:"/docs/utilities/av1an"},next:{title:"MKVToolNix",permalink:"/docs/utilities/MKVToolNix"}},l={},c=[{value:"Linux & macOS",id:"linux--macos",level:3},{value:"Windows",id:"windows",level:3},{value:"Transcode a video",id:"transcode-a-video",level:4},{value:"Transmux a video",id:"transmux-a-video",level:4},{value:"Filter a video",id:"filter-a-video",level:4},{value:"Container selection",id:"container-selection",level:4}];function a(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"ffmpeg",children:"FFmpeg"})}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"https://ffmpeg.org/",children:"FFmpeg"})," is a multimedia framework that has utilities for transcoding, transmuxing, and filtering audio and video. It provides the ",(0,t.jsx)(i.code,{children:"ffmpeg"}),", ",(0,t.jsx)(i.code,{children:"ffprobe"}),", and ",(0,t.jsx)(i.code,{children:"ffplay"})," command-line utilities. It also features the libav* libraries, which allow you to use the functionality of FFmpeg without the programs."]}),"\n",(0,t.jsx)(i.h1,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(i.p,{children:"There are a number of ways to install FFmpeg depending on the operating system you're using."}),"\n",(0,t.jsx)(i.h3,{id:"linux--macos",children:"Linux & macOS"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Package Manager"})}),"\n",(0,t.jsxs)(i.p,{children:["The easiest way to obtain FFmpeg is through your package manager. On most package managers, the package is simply named ",(0,t.jsx)(i.code,{children:"ffmpeg"}),", however ",(0,t.jsx)(i.code,{children:"ffprobe"})," and ",(0,t.jsx)(i.code,{children:"ffplay"})," may have their own packages. Note that the packages may be outdated."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Compiling from source"})}),"\n",(0,t.jsxs)(i.p,{children:["A more complete guide is available at the ",(0,t.jsx)(i.a,{href:"https://trac.ffmpeg.org/wiki/CompilationGuide",children:"FFmpeg Compilation Guide"}),". Simplifying things a bit, what you need to do is:"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["grab ",(0,t.jsx)(i.a,{href:"https://ffmpeg.org/download.html",children:"the sources"})," or clone from FFmpeg's git: ",(0,t.jsx)(i.code,{children:"git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg"})]}),"\n",(0,t.jsxs)(i.li,{children:["Enter the directory & run ",(0,t.jsx)(i.code,{children:"./configure --help"})," to see a list of features and libraries you can choose to build with."]}),"\n",(0,t.jsx)(i.li,{children:"Install all libraries you want to build FFmpeg with."}),"\n",(0,t.jsxs)(i.li,{children:["Run ",(0,t.jsx)(i.code,{children:"./configure"})," with ",(0,t.jsx)(i.code,{children:"--enable-"})," flags as desired."]}),"\n",(0,t.jsxs)(i.li,{children:["Run ",(0,t.jsx)(i.code,{children:"make"}),", or ",(0,t.jsx)(i.code,{children:"make -j $(nproc)"})," on Linux to properly make use of multiple cores. on macOS, this would be ",(0,t.jsx)(i.code,{children:"make -j $(sysctl -n hw.ncpu)"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:["Run ",(0,t.jsx)(i.code,{children:"make install"}),". May require root."]}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,t.jsx)(i.p,{children:"There are no official binaries for FFmpeg on Windows, but you can download third-party binaries:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["by ",(0,t.jsx)(i.a,{href:"https://www.gyan.dev/ffmpeg/builds/",children:"gyan.dev"})]}),"\n",(0,t.jsxs)(i.li,{children:["by ",(0,t.jsx)(i.a,{href:"https://github.com/BtbN/FFmpeg-Builds/releases",children:"BtbN"})]}),"\n"]}),"\n",(0,t.jsx)(i.h1,{id:"using-ffmpeg",children:"Using FFmpeg"}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"ffmpeg"})," is the primary command-line tool of FFmpeg. It takes 0 or more files as inputs & outputs."]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"ffmpeg"}),"'s command-line arguments are positional, meaning it matters where you put each option. Each input and output has its own arguments. For example, ",(0,t.jsx)(i.code,{children:"ffmpeg -r 24 -i file1 file2"})," applies the ",(0,t.jsx)(i.code,{children:"-r 24"})," option to the input ",(0,t.jsx)(i.code,{children:"file1"}),", interpreting the video as having that frame rate, while ",(0,t.jsx)(i.code,{children:"ffmpeg -i file1 -r 24 file2"})," applies the ",(0,t.jsx)(i.code,{children:"-r 24"})," option to ",(0,t.jsx)(i.code,{children:"file2"}),". To get a list of options, refer to the more verbose ",(0,t.jsx)(i.a,{href:"//ffmpeg.org/ffmpeg-all.html",children:"FFmpeg documentation"}),"."]}),"\n",(0,t.jsx)(i.h4,{id:"transcode-a-video",children:"Transcode a video"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"ffmpeg -i [input] -c:v [video_codec] -b:v [video_bitrate] -c:a [audio_codec] -b:a [audio_bitrate] output\n"})}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Option"}),(0,t.jsx)(i.th,{children:"Meaning"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"-c:v video_encoder"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.strong,{children:"c"}),"odec for the automatically selected ",(0,t.jsx)(i.strong,{children:"v"}),"ideo stream"]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"-b:v video_bitrate"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.strong,{children:"b"}),"itrate for the automatically selected ",(0,t.jsx)(i.strong,{children:"v"}),"ideo stream"]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"-c:a audio_encoder"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.strong,{children:"c"}),"odec for the automatically selected ",(0,t.jsx)(i.strong,{children:"a"}),"udio stream"]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"-b:a audio_bitrate"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.strong,{children:"b"}),"itrate for the automatically selected ",(0,t.jsx)(i.strong,{children:"a"}),"udio stream"]})]})]})]}),"\n",(0,t.jsx)(i.h4,{id:"transmux-a-video",children:"Transmux a video"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"ffmpeg -i [input] -c copy [output]\n"})}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Option"}),(0,t.jsx)(i.th,{children:"Meaning"})]})}),(0,t.jsx)(i.tbody,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"-c copy"})}),(0,t.jsxs)(i.td,{children:["set the ",(0,t.jsx)(i.strong,{children:"c"}),"odec to ",(0,t.jsx)(i.strong,{children:"copy"})]})]})})]}),"\n",(0,t.jsx)(i.h4,{id:"filter-a-video",children:"Filter a video"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"ffmpeg -i [input] -c:v [video_encoder] -c:a [audio_codec] (...) -vf [filter_name] output\n"})}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Option"}),(0,t.jsx)(i.th,{children:"Meaning"})]})}),(0,t.jsx)(i.tbody,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"-vf filter_name"})}),(0,t.jsxs)(i.td,{children:["set the ",(0,t.jsx)(i.strong,{children:"v"}),"ideo ",(0,t.jsx)(i.strong,{children:"f"}),"ilter to ",(0,t.jsx)(i.strong,{children:"filter_name"})]})]})})]}),"\n",(0,t.jsx)(i.h4,{id:"container-selection",children:"Container selection"}),"\n",(0,t.jsxs)(i.p,{children:["FFmpeg will usually select the appropriate container based on the file extension of the output. If it doesn't detect the correct container, you can specify it with ",(0,t.jsx)(i.code,{children:"-f"}),"."]}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Option"}),(0,t.jsx)(i.th,{children:"Meaning"})]})}),(0,t.jsx)(i.tbody,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"-f format_name"})}),(0,t.jsxs)(i.td,{children:["set the ",(0,t.jsx)(i.strong,{children:"f"}),"ormat to ",(0,t.jsx)(i.strong,{children:"format_name"})]})]})})]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.em,{children:"References:"}),"\n",(0,t.jsxs)(i.em,{children:["[^multimediawiki-howtos]: ",(0,t.jsx)(i.a,{href:"//wiki.multimedia.cx/index.php?search=HOWTO&title=Special%3ASearch&go=Go",children:"HOWTO Search Results - MultimediaWiki"})]})]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsxs)(i.em,{children:["Special thanks to ",(0,t.jsx)(i.a,{href:"https://encoding.bluefalcon.cc/",children:"bluefalcon's encoding guide"})," for this material, licensed under CC BY-SA 4.0. Our adaptation features formatting changes & content changes, specifically regarding the titles of some headings."]})})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>d});var t=n(6540);const s={},r=t.createContext(s);function o(e){const i=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c92fe796.dd492aca.js b/assets/js/c92fe796.dd492aca.js new file mode 100644 index 000000000..974d34eeb --- /dev/null +++ b/assets/js/c92fe796.dd492aca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3034],{454:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"utilities/ffmpeg","title":"ffmpeg","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/utilities/ffmpeg.mdx","sourceDirName":"utilities","slug":"/utilities/ffmpeg","permalink":"/docs/utilities/ffmpeg","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/ffmpeg.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"ffmpeg","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Av1an","permalink":"/docs/utilities/av1an"},"next":{"title":"MKVToolNix","permalink":"/docs/utilities/MKVToolNix"}}');var s=n(4848),r=n(8453);const o={title:"ffmpeg",sidebar_position:3},d="FFmpeg",l={},c=[{value:"Linux & macOS",id:"linux--macos",level:3},{value:"Windows",id:"windows",level:3},{value:"Transcode a video",id:"transcode-a-video",level:4},{value:"Transmux a video",id:"transmux-a-video",level:4},{value:"Filter a video",id:"filter-a-video",level:4},{value:"Container selection",id:"container-selection",level:4}];function a(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"ffmpeg",children:"FFmpeg"})}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.a,{href:"https://ffmpeg.org/",children:"FFmpeg"})," is a multimedia framework that has utilities for transcoding, transmuxing, and filtering audio and video. It provides the ",(0,s.jsx)(i.code,{children:"ffmpeg"}),", ",(0,s.jsx)(i.code,{children:"ffprobe"}),", and ",(0,s.jsx)(i.code,{children:"ffplay"})," command-line utilities. It also features the libav* libraries, which allow you to use the functionality of FFmpeg without the programs."]}),"\n",(0,s.jsx)(i.h1,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(i.p,{children:"There are a number of ways to install FFmpeg depending on the operating system you're using."}),"\n",(0,s.jsx)(i.h3,{id:"linux--macos",children:"Linux & macOS"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Package Manager"})}),"\n",(0,s.jsxs)(i.p,{children:["The easiest way to obtain FFmpeg is through your package manager. On most package managers, the package is simply named ",(0,s.jsx)(i.code,{children:"ffmpeg"}),", however ",(0,s.jsx)(i.code,{children:"ffprobe"})," and ",(0,s.jsx)(i.code,{children:"ffplay"})," may have their own packages. Note that the packages may be outdated."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Compiling from source"})}),"\n",(0,s.jsxs)(i.p,{children:["A more complete guide is available at the ",(0,s.jsx)(i.a,{href:"https://trac.ffmpeg.org/wiki/CompilationGuide",children:"FFmpeg Compilation Guide"}),". Simplifying things a bit, what you need to do is:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["grab ",(0,s.jsx)(i.a,{href:"https://ffmpeg.org/download.html",children:"the sources"})," or clone from FFmpeg's git: ",(0,s.jsx)(i.code,{children:"git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg"})]}),"\n",(0,s.jsxs)(i.li,{children:["Enter the directory & run ",(0,s.jsx)(i.code,{children:"./configure --help"})," to see a list of features and libraries you can choose to build with."]}),"\n",(0,s.jsx)(i.li,{children:"Install all libraries you want to build FFmpeg with."}),"\n",(0,s.jsxs)(i.li,{children:["Run ",(0,s.jsx)(i.code,{children:"./configure"})," with ",(0,s.jsx)(i.code,{children:"--enable-"})," flags as desired."]}),"\n",(0,s.jsxs)(i.li,{children:["Run ",(0,s.jsx)(i.code,{children:"make"}),", or ",(0,s.jsx)(i.code,{children:"make -j $(nproc)"})," on Linux to properly make use of multiple cores. on macOS, this would be ",(0,s.jsx)(i.code,{children:"make -j $(sysctl -n hw.ncpu)"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Run ",(0,s.jsx)(i.code,{children:"make install"}),". May require root."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,s.jsx)(i.p,{children:"There are no official binaries for FFmpeg on Windows, but you can download third-party binaries:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["by ",(0,s.jsx)(i.a,{href:"https://www.gyan.dev/ffmpeg/builds/",children:"gyan.dev"})]}),"\n",(0,s.jsxs)(i.li,{children:["by ",(0,s.jsx)(i.a,{href:"https://github.com/BtbN/FFmpeg-Builds/releases",children:"BtbN"})]}),"\n"]}),"\n",(0,s.jsx)(i.h1,{id:"using-ffmpeg",children:"Using FFmpeg"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.code,{children:"ffmpeg"})," is the primary command-line tool of FFmpeg. It takes 0 or more files as inputs & outputs."]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.code,{children:"ffmpeg"}),"'s command-line arguments are positional, meaning it matters where you put each option. Each input and output has its own arguments. For example, ",(0,s.jsx)(i.code,{children:"ffmpeg -r 24 -i file1 file2"})," applies the ",(0,s.jsx)(i.code,{children:"-r 24"})," option to the input ",(0,s.jsx)(i.code,{children:"file1"}),", interpreting the video as having that frame rate, while ",(0,s.jsx)(i.code,{children:"ffmpeg -i file1 -r 24 file2"})," applies the ",(0,s.jsx)(i.code,{children:"-r 24"})," option to ",(0,s.jsx)(i.code,{children:"file2"}),". To get a list of options, refer to the more verbose ",(0,s.jsx)(i.a,{href:"//ffmpeg.org/ffmpeg-all.html",children:"FFmpeg documentation"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"transcode-a-video",children:"Transcode a video"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"ffmpeg -i [input] -c:v [video_codec] -b:v [video_bitrate] -c:a [audio_codec] -b:a [audio_bitrate] output\n"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Option"}),(0,s.jsx)(i.th,{children:"Meaning"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.code,{children:"-c:v video_encoder"})}),(0,s.jsxs)(i.td,{children:[(0,s.jsx)(i.strong,{children:"c"}),"odec for the automatically selected ",(0,s.jsx)(i.strong,{children:"v"}),"ideo stream"]})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.code,{children:"-b:v video_bitrate"})}),(0,s.jsxs)(i.td,{children:[(0,s.jsx)(i.strong,{children:"b"}),"itrate for the automatically selected ",(0,s.jsx)(i.strong,{children:"v"}),"ideo stream"]})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.code,{children:"-c:a audio_encoder"})}),(0,s.jsxs)(i.td,{children:[(0,s.jsx)(i.strong,{children:"c"}),"odec for the automatically selected ",(0,s.jsx)(i.strong,{children:"a"}),"udio stream"]})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.code,{children:"-b:a audio_bitrate"})}),(0,s.jsxs)(i.td,{children:[(0,s.jsx)(i.strong,{children:"b"}),"itrate for the automatically selected ",(0,s.jsx)(i.strong,{children:"a"}),"udio stream"]})]})]})]}),"\n",(0,s.jsx)(i.h4,{id:"transmux-a-video",children:"Transmux a video"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"ffmpeg -i [input] -c copy [output]\n"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Option"}),(0,s.jsx)(i.th,{children:"Meaning"})]})}),(0,s.jsx)(i.tbody,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.code,{children:"-c copy"})}),(0,s.jsxs)(i.td,{children:["set the ",(0,s.jsx)(i.strong,{children:"c"}),"odec to ",(0,s.jsx)(i.strong,{children:"copy"})]})]})})]}),"\n",(0,s.jsx)(i.h4,{id:"filter-a-video",children:"Filter a video"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"ffmpeg -i [input] -c:v [video_encoder] -c:a [audio_codec] (...) -vf [filter_name] output\n"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Option"}),(0,s.jsx)(i.th,{children:"Meaning"})]})}),(0,s.jsx)(i.tbody,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.code,{children:"-vf filter_name"})}),(0,s.jsxs)(i.td,{children:["set the ",(0,s.jsx)(i.strong,{children:"v"}),"ideo ",(0,s.jsx)(i.strong,{children:"f"}),"ilter to ",(0,s.jsx)(i.strong,{children:"filter_name"})]})]})})]}),"\n",(0,s.jsx)(i.h4,{id:"container-selection",children:"Container selection"}),"\n",(0,s.jsxs)(i.p,{children:["FFmpeg will usually select the appropriate container based on the file extension of the output. If it doesn't detect the correct container, you can specify it with ",(0,s.jsx)(i.code,{children:"-f"}),"."]}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Option"}),(0,s.jsx)(i.th,{children:"Meaning"})]})}),(0,s.jsx)(i.tbody,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.code,{children:"-f format_name"})}),(0,s.jsxs)(i.td,{children:["set the ",(0,s.jsx)(i.strong,{children:"f"}),"ormat to ",(0,s.jsx)(i.strong,{children:"format_name"})]})]})})]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.em,{children:"References:"}),"\n",(0,s.jsxs)(i.em,{children:["[^multimediawiki-howtos]: ",(0,s.jsx)(i.a,{href:"//wiki.multimedia.cx/index.php?search=HOWTO&title=Special%3ASearch&go=Go",children:"HOWTO Search Results - MultimediaWiki"})]})]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsxs)(i.em,{children:["Special thanks to ",(0,s.jsx)(i.a,{href:"https://encoding.bluefalcon.cc/",children:"bluefalcon's encoding guide"})," for this material, licensed under CC BY-SA 4.0. Our adaptation features formatting changes & content changes, specifically regarding the titles of some headings."]})})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>d});var t=n(6540);const s={},r=t.createContext(s);function o(e){const i=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c943a24a.3e2e52c2.js b/assets/js/c943a24a.3e2e52c2.js new file mode 100644 index 000000000..ef1418e0e --- /dev/null +++ b/assets/js/c943a24a.3e2e52c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5512],{1963:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"introduction/high-dynamic-range","title":"High Dynamic Range","description":"HDR (High Dynamic Range) is a technology used in modern TVs and displays to produce more vibrant and lifelike images. In simple terms, it allows your TV to display a wider range of colors and brightness levels than standard displays. This means that you can see more details in both bright and dark areas of an image, which can make movies, TV shows, and video games look much more realistic.","source":"@site/docs/introduction/high-dynamic-range.mdx","sourceDirName":"introduction","slug":"/introduction/high-dynamic-range","permalink":"/docs/introduction/high-dynamic-range","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/high-dynamic-range.mdx","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"Psychovisual","permalink":"/docs/introduction/psychovisual"},"next":{"title":"Intro","permalink":"/docs/audio/intro"}}');var a=t(4848),o=t(8453);const s={sidebar_position:6},r="High Dynamic Range",d={},l=[{value:"HLG",id:"hlg",level:2},{value:"HDR10",id:"hdr10",level:2},{value:"HDR10+",id:"hdr10-1",level:2},{value:"Dolby Vision",id:"dolby-vision",level:2}];function c(e){const i={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.header,{children:(0,a.jsx)(i.h1,{id:"high-dynamic-range",children:"High Dynamic Range"})}),"\n",(0,a.jsx)(i.p,{children:"HDR (High Dynamic Range) is a technology used in modern TVs and displays to produce more vibrant and lifelike images. In simple terms, it allows your TV to display a wider range of colors and brightness levels than standard displays. This means that you can see more details in both bright and dark areas of an image, which can make movies, TV shows, and video games look much more realistic."}),"\n",(0,a.jsx)(i.p,{children:"HDR10 works by using metadata that tells your TV how to display the content in the best way possible. This metadata includes information about the maximum brightness level and color gamut of the content, which allows your TV to adjust its settings to match the content being displayed. In other words, HDR10 helps your TV display images that are closer to what the content creators intended you to see, resulting in a more immersive viewing experience."}),"\n",(0,a.jsx)(i.h2,{id:"hlg",children:"HLG"}),"\n",(0,a.jsx)(i.p,{children:"HLG (Hybrid log-gamma) is a type of HDR video format that was developed to optimize video for both standard dynamic range (SDR) and HDR displays, jointly developed by the BBC and NHK."}),"\n",(0,a.jsx)(i.p,{children:"To understand how HLG works, it's helpful to know that the way we perceive brightness and color in a video is different from how it's captured and displayed on a screen. Brightness and color information is usually captured in a logarithmic curve, while SDR displays typically reproduce the image with a gamma curve. HDR displays, on the other hand, reproduce the image with a different type of curve, known as the Perceptual Quantizer (PQ) curve."}),"\n",(0,a.jsx)(i.p,{children:"The HLG curve is a hybrid of these two curves, which means that it's optimized for both SDR and HDR displays. It's designed to work with a wider range of brightness levels than SDR displays, but also be backward compatible with SDR displays."}),"\n",(0,a.jsx)(i.p,{children:"In simpler terms, the HLG curve is a way of capturing and displaying video that works well on both SDR and HDR displays. It's like a bridge between the way video is captured and the way it's displayed, and it's designed to optimize the video for a wider range of brightness levels than traditional SDR video. The result is video content that looks more realistic and vivid on both SDR and HDR displays."}),"\n",(0,a.jsx)(i.h2,{id:"hdr10",children:"HDR10"}),"\n",(0,a.jsx)(i.p,{children:"HDR10 is an open high-dynamic-range video (HDR) standard announced on 27 August 2015 by the Consumer Technology Association. It is the most widespread of the HDR formats. It only allows static metadata."}),"\n",(0,a.jsx)(i.h2,{id:"hdr10-1",children:"HDR10+"}),"\n",(0,a.jsxs)(i.p,{children:["HDR10+ is basically an upgrade to the previous HDR10 by adding dynamic metadata support (in ",(0,a.jsx)(i.code,{children:".json"}),") to optimize each scene's content light level as the director intended."]}),"\n",(0,a.jsx)(i.h2,{id:"dolby-vision",children:"Dolby Vision"}),"\n",(0,a.jsx)(i.p,{children:"Dolby Vision is proprietary HDR format developed by Dolby Laboratories and a direct competitor to HDR10+."})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,a.jsx)(i,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>r});var n=t(6540);const a={},o=n.createContext(a);function s(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c943a24a.7eb67860.js b/assets/js/c943a24a.7eb67860.js deleted file mode 100644 index 958a5887b..000000000 --- a/assets/js/c943a24a.7eb67860.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5512],{556:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var n=t(4848),a=t(8453);const o={sidebar_position:6},s="High Dynamic Range",r={id:"introduction/high-dynamic-range",title:"High Dynamic Range",description:"HDR (High Dynamic Range) is a technology used in modern TVs and displays to produce more vibrant and lifelike images. In simple terms, it allows your TV to display a wider range of colors and brightness levels than standard displays. This means that you can see more details in both bright and dark areas of an image, which can make movies, TV shows, and video games look much more realistic.",source:"@site/docs/introduction/high-dynamic-range.mdx",sourceDirName:"introduction",slug:"/introduction/high-dynamic-range",permalink:"/docs/introduction/high-dynamic-range",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/high-dynamic-range.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Psychovisual",permalink:"/docs/introduction/psychovisual"},next:{title:"Intro",permalink:"/docs/audio/intro"}},d={},l=[{value:"HLG",id:"hlg",level:2},{value:"HDR10",id:"hdr10",level:2},{value:"HDR10+",id:"hdr10-1",level:2},{value:"Dolby Vision",id:"dolby-vision",level:2}];function h(e){const i={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"high-dynamic-range",children:"High Dynamic Range"})}),"\n",(0,n.jsx)(i.p,{children:"HDR (High Dynamic Range) is a technology used in modern TVs and displays to produce more vibrant and lifelike images. In simple terms, it allows your TV to display a wider range of colors and brightness levels than standard displays. This means that you can see more details in both bright and dark areas of an image, which can make movies, TV shows, and video games look much more realistic."}),"\n",(0,n.jsx)(i.p,{children:"HDR10 works by using metadata that tells your TV how to display the content in the best way possible. This metadata includes information about the maximum brightness level and color gamut of the content, which allows your TV to adjust its settings to match the content being displayed. In other words, HDR10 helps your TV display images that are closer to what the content creators intended you to see, resulting in a more immersive viewing experience."}),"\n",(0,n.jsx)(i.h2,{id:"hlg",children:"HLG"}),"\n",(0,n.jsx)(i.p,{children:"HLG (Hybrid log-gamma) is a type of HDR video format that was developed to optimize video for both standard dynamic range (SDR) and HDR displays, jointly developed by the BBC and NHK."}),"\n",(0,n.jsx)(i.p,{children:"To understand how HLG works, it's helpful to know that the way we perceive brightness and color in a video is different from how it's captured and displayed on a screen. Brightness and color information is usually captured in a logarithmic curve, while SDR displays typically reproduce the image with a gamma curve. HDR displays, on the other hand, reproduce the image with a different type of curve, known as the Perceptual Quantizer (PQ) curve."}),"\n",(0,n.jsx)(i.p,{children:"The HLG curve is a hybrid of these two curves, which means that it's optimized for both SDR and HDR displays. It's designed to work with a wider range of brightness levels than SDR displays, but also be backward compatible with SDR displays."}),"\n",(0,n.jsx)(i.p,{children:"In simpler terms, the HLG curve is a way of capturing and displaying video that works well on both SDR and HDR displays. It's like a bridge between the way video is captured and the way it's displayed, and it's designed to optimize the video for a wider range of brightness levels than traditional SDR video. The result is video content that looks more realistic and vivid on both SDR and HDR displays."}),"\n",(0,n.jsx)(i.h2,{id:"hdr10",children:"HDR10"}),"\n",(0,n.jsx)(i.p,{children:"HDR10 is an open high-dynamic-range video (HDR) standard announced on 27 August 2015 by the Consumer Technology Association. It is the most widespread of the HDR formats. It only allows static metadata."}),"\n",(0,n.jsx)(i.h2,{id:"hdr10-1",children:"HDR10+"}),"\n",(0,n.jsxs)(i.p,{children:["HDR10+ is basically an upgrade to the previous HDR10 by adding dynamic metadata support (in ",(0,n.jsx)(i.code,{children:".json"}),") to optimize each scene's content light level as the director intended."]}),"\n",(0,n.jsx)(i.h2,{id:"dolby-vision",children:"Dolby Vision"}),"\n",(0,n.jsx)(i.p,{children:"Dolby Vision is proprietary HDR format developed by Dolby Laboratories and a direct competitor to HDR10+."})]})}function c(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>r});var n=t(6540);const a={},o=n.createContext(a);function s(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.53a4f211.js b/assets/js/ccc49370.53a4f211.js new file mode 100644 index 000000000..a3d209628 --- /dev/null +++ b/assets/js/ccc49370.53a4f211.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3249],{3858:(e,n,t)=>{t.r(n),t.d(n,{default:()=>b});t(6540);var i=t(4164),a=t(1213),s=t(7559),r=t(4096),o=t(8027),l=t(1240),c=t(1312),d=t(9022),u=t(4848);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer post"})}),n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older post"}),isNext:!0})]})}function h(){const{assets:e,metadata:n}=(0,r.e7)(),{title:t,description:i,date:s,tags:o,authors:l,frontMatter:c}=n,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:c.title_meta??t,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:s}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),o.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:o.map((e=>e.label)).join(",")})]})}var f=t(5260);function g(){const e=(0,r.J_)();return(0,u.jsx)(f.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var p=t(7763),v=t(6451);function x(e){let{sidebar:n,children:t}=e;const{metadata:i,toc:a}=(0,r.e7)(),{nextItem:s,prevItem:c,frontMatter:d}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:g}=d;return(0,u.jsxs)(o.A,{sidebar:n,toc:!h&&a.length>0?(0,u.jsx)(p.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:g}):void 0,children:[(0,u.jsx)(v.A,{metadata:i}),(0,u.jsx)(l.A,{children:t}),(s||c)&&(0,u.jsx)(m,{nextItem:s,prevItem:c})]})}function b(e){const n=e.content;return(0,u.jsx)(r.in,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(s.G.wrapper.blogPages,s.G.page.blogPostPage),children:[(0,u.jsx)(h,{}),(0,u.jsx)(g,{}),(0,u.jsx)(x,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},2234:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(4084),s=t(7559),r=t(7293),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,i.A)(n,s.G.common.unlistedBanner),children:(0,o.jsx)(a.Uh,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.AE,{}),(0,o.jsx)(l,{...e})]})}},6451:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var i=t(4164),a=t(4084),s=t(7559),r=t(7293),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Yh,{}),className:(0,i.A)(n,s.G.common.draftBanner),children:(0,o.jsx)(a.TT,{})})}var c=t(2234);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:i}=n;return(0,o.jsxs)(o.Fragment,{children:[(t||i.unlisted)&&(0,o.jsx)(c.A,{}),i.draft&&(0,o.jsx)(l,{})]})}},7763:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=t(4848);const o="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,r.jsx)("div",{className:(0,i.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,r.jsx)(a.A,{...t,linkClassName:o,linkActiveClassName:l})})}},5195:(e,n,t)=>{t.d(n,{A:()=>g});var i=t(6540),a=t(6342);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function r(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=r({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function l(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>o(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:r}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:r}),c=l(o,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}var u=t(8774),m=t(4848);function h(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const f=i.memo(h);function g(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const g=(0,a.p)(),p=c??g.tableOfContents.minHeadingLevel,v=u??g.tableOfContents.maxHeadingLevel,x=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>r({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:p,maxHeadingLevel:v});return d((0,i.useMemo)((()=>{if(o&&l)return{linkClassName:o,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:v}}),[o,l,p,v])),(0,m.jsx)(f,{toc:x,className:t,linkClassName:o,...h})}},4084:(e,n,t)=>{t.d(n,{AE:()=>l,Rc:()=>r,TT:()=>d,Uh:()=>o,Yh:()=>c});t(6540);var i=t(1312),a=t(5260),s=t(4848);function r(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function l(){return(0,s.jsx)(a.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.847a3819.js b/assets/js/ccc49370.847a3819.js deleted file mode 100644 index d1d2e3f3c..000000000 --- a/assets/js/ccc49370.847a3819.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3249],{3858:(e,n,t)=>{t.r(n),t.d(n,{default:()=>b});t(6540);var i=t(4164),a=t(1213),s=t(7559),r=t(4096),o=t(8027),l=t(1240),c=t(1312),d=t(9022),u=t(4848);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer post"})}),n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older post"}),isNext:!0})]})}function h(){const{assets:e,metadata:n}=(0,r.e7)(),{title:t,description:i,date:s,tags:o,authors:l,frontMatter:c}=n,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:t,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:s}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),o.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:o.map((e=>e.label)).join(",")})]})}var f=t(5260);function g(){const e=(0,r.J_)();return(0,u.jsx)(f.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var p=t(7763),v=t(1689);function x(e){let{sidebar:n,children:t}=e;const{metadata:i,toc:a}=(0,r.e7)(),{nextItem:s,prevItem:c,frontMatter:d}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:g}=d;return(0,u.jsxs)(o.A,{sidebar:n,toc:!h&&a.length>0?(0,u.jsx)(p.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:g}):void 0,children:[(0,u.jsx)(v.A,{metadata:i}),(0,u.jsx)(l.A,{children:t}),(s||c)&&(0,u.jsx)(m,{nextItem:s,prevItem:c})]})}function b(e){const n=e.content;return(0,u.jsx)(r.in,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(s.G.wrapper.blogPages,s.G.page.blogPostPage),children:[(0,u.jsx)(h,{}),(0,u.jsx)(g,{}),(0,u.jsx)(x,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},2234:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(4084),s=t(7559),r=t(7293),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,i.A)(n,s.G.common.unlistedBanner),children:(0,o.jsx)(a.Uh,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.AE,{}),(0,o.jsx)(l,{...e})]})}},1689:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var i=t(4164),a=t(4084),s=t(7559),r=t(7293),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Yh,{}),className:(0,i.A)(n,s.G.common.draftBanner),children:(0,o.jsx)(a.TT,{})})}var c=t(2234);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:i}=n;return(0,o.jsxs)(o.Fragment,{children:[(t||i.unlisted)&&(0,o.jsx)(c.A,{}),i.draft&&(0,o.jsx)(l,{})]})}},7763:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=t(4848);const o="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,r.jsx)("div",{className:(0,i.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,r.jsx)(a.A,{...t,linkClassName:o,linkActiveClassName:l})})}},5195:(e,n,t)=>{t.d(n,{A:()=>g});var i=t(6540),a=t(6342);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function r(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=r({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function l(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>o(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:r}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:r}),c=l(o,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}var u=t(8774),m=t(4848);function h(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const f=i.memo(h);function g(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const g=(0,a.p)(),p=c??g.tableOfContents.minHeadingLevel,v=u??g.tableOfContents.maxHeadingLevel,x=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>r({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:p,maxHeadingLevel:v});return d((0,i.useMemo)((()=>{if(o&&l)return{linkClassName:o,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:v}}),[o,l,p,v])),(0,m.jsx)(f,{toc:x,className:t,linkClassName:o,...h})}},4084:(e,n,t)=>{t.d(n,{AE:()=>l,Rc:()=>r,TT:()=>d,Uh:()=>o,Yh:()=>c});t(6540);var i=t(1312),a=t(5260),s=t(4848);function r(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function l(){return(0,s.jsx)(a.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/cce09ffa.29842373.js b/assets/js/cce09ffa.29842373.js deleted file mode 100644 index d85cfc07d..000000000 --- a/assets/js/cce09ffa.29842373.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5556],{1939:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>a,metadata:()=>r,toc:()=>m});var n=i(4848),o=i(8453);const a={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},s=void 0,r={permalink:"/blog/av1-encoding-for-dummies",source:"@site/blog/2023-09-03-av1-for-dummies.mdx",title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",date:"2023-09-03T00:00:00.000Z",tags:[{inline:!0,label:"video",permalink:"/blog/tags/video"},{inline:!0,label:"compression",permalink:"/blog/tags/compression"}],readingTime:16.09,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4",key:null,page:null},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4",key:null,page:null}],frontMatter:{title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"},nextItem:{title:"Reducing Image Load Online",permalink:"/blog/site-optimization"}},u={authorsImageUrls:[void 0,void 0]},m=[];function l(e){const t={code:"code",em:"em",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,n.jsxs)(t.p,{children:["This guide will show you how to encode in AV1 the ",(0,n.jsx)(t.em,{children:"right"})," and ",(0,n.jsx)(t.em,{children:"optimal"})," way. Yes, you using standalone ",(0,n.jsx)(t.code,{children:"libaom"}),", ",(0,n.jsx)(t.code,{children:"libsvtav1"}),", and ",(0,n.jsx)(t.code,{children:"librav1e"})," from FFmpeg or even piping ",(0,n.jsx)(t.code,{children:"yuv4mpeg"})," into ",(0,n.jsx)(t.strong,{children:"mainline"})," aomenc are all unoptimal."]})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>r});var n=i(6540);const o={},a=n.createContext(o);function s(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cce09ffa.c2a08b45.js b/assets/js/cce09ffa.c2a08b45.js new file mode 100644 index 000000000..0305ec5ce --- /dev/null +++ b/assets/js/cce09ffa.c2a08b45.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5556],{1939:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>u,contentTitle:()=>r,default:()=>c,frontMatter:()=>s,metadata:()=>n,toc:()=>l});var n=i(7233),o=i(4848),a=i(8453);const s={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},r=void 0,u={authorsImageUrls:[void 0,void 0]},l=[];function m(e){const t={code:"code",em:"em",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,o.jsxs)(t.p,{children:["This guide will show you how to encode in AV1 the ",(0,o.jsx)(t.em,{children:"right"})," and ",(0,o.jsx)(t.em,{children:"optimal"})," way. Yes, you using standalone ",(0,o.jsx)(t.code,{children:"libaom"}),", ",(0,o.jsx)(t.code,{children:"libsvtav1"}),", and ",(0,o.jsx)(t.code,{children:"librav1e"})," from FFmpeg or even piping ",(0,o.jsx)(t.code,{children:"yuv4mpeg"})," into ",(0,o.jsx)(t.strong,{children:"mainline"})," aomenc are all unoptimal."]})}function c(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(m,{...e})}):m(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>r});var n=i(6540);const o={},a=n.createContext(o);function s(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:t},e.children)}},7233:e=>{e.exports=JSON.parse('{"permalink":"/blog/av1-encoding-for-dummies","source":"@site/blog/2023-09-03-av1-for-dummies.mdx","title":"AV1 Encoding for Dummies","description":"This guide will show you how to encode in AV1 the *right* and *optimal* way.","date":"2023-09-03T00:00:00.000Z","tags":[{"inline":true,"label":"video","permalink":"/blog/tags/video"},{"inline":true,"label":"compression","permalink":"/blog/tags/compression"}],"readingTime":16.09,"hasTruncateMarker":true,"authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4","socials":{},"key":null,"page":null},{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"AV1 Encoding for Dummies","description":"This guide will show you how to encode in AV1 the *right* and *optimal* way.","slug":"av1-encoding-for-dummies","authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"},{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"}],"tags":["video","compression"],"image":"/img/compare-guide.webp","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Embedding the Un-Embeddable","permalink":"/blog/embedding-the-un-embeddable"},"nextItem":{"title":"Reducing Image Load Online","permalink":"/blog/site-optimization"}}')}}]); \ No newline at end of file diff --git a/assets/js/cd6cf5b7.b06d844d.js b/assets/js/cd6cf5b7.b06d844d.js deleted file mode 100644 index 44ead990d..000000000 --- a/assets/js/cd6cf5b7.b06d844d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5365],{9576:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>l});var s=n(4848),i=n(8453);const r={title:"SVT-VP9",sidebar_position:9},o="SVT-VP9",d={id:"encoders/SVT-VP9",title:"SVT-VP9",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/SVT-VP9.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-VP9",permalink:"/docs/encoders/SVT-VP9",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-VP9.mdx",tags:[],version:"current",sidebarPosition:9,frontMatter:{title:"SVT-VP9",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"vpxenc",permalink:"/docs/encoders/vpxenc"},next:{title:"SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC"}},c={},l=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Usage",id:"usage",level:2},{value:"Standalone",id:"standalone",level:3}];function a(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components},{Details:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"svt-vp9",children:"SVT-VP9"})}),"\n",(0,s.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsxs)(t.p,{children:["SVT-VP9 is a ",(0,s.jsx)(t.a,{href:"/docs/video/VP9",children:"VP9"})," encoder developed by Intel.",(0,s.jsx)("br",{}),"\nLike ",(0,s.jsx)(t.a,{href:"/docs/encoders/SVT-HEVC",children:"its"})," ",(0,s.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"siblings"})," in the SVT encoder family, it scales very well on multicore processors by default."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.a,{href:"/docs/encoders/vpxenc",children:"reference encoder"})," beats it in rate control flexibility and supports 10-bit color,",(0,s.jsx)("br",{}),"but SVT-VP9 is much faster out of the box."]}),"\n",(0,s.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(t.p,{children:["There are patches bundled in the SVT-VP9 source code for an FFmpeg plugin that adds the ",(0,s.jsx)(t.code,{children:"libsvt_vp9"})," encoder.",(0,s.jsx)("br",{}),"\nOne must recompile FFmpeg with the plugin patch applied to take advantage of it.",(0,s.jsx)("br",{}),"\n(An easy way to do so on Windows is using ",(0,s.jsx)(t.a,{href:"https://github.com/m-ab-s/media-autobuild_suite",children:"media-autobuild_suite"}),".)"]}),"\n",(0,s.jsxs)(t.p,{children:["Operation is not too different from the SVT-AV1 FFmpeg integration. Your commands will generally look like this:",(0,s.jsx)("br",{}),"\n",(0,s.jsx)(t.code,{children:"ffmpeg -i video.mp4 -c:v libsvt_vp9 -qp 38 -tune ssim -preset 7 -g 255 video_vp9.webm"})]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Parameters"}),(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"-qp"}),(0,s.jsx)(t.td,{children:"Quantizer value, higher = lower quality. Range is 1..51 in current patches, but -qmin/-qmax can be set as high as 69 for extreme low bitrates."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"-preset"}),(0,s.jsx)(t.td,{children:"Speed preset. Range is 0..9, with 9 being fastest and default."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"-tune"}),(0,s.jsx)(t.td,{children:'Quality metric. Can be "vq" (default), "ssim" or "vmaf".'})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"-g"}),(0,s.jsxs)(t.td,{children:['Size of the Group of Pictures. Range is -2..255, with -1 = no intraframe updates ever, -2 = "auto".',(0,s.jsx)("br",{}),"We recommend you set it as high as possible for encode efficiency."]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"-rc"}),(0,s.jsxs)(t.td,{children:["Rate control mode.",(0,s.jsx)("br",{}),'Can be "cqp" (Constant Quantizer, default), "vbr" (Variable Bitrate) or "cbr" (Constant Bitrate).',(0,s.jsx)("br",{}),"(Consider using ",(0,s.jsx)(t.strong,{children:"vpxenc's two-pass mode"})," if you really need to match a target bitrate.)"]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"-level"}),(0,s.jsx)(t.td,{children:"Encoder level. Range is 1..6. Generally better not to set it."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"-socket"}),(0,s.jsx)(t.td,{children:'Index of the CPU socket to use. By default it\'s -1, which uses "all available processors".'})]})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,s.jsx)(t.p,{children:"SVT-VP9 only supports 8-bit yuv420p."}),"\n",(0,s.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(t.h3,{id:"standalone",children:"Standalone"}),"\n",(0,s.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,s.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cd6cf5b7.f8a17d72.js b/assets/js/cd6cf5b7.f8a17d72.js new file mode 100644 index 000000000..7d6fe9597 --- /dev/null +++ b/assets/js/cd6cf5b7.f8a17d72.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5365],{3488:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"encoders/SVT-VP9","title":"SVT-VP9","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/encoders/SVT-VP9.mdx","sourceDirName":"encoders","slug":"/encoders/SVT-VP9","permalink":"/docs/encoders/SVT-VP9","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-VP9.mdx","tags":[],"version":"current","sidebarPosition":9,"frontMatter":{"title":"SVT-VP9","sidebar_position":9},"sidebar":"tutorialSidebar","previous":{"title":"vpxenc","permalink":"/docs/encoders/vpxenc"},"next":{"title":"SVT-HEVC","permalink":"/docs/encoders/SVT-HEVC"}}');var i=n(4848),r=n(8453);const o={title:"SVT-VP9",sidebar_position:9},d="SVT-VP9",c={},l=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Usage",id:"usage",level:2},{value:"Standalone",id:"standalone",level:3}];function a(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components},{Details:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"svt-vp9",children:"SVT-VP9"})}),"\n",(0,i.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsxs)(t.p,{children:["SVT-VP9 is a ",(0,i.jsx)(t.a,{href:"/docs/video/VP9",children:"VP9"})," encoder developed by Intel.",(0,i.jsx)("br",{}),"\nLike ",(0,i.jsx)(t.a,{href:"/docs/encoders/SVT-HEVC",children:"its"})," ",(0,i.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"siblings"})," in the SVT encoder family, it scales very well on multicore processors by default."]}),"\n",(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.a,{href:"/docs/encoders/vpxenc",children:"reference encoder"})," beats it in rate control flexibility and supports 10-bit color,",(0,i.jsx)("br",{}),"but SVT-VP9 is much faster out of the box."]}),"\n",(0,i.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,i.jsxs)(t.p,{children:["There are patches bundled in the SVT-VP9 source code for an FFmpeg plugin that adds the ",(0,i.jsx)(t.code,{children:"libsvt_vp9"})," encoder.",(0,i.jsx)("br",{}),"\nOne must recompile FFmpeg with the plugin patch applied to take advantage of it.",(0,i.jsx)("br",{}),"\n(An easy way to do so on Windows is using ",(0,i.jsx)(t.a,{href:"https://github.com/m-ab-s/media-autobuild_suite",children:"media-autobuild_suite"}),".)"]}),"\n",(0,i.jsxs)(t.p,{children:["Operation is not too different from the SVT-AV1 FFmpeg integration. Your commands will generally look like this:",(0,i.jsx)("br",{}),"\n",(0,i.jsx)(t.code,{children:"ffmpeg -i video.mp4 -c:v libsvt_vp9 -qp 38 -tune ssim -preset 7 -g 255 video_vp9.webm"})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:"Parameters"}),(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Parameter"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"-qp"}),(0,i.jsx)(t.td,{children:"Quantizer value, higher = lower quality. Range is 1..51 in current patches, but -qmin/-qmax can be set as high as 69 for extreme low bitrates."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"-preset"}),(0,i.jsx)(t.td,{children:"Speed preset. Range is 0..9, with 9 being fastest and default."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"-tune"}),(0,i.jsx)(t.td,{children:'Quality metric. Can be "vq" (default), "ssim" or "vmaf".'})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"-g"}),(0,i.jsxs)(t.td,{children:['Size of the Group of Pictures. Range is -2..255, with -1 = no intraframe updates ever, -2 = "auto".',(0,i.jsx)("br",{}),"We recommend you set it as high as possible for encode efficiency."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"-rc"}),(0,i.jsxs)(t.td,{children:["Rate control mode.",(0,i.jsx)("br",{}),'Can be "cqp" (Constant Quantizer, default), "vbr" (Variable Bitrate) or "cbr" (Constant Bitrate).',(0,i.jsx)("br",{}),"(Consider using ",(0,i.jsx)(t.strong,{children:"vpxenc's two-pass mode"})," if you really need to match a target bitrate.)"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"-level"}),(0,i.jsx)(t.td,{children:"Encoder level. Range is 1..6. Generally better not to set it."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"-socket"}),(0,i.jsx)(t.td,{children:'Index of the CPU socket to use. By default it\'s -1, which uses "all available processors".'})]})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,i.jsx)(t.p,{children:"SVT-VP9 only supports 8-bit yuv420p."}),"\n",(0,i.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(t.h3,{id:"standalone",children:"Standalone"}),"\n",(0,i.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce98a713.462c84fe.js b/assets/js/ce98a713.462c84fe.js deleted file mode 100644 index 911dc1390..000000000 --- a/assets/js/ce98a713.462c84fe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6168],{4705:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>a});var s=i(4848),r=i(8453);const t={title:"Denoise",sidebar_position:8},o="Denoise",l={id:"filtering/denoise",title:"Denoise",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/denoise.mdx",sourceDirName:"filtering",slug:"/filtering/denoise",permalink:"/docs/filtering/denoise",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/denoise.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"Denoise",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Stabilizing",permalink:"/docs/filtering/stabilizing"},next:{title:"Dehalo",permalink:"/docs/filtering/dehalo"}},d={},a=[{value:"Overview",id:"overview",level:2},{value:"hqdn3d",id:"hqdn3d",level:2},{value:"Usage",id:"usage",level:3},{value:"nlmeans",id:"nlmeans",level:2},{value:"Usage",id:"usage-1",level:3},{value:"Parameters",id:"parameters",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"denoise",children:"Denoise"})}),"\n",(0,s.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(n.p,{children:"Denoising involves removing random noise from the video. Such noise can result from film grain, signal interference or simply low light conditions. In any case, noise can greatly reduce compression efficiency especially if the video codec doesn't support film grain synthesis."}),"\n",(0,s.jsxs)(n.p,{children:["In ",(0,s.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," there are two filters available for denoising:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#nlmeans",children:"nlmeans"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"hqdn3d",children:"hqdn3d"}),"\n",(0,s.jsx)(n.p,{children:"hqdn3d is a fast, high quality 3d denoising filter which improves compressibility. Can be applied to images and videos."}),"\n",(0,s.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf hqdn3d output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"The default configuration should be fine for most use cases."}),"\n",(0,s.jsxs)(n.p,{children:["If you still see too much noise you can adjust the ",(0,s.jsx)(n.code,{children:"luma_spatial"})," parameter (other parameters are derived from it by default). Higher ",(0,s.jsx)(n.code,{children:"luma_spatial"})," value will result in stronger denoising. By default it is set to ",(0,s.jsx)(n.code,{children:"4"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf hqdn3d=8 output.mp4\n# which is the same as\nffmpeg -i input.mp4 -vf hqdn3d=8:6:12:9 output.mp4\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["Setting ",(0,s.jsx)(n.code,{children:"luma_spatial"})," to larger values could result in ghosting and ",(0,s.jsx)(n.a,{href:"/docs/introduction/video-artifacts#bandingcontouring",children:"banding"})," artifacts."]})}),"\n",(0,s.jsxs)(n.p,{children:["For description of all four parameters take a look ",(0,s.jsx)(n.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#hqdn3d-1",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"nlmeans",children:"nlmeans"}),"\n",(0,s.jsxs)(n.p,{children:["nlmeans uses Non-Local Means algorithm to do denoising. Each pixel is compared to similar pixels based on their surroundings (context). The size of such context is expressed as ",(0,s.jsx)(n.code,{children:"r"}),"x",(0,s.jsx)(n.code,{children:"r"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["The filter is rather slow and doesn't parallelize well. Only use it in cases the video contains a lot of noise or you need very high quality denoising. In all other cases ",(0,s.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})," will be more efficient."]}),"\n",(0,s.jsx)(n.h3,{id:"usage-1",children:"Usage"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mp4 -vf nlmeans output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"The default configuration should be fine for most use cases."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mp4 -vf nlmeans=s=3.0:r=31:p=15 output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"Stronger denoising with larger research and patch size. Might be useful for ultra high quality denoising in 4K+ resolutions but you might struggle to achieve even 0.1 fps."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mp4 -vf nlmeans=s=1.0:r=5:p=3 output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"Prioritize speed over quality."}),"\n",(0,s.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"s"})," - Denoising Strength where ",(0,s.jsx)(n.code,{children:"1.0"})," is the lightest and also the default and the strongest is ",(0,s.jsx)(n.code,{children:"30.0"})," although I wouldn't recommend going above ",(0,s.jsx)(n.code,{children:"10.0"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"r"})," - Research Size where ",(0,s.jsx)(n.code,{children:"15"})," is the default, it must be an odd number ranging from ",(0,s.jsx)(n.code,{children:"0"})," to ",(0,s.jsx)(n.code,{children:"99"}),". The higher the value, the slower denoising will be."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"p"})," - Research Size where ",(0,s.jsx)(n.code,{children:"7"})," is the default and, it must be an odd number ranging from ",(0,s.jsx)(n.code,{children:"0"})," to ",(0,s.jsx)(n.code,{children:"99"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["For description of all possible parameters take a look ",(0,s.jsx)(n.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#nlmeans-1",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h1,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})," may create visual artifacts like ghosting, ",(0,s.jsx)(n.a,{href:"/docs/introduction/video-artifacts#bandingcontouring",children:"banding"})," and ",(0,s.jsx)(n.a,{href:"/docs/introduction/video-artifacts#blocking",children:"blocking"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#nlmeans",children:"nlmeans"})," creates much less noticeable artifacts like cartoonish look but only for very noisy inputs"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const r={},t=s.createContext(r);function o(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce98a713.d6f37062.js b/assets/js/ce98a713.d6f37062.js new file mode 100644 index 000000000..daa0ca430 --- /dev/null +++ b/assets/js/ce98a713.d6f37062.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6168],{5489:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"filtering/denoise","title":"Denoise","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/filtering/denoise.mdx","sourceDirName":"filtering","slug":"/filtering/denoise","permalink":"/docs/filtering/denoise","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/denoise.mdx","tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"title":"Denoise","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"Stabilizing","permalink":"/docs/filtering/stabilizing"},"next":{"title":"Dehalo","permalink":"/docs/filtering/dehalo"}}');var r=i(4848),t=i(8453);const o={title:"Denoise",sidebar_position:8},l="Denoise",d={},a=[{value:"Overview",id:"overview",level:2},{value:"hqdn3d",id:"hqdn3d",level:2},{value:"Usage",id:"usage",level:3},{value:"nlmeans",id:"nlmeans",level:2},{value:"Usage",id:"usage-1",level:3},{value:"Parameters",id:"parameters",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"denoise",children:"Denoise"})}),"\n",(0,r.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,r.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,r.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,r.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(n.p,{children:"Denoising involves removing random noise from the video. Such noise can result from film grain, signal interference or simply low light conditions. In any case, noise can greatly reduce compression efficiency especially if the video codec doesn't support film grain synthesis."}),"\n",(0,r.jsxs)(n.p,{children:["In ",(0,r.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," there are two filters available for denoising:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#nlmeans",children:"nlmeans"})}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"hqdn3d",children:"hqdn3d"}),"\n",(0,r.jsx)(n.p,{children:"hqdn3d is a fast, high quality 3d denoising filter which improves compressibility. Can be applied to images and videos."}),"\n",(0,r.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf hqdn3d output.mp4\n"})}),"\n",(0,r.jsx)(n.p,{children:"The default configuration should be fine for most use cases."}),"\n",(0,r.jsxs)(n.p,{children:["If you still see too much noise you can adjust the ",(0,r.jsx)(n.code,{children:"luma_spatial"})," parameter (other parameters are derived from it by default). Higher ",(0,r.jsx)(n.code,{children:"luma_spatial"})," value will result in stronger denoising. By default it is set to ",(0,r.jsx)(n.code,{children:"4"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf hqdn3d=8 output.mp4\n# which is the same as\nffmpeg -i input.mp4 -vf hqdn3d=8:6:12:9 output.mp4\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsxs)(n.p,{children:["Setting ",(0,r.jsx)(n.code,{children:"luma_spatial"})," to larger values could result in ghosting and ",(0,r.jsx)(n.a,{href:"/docs/introduction/video-artifacts#bandingcontouring",children:"banding"})," artifacts."]})}),"\n",(0,r.jsxs)(n.p,{children:["For description of all four parameters take a look ",(0,r.jsx)(n.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#hqdn3d-1",children:"here"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"nlmeans",children:"nlmeans"}),"\n",(0,r.jsxs)(n.p,{children:["nlmeans uses Non-Local Means algorithm to do denoising. Each pixel is compared to similar pixels based on their surroundings (context). The size of such context is expressed as ",(0,r.jsx)(n.code,{children:"r"}),"x",(0,r.jsx)(n.code,{children:"r"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The filter is rather slow and doesn't parallelize well. Only use it in cases the video contains a lot of noise or you need very high quality denoising. In all other cases ",(0,r.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})," will be more efficient."]}),"\n",(0,r.jsx)(n.h3,{id:"usage-1",children:"Usage"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mp4 -vf nlmeans output.mp4\n"})}),"\n",(0,r.jsx)(n.p,{children:"The default configuration should be fine for most use cases."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mp4 -vf nlmeans=s=3.0:r=31:p=15 output.mp4\n"})}),"\n",(0,r.jsx)(n.p,{children:"Stronger denoising with larger research and patch size. Might be useful for ultra high quality denoising in 4K+ resolutions but you might struggle to achieve even 0.1 fps."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mp4 -vf nlmeans=s=1.0:r=5:p=3 output.mp4\n"})}),"\n",(0,r.jsx)(n.p,{children:"Prioritize speed over quality."}),"\n",(0,r.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"s"})," - Denoising Strength where ",(0,r.jsx)(n.code,{children:"1.0"})," is the lightest and also the default and the strongest is ",(0,r.jsx)(n.code,{children:"30.0"})," although I wouldn't recommend going above ",(0,r.jsx)(n.code,{children:"10.0"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"r"})," - Research Size where ",(0,r.jsx)(n.code,{children:"15"})," is the default, it must be an odd number ranging from ",(0,r.jsx)(n.code,{children:"0"})," to ",(0,r.jsx)(n.code,{children:"99"}),". The higher the value, the slower denoising will be."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"p"})," - Research Size where ",(0,r.jsx)(n.code,{children:"7"})," is the default and, it must be an odd number ranging from ",(0,r.jsx)(n.code,{children:"0"})," to ",(0,r.jsx)(n.code,{children:"99"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["For description of all possible parameters take a look ",(0,r.jsx)(n.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#nlmeans-1",children:"here"}),"."]}),"\n",(0,r.jsx)(n.h1,{id:"notes",children:"Notes"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})," may create visual artifacts like ghosting, ",(0,r.jsx)(n.a,{href:"/docs/introduction/video-artifacts#bandingcontouring",children:"banding"})," and ",(0,r.jsx)(n.a,{href:"/docs/introduction/video-artifacts#blocking",children:"blocking"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#nlmeans",children:"nlmeans"})," creates much less noticeable artifacts like cartoonish look but only for very noisy inputs"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const r={},t=s.createContext(r);function o(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cf7588c6.8e6af6c6.js b/assets/js/cf7588c6.8e6af6c6.js new file mode 100644 index 000000000..5ea5f604f --- /dev/null +++ b/assets/js/cf7588c6.8e6af6c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5971],{2494:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>d,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"encoders/x264","title":"x264","description":"x264 is a software library and command line application for encoding H.264 / AVC developed by VideoLAN, the people behind the ever-popular VLC Media Player and released under GNU GPL. It is written in C and Assembly with almost two decades worth of development and threading optimizations which makes it the fastest software video encoder available, which also happens to be extremely popular.","source":"@site/docs/encoders/x264.mdx","sourceDirName":"encoders","slug":"/encoders/x264","permalink":"/docs/encoders/x264","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x264.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"x264","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"QOI","permalink":"/docs/images/QOI"},"next":{"title":"x265","permalink":"/docs/encoders/x265"}}');var i=s(4848),r=s(8453);const d={title:"x264",sidebar_position:1},o="x264",l={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Recommendations",id:"recommendations",level:2},{value:"Preset",id:"preset",level:3},{value:"Threads",id:"threads",level:3},{value:"Open GOP",id:"open-gop",level:3},{value:"AQ Mode",id:"aq-mode",level:3},{value:"Reference Frames",id:"reference-frames",level:3},{value:"MB Tree",id:"mb-tree",level:3},{value:"Lossless Encoding",id:"lossless-encoding",level:3}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"x264",children:"x264"})}),"\n",(0,i.jsx)(t.p,{children:"x264 is a software library and command line application for encoding H.264 / AVC developed by VideoLAN, the people behind the ever-popular VLC Media Player and released under GNU GPL. It is written in C and Assembly with almost two decades worth of development and threading optimizations which makes it the fastest software video encoder available, which also happens to be extremely popular."}),"\n",(0,i.jsx)(t.p,{children:"x264 has great fine detail retention which makes it perfect for high fidelity content."}),"\n",(0,i.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,i.jsxs)(t.p,{children:["x264 is available in FFmpeg via ",(0,i.jsx)(t.code,{children:"libx264"}),", to check if you have it, run ",(0,i.jsx)(t.code,{children:"ffmpeg -h encoder=libx264"}),". You can input non-FFmpeg standard x264 parameters via ",(0,i.jsx)(t.code,{children:"-x264-params"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,i.jsx)(t.p,{children:"x264 supports the following color spaces:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Format"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,i.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV420P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,i.jsx)(t.td,{children:"8-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUVJ420P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,i.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV422P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,i.jsx)(t.td,{children:"8-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUVJ422P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,i.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV444P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,i.jsx)(t.td,{children:"8-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUVJ444P"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,i.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"NV12"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"Semi-planar"}),(0,i.jsx)(t.td,{children:"8-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"NV16"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"Semi-planar"}),(0,i.jsx)(t.td,{children:"8-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"NV21"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"Semi-planar"}),(0,i.jsx)(t.td,{children:"8-bit (reversed)"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"GRAY8"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"-"}),(0,i.jsx)(t.td,{children:"8-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV420P10LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,i.jsx)(t.td,{children:"10-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV422P10LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,i.jsx)(t.td,{children:"10-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"YUV444P10LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,i.jsx)(t.td,{children:"10-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"GBRP10LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"-"}),(0,i.jsx)(t.td,{children:"10-bit"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"GRAY10LE"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"-"}),(0,i.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Pre-built binary [Recommended]:"})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://code.videolan.org/videolan/x264",children:"https://code.videolan.org/videolan/x264"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Choose your operating system there, or you can try using your package manager."}),"\n",(0,i.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(t.p,{children:"x264 has been praised for its simple, no-fuss settings."}),"\n",(0,i.jsx)(t.p,{children:"Here are some examples:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",metastring:'title="Simple raw Y4M input with CRF 20 and raw 264 bitstream output"',children:"x264 --crf 20 -o output.264 input.y4m\n"})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",metastring:'title="Preset slow, CRF 20, Y4M input"',children:"x264 --preset slow --crf 20 -o output.264 input.y4m\n"})}),"\n",(0,i.jsxs)(t.p,{children:["These next couple of examples utilize ",(0,i.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," to pipe video into x264."]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.264\n"})}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",metastring:'title="FFmpeg piping, MKV output"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.mkv\n"})}),"\n",(0,i.jsx)(t.admonition,{title:"Output Containers",type:"note",children:(0,i.jsxs)(t.p,{children:["x264 can output ",(0,i.jsx)(t.code,{children:"264"}),", MKV, FLV (Flash Video), and MP4 (If compiled with GPAC or L-SMASH support). For more information about what containers are, see the ",(0,i.jsx)(t.a,{href:"/docs/introduction/terminology#container",children:'"Terminology" section on containers'}),"."]})}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsx)(t.p,{children:"x264 will use Haali Matroska Muxer for MKV outputs, which has seeking issues. It is recommended to remux back using FFmpeg or mkvmerge/MKVToolNix."})}),"\n",(0,i.jsx)(t.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,i.jsx)(t.p,{children:'As x264 is made to "just work", there aren\'t many advanced parameters to modify. The general guideline is to encode as slowly as you can tolerate.'}),"\n",(0,i.jsx)(t.h3,{id:"preset",children:"Preset"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.code,{children:"--preset veryslow"})}),"\n",(0,i.jsxs)(t.p,{children:["The most obvious way to increase fidelity per bit is to allow the encoder to spend more effort, and therefore time, encoding. This preset is decently slow, but preset ",(0,i.jsx)(t.code,{children:"placebo"})," is even slower."]}),"\n",(0,i.jsx)(t.h3,{id:"threads",children:"Threads"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.code,{children:"--threads X"})}),"\n",(0,i.jsx)(t.p,{children:"This is set to 1.5x the number of available cores by default, and shouldn't need to be adjusted unless you need to reduce the number of threads for some reason. x264's threading is very efficient, and in most cases, x264 should be able to completely saturate most consumer CPUs."}),"\n",(0,i.jsx)(t.h3,{id:"open-gop",children:"Open GOP"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.code,{children:"--open-gop"})}),"\n",(0,i.jsxs)(t.p,{children:["Enables Open GOP (Group of Pictures), where each GOP can ",(0,i.jsx)(t.a,{href:"https://ottverse.com/closed-gop-open-gop-idr/",children:"reference one another"}),", thus improving compression with little speed loss. For unknown reasons it is disabled by default in x264."]}),"\n",(0,i.jsx)(t.h3,{id:"aq-mode",children:"AQ Mode"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.code,{children:"--aq-mode 3"})}),"\n",(0,i.jsx)(t.p,{children:"In short, will make x264 bias to dark areas and spend more bitrate there, thus dark scenes will look less bad. Basically no speed loss."}),"\n",(0,i.jsx)(t.h3,{id:"reference-frames",children:"Reference Frames"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.code,{children:"--bframes 8 --ref 12"})}),"\n",(0,i.jsx)(t.p,{children:"These parameters are responsible for the amount of reference frames x264 will use for compression, the more the better. Maximum of 16, will definitely increase compute time the higher you go."}),"\n",(0,i.jsx)(t.h3,{id:"mb-tree",children:"MB Tree"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.code,{children:"--no-mbtree"})}),"\n",(0,i.jsx)(t.p,{children:"This option disables mb-tree rate control. mb-tree rate control is intended to redistribute bitrate to give more bits to frames that have less motion, and less bits to frames that have more motion (because artifacts in those frames will be less noticeable when the video is playing).\nHowever, many users claim this can have negative effects on video quality, especially when encoding videos that have significant amounts of grain."}),"\n",(0,i.jsx)(t.h3,{id:"lossless-encoding",children:"Lossless Encoding"}),"\n",(0,i.jsxs)(t.p,{children:["x264 can also encode lossless video, allowing it to compete with lossless video codecs like ",(0,i.jsx)(t.a,{href:"/docs/video/FFV1",children:"FFV1"})," and ",(0,i.jsx)(t.a,{href:"/docs/video/utvideo",children:"UT Video"}),". To encode lossless video, use ",(0,i.jsx)(t.code,{children:"--qp 0"}),". Slower presets will decrease the size even further while the video remains lossless.\nHowever, when space is not a concern, such as when encoding an intermediate lossless for later encoding to a lossy format, x264 can become the fastest lossless codec available, providing super fast encoding and decoding.\nFor the absolute fastest encoding and decoding, one can use both ",(0,i.jsx)(t.code,{children:"--preset ultrafast"})," and ",(0,i.jsx)(t.code,{children:"--tune fastdecode"}),". However, ",(0,i.jsx)(t.code,{children:"--preset superfast"})," still provides incredibly fast encoding and decoding speed, with 20-30% space savings for lossless compared to ",(0,i.jsx)(t.code,{children:"ultrafast"}),",\nso it may be the ideal choice for many users."]}),"\n",(0,i.jsx)(t.admonition,{title:"Why QP 0 instead of CRF 0?",type:"info",children:(0,i.jsxs)(t.p,{children:["CRF automatically adjusts a number of quantization parameters to achieve a desired quality output. QP stands for ",(0,i.jsx)(t.em,{children:"Quantization Parameter"}),", and allows full control over the resulting video quality. In this case, all-intra or lossless, using QP is necessary, but for lossy encoding CRF will produce better visual fidelity per bit."]})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>o});var n=s(6540);const i={},r=n.createContext(i);function d(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cf7588c6.f946bb2a.js b/assets/js/cf7588c6.f946bb2a.js deleted file mode 100644 index 7c121b43b..000000000 --- a/assets/js/cf7588c6.f946bb2a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5971],{2493:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>a});var n=s(4848),i=s(8453);const r={title:"x264",sidebar_position:1},d="x264",o={id:"encoders/x264",title:"x264",description:"x264 is a software library and command line application for encoding H.264 / AVC developed by VideoLAN, the people behind the ever-popular VLC Media Player and released under GNU GPL. It is written in C and Assembly with almost two decades worth of development and threading optimizations which makes it the fastest software video encoder available, which also happens to be extremely popular.",source:"@site/docs/encoders/x264.mdx",sourceDirName:"encoders",slug:"/encoders/x264",permalink:"/docs/encoders/x264",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x264.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"x264",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"QOI",permalink:"/docs/images/QOI"},next:{title:"x265",permalink:"/docs/encoders/x265"}},l={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Recommendations",id:"recommendations",level:2},{value:"Preset",id:"preset",level:3},{value:"Threads",id:"threads",level:3},{value:"Open GOP",id:"open-gop",level:3},{value:"AQ Mode",id:"aq-mode",level:3},{value:"Reference Frames",id:"reference-frames",level:3},{value:"MB Tree",id:"mb-tree",level:3},{value:"Lossless Encoding",id:"lossless-encoding",level:3}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"x264",children:"x264"})}),"\n",(0,n.jsx)(t.p,{children:"x264 is a software library and command line application for encoding H.264 / AVC developed by VideoLAN, the people behind the ever-popular VLC Media Player and released under GNU GPL. It is written in C and Assembly with almost two decades worth of development and threading optimizations which makes it the fastest software video encoder available, which also happens to be extremely popular."}),"\n",(0,n.jsx)(t.p,{children:"x264 has great fine detail retention which makes it perfect for high fidelity content."}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["x264 is available in FFmpeg via ",(0,n.jsx)(t.code,{children:"libx264"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=libx264"}),". You can input non-FFmpeg standard x264 parameters via ",(0,n.jsx)(t.code,{children:"-x264-params"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"x264 supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"NV12"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Semi-planar"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"NV16"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Semi-planar"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"NV21"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Semi-planar"}),(0,n.jsx)(t.td,{children:"8-bit (reversed)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"GRAY8"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"-"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"GBRP10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"-"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"GRAY10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"-"}),(0,n.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Pre-built binary [Recommended]:"})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://code.videolan.org/videolan/x264",children:"https://code.videolan.org/videolan/x264"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Choose your operating system there, or you can try using your package manager."}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"x264 has been praised for its simple, no-fuss settings."}),"\n",(0,n.jsx)(t.p,{children:"Here are some examples:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Simple raw Y4M input with CRF 20 and raw 264 bitstream output"',children:"x264 --crf 20 -o output.264 input.y4m\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Preset slow, CRF 20, Y4M input"',children:"x264 --preset slow --crf 20 -o output.264 input.y4m\n"})}),"\n",(0,n.jsxs)(t.p,{children:["These next couple of examples utilize ",(0,n.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," to pipe video into x264."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.264\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="FFmpeg piping, MKV output"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.mkv\n"})}),"\n",(0,n.jsx)(t.admonition,{title:"Output Containers",type:"note",children:(0,n.jsxs)(t.p,{children:["x264 can output ",(0,n.jsx)(t.code,{children:"264"}),", MKV, FLV (Flash Video), and MP4 (If compiled with GPAC or L-SMASH support). For more information about what containers are, see the ",(0,n.jsx)(t.a,{href:"/docs/introduction/terminology#container",children:'"Terminology" section on containers'}),"."]})}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsx)(t.p,{children:"x264 will use Haali Matroska Muxer for MKV outputs, which has seeking issues. It is recommended to remux back using FFmpeg or mkvmerge/MKVToolNix."})}),"\n",(0,n.jsx)(t.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,n.jsx)(t.p,{children:'As x264 is made to "just work", there aren\'t many advanced parameters to modify. The general guideline is to encode as slowly as you can tolerate.'}),"\n",(0,n.jsx)(t.h3,{id:"preset",children:"Preset"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"--preset veryslow"})}),"\n",(0,n.jsxs)(t.p,{children:["The most obvious way to increase fidelity per bit is to allow the encoder to spend more effort, and therefore time, encoding. This preset is decently slow, but preset ",(0,n.jsx)(t.code,{children:"placebo"})," is even slower."]}),"\n",(0,n.jsx)(t.h3,{id:"threads",children:"Threads"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"--threads X"})}),"\n",(0,n.jsx)(t.p,{children:"This is set to 1.5x the number of available cores by default, and shouldn't need to be adjusted unless you need to reduce the number of threads for some reason. x264's threading is very efficient, and in most cases, x264 should be able to completely saturate most consumer CPUs."}),"\n",(0,n.jsx)(t.h3,{id:"open-gop",children:"Open GOP"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"--open-gop"})}),"\n",(0,n.jsxs)(t.p,{children:["Enables Open GOP (Group of Pictures), where each GOP can ",(0,n.jsx)(t.a,{href:"https://ottverse.com/closed-gop-open-gop-idr/",children:"reference one another"}),", thus improving compression with little speed loss. For unknown reasons it is disabled by default in x264."]}),"\n",(0,n.jsx)(t.h3,{id:"aq-mode",children:"AQ Mode"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"--aq-mode 3"})}),"\n",(0,n.jsx)(t.p,{children:"In short, will make x264 bias to dark areas and spend more bitrate there, thus dark scenes will look less bad. Basically no speed loss."}),"\n",(0,n.jsx)(t.h3,{id:"reference-frames",children:"Reference Frames"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"--bframes 8 --ref 12"})}),"\n",(0,n.jsx)(t.p,{children:"These parameters are responsible for the amount of reference frames x264 will use for compression, the more the better. Maximum of 16, will definitely increase compute time the higher you go."}),"\n",(0,n.jsx)(t.h3,{id:"mb-tree",children:"MB Tree"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"--no-mbtree"})}),"\n",(0,n.jsx)(t.p,{children:"This option disables mb-tree rate control. mb-tree rate control is intended to redistribute bitrate to give more bits to frames that have less motion, and less bits to frames that have more motion (because artifacts in those frames will be less noticeable when the video is playing).\nHowever, many users claim this can have negative effects on video quality, especially when encoding videos that have significant amounts of grain."}),"\n",(0,n.jsx)(t.h3,{id:"lossless-encoding",children:"Lossless Encoding"}),"\n",(0,n.jsxs)(t.p,{children:["x264 can also encode lossless video, allowing it to compete with lossless video codecs like ",(0,n.jsx)(t.a,{href:"/docs/video/FFV1",children:"FFV1"})," and ",(0,n.jsx)(t.a,{href:"/docs/video/utvideo",children:"UT Video"}),". To encode lossless video, use ",(0,n.jsx)(t.code,{children:"--qp 0"}),". Slower presets will decrease the size even further while the video remains lossless.\nHowever, when space is not a concern, such as when encoding an intermediate lossless for later encoding to a lossy format, x264 can become the fastest lossless codec available, providing super fast encoding and decoding.\nFor the absolute fastest encoding and decoding, one can use both ",(0,n.jsx)(t.code,{children:"--preset ultrafast"})," and ",(0,n.jsx)(t.code,{children:"--tune fastdecode"}),". However, ",(0,n.jsx)(t.code,{children:"--preset superfast"})," still provides incredibly fast encoding and decoding speed, with 20-30% space savings for lossless compared to ",(0,n.jsx)(t.code,{children:"ultrafast"}),",\nso it may be the ideal choice for many users."]}),"\n",(0,n.jsx)(t.admonition,{title:"Why QP 0 instead of CRF 0?",type:"info",children:(0,n.jsxs)(t.p,{children:["CRF automatically adjusts a number of quantization parameters to achieve a desired quality output. QP stands for ",(0,n.jsx)(t.em,{children:"Quantization Parameter"}),", and allows full control over the resulting video quality. In this case, all-intra or lossless, using QP is necessary, but for lossy encoding CRF will produce better visual fidelity per bit."]})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>o});var n=s(6540);const i={},r=n.createContext(i);function d(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d1becb09.34b1a05b.js b/assets/js/d1becb09.34b1a05b.js deleted file mode 100644 index 1994b3cd4..000000000 --- a/assets/js/d1becb09.34b1a05b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8843],{5224:(i,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(4848),n=t(8453);const s={title:"Privacy Policy",sidebar_label:"\ud83d\udd0f Privacy Policy",position:15},r="Privacy Policy",a={id:"privacy-policy",title:"Privacy Policy",description:"This site is hosted on GitHub Pages, & usage of this site is subject to GitHub's Privacy Policy. GitHub may store information about your visit in the form of log files.",source:"@site/docs/privacy-policy.mdx",sourceDirName:".",slug:"/privacy-policy",permalink:"/docs/privacy-policy",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/privacy-policy.mdx",tags:[],version:"current",frontMatter:{title:"Privacy Policy",sidebar_label:"\ud83d\udd0f Privacy Policy",position:15},sidebar:"tutorialSidebar",previous:{title:"\u2753 FAQ",permalink:"/docs/FAQ"},next:{title:"\ud83e\udd1d Terms of Use",permalink:"/docs/terms-of-use"}},c={},l=[];function d(i){const e={a:"a",em:"em",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...i.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"privacy-policy",children:"Privacy Policy"})}),"\n",(0,o.jsxs)(e.p,{children:["This site is hosted on GitHub Pages, & usage of this site is subject to ",(0,o.jsx)(e.a,{href:"https://docs.github.com/en/site-policy/privacy-policies/github-privacy-statement",children:"GitHub's Privacy Policy"}),". GitHub may store information about your visit in the form of log files."]}),"\n",(0,o.jsxs)(e.p,{children:["Furthermore, this site uses a self-hosted instance of ",(0,o.jsx)(e.a,{href:"https://plausible.io",children:"Plausible Analytics"})," located in Singapore. Plausible Analytics is a lightweight and open source web analytics platform for website traffic analysis. We do not track, collect nor store any personally identifiable information; Plausible Analytics collects only aggregated information, which does not allow us to identify any visitor to our website."]}),"\n",(0,o.jsx)(e.p,{children:"This information is collected to understand how users interact with the Codec Wiki and improve our efforts to better suit the needs of these users."}),"\n",(0,o.jsx)(e.p,{children:"We do not employ the use of cookies. The following information is collected:"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"Page URL"}),"\n",(0,o.jsx)(e.li,{children:"HTTP Referer"}),"\n",(0,o.jsx)(e.li,{children:"Browser & Browser Version"}),"\n",(0,o.jsx)(e.li,{children:"Operating System type & version"}),"\n",(0,o.jsx)(e.li,{children:"Device type"}),"\n",(0,o.jsx)(e.li,{children:"Country, region, & city"}),"\n"]}),"\n",(0,o.jsx)(e.p,{children:"Given this information, we ensure:"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsxs)(e.li,{children:["Analytics data is not shared explicitly with advertising companies or any other companies in general. It is made available to everyone, for free, on our ",(0,o.jsx)(e.a,{href:"https://analytics.x266.mov/wiki.x266.mov/",children:"analytics page"})]}),"\n",(0,o.jsx)(e.li,{children:"Analytics data isn't explicitly sent to any third parties"}),"\n",(0,o.jsx)(e.li,{children:"Analytics data is not monetized"}),"\n"]}),"\n",(0,o.jsxs)(e.p,{children:["As a wiki dedicated to making multimedia codec knowledge more accessible, analytics information is made public via our ",(0,o.jsx)(e.a,{href:"https://analytics.x266.mov/wiki.x266.mov/",children:"analytics page"}),"."]}),"\n",(0,o.jsxs)(e.p,{children:["You may opt out with various means of ad & tracker blocking. An example would be ",(0,o.jsx)(e.a,{href:"https://ublockorigin.com/",children:"UBlock Origin"}),", which blocks our analytics script."]}),"\n",(0,o.jsxs)(e.p,{children:["If you have any questions, comments or concerns, you may reach out to site maintainer Gianni Rosato via ",(0,o.jsx)(e.a,{href:"mailto:grosatowork@proton.me",children:"grosatowork@proton.me"}),"."]}),"\n",(0,o.jsx)(e.p,{children:(0,o.jsx)(e.em,{children:"Last updated 12 September 2023"})})]})}function h(i={}){const{wrapper:e}={...(0,n.R)(),...i.components};return e?(0,o.jsx)(e,{...i,children:(0,o.jsx)(d,{...i})}):d(i)}},8453:(i,e,t)=>{t.d(e,{R:()=>r,x:()=>a});var o=t(6540);const n={},s=o.createContext(n);function r(i){const e=o.useContext(s);return o.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function a(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(n):i.components||n:r(i.components),o.createElement(s.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/assets/js/d1becb09.9b3996b0.js b/assets/js/d1becb09.9b3996b0.js new file mode 100644 index 000000000..1a062af7a --- /dev/null +++ b/assets/js/d1becb09.9b3996b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8843],{2864:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"privacy-policy","title":"Privacy Policy","description":"This site is hosted on GitHub Pages, & usage of this site is subject to GitHub\'s Privacy Policy. GitHub may store information about your visit in the form of log files.","source":"@site/docs/privacy-policy.mdx","sourceDirName":".","slug":"/privacy-policy","permalink":"/docs/privacy-policy","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/privacy-policy.mdx","tags":[],"version":"current","frontMatter":{"title":"Privacy Policy","sidebar_label":"\ud83d\udd0f Privacy Policy","position":15},"sidebar":"tutorialSidebar","previous":{"title":"\u2753 FAQ","permalink":"/docs/FAQ"},"next":{"title":"\ud83e\udd1d Terms of Use","permalink":"/docs/terms-of-use"}}');var n=t(4848),s=t(8453);const r={title:"Privacy Policy",sidebar_label:"\ud83d\udd0f Privacy Policy",position:15},a="Privacy Policy",c={},l=[];function d(e){const i={a:"a",em:"em",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"privacy-policy",children:"Privacy Policy"})}),"\n",(0,n.jsxs)(i.p,{children:["This site is hosted on GitHub Pages, & usage of this site is subject to ",(0,n.jsx)(i.a,{href:"https://docs.github.com/en/site-policy/privacy-policies/github-privacy-statement",children:"GitHub's Privacy Policy"}),". GitHub may store information about your visit in the form of log files."]}),"\n",(0,n.jsxs)(i.p,{children:["Furthermore, this site uses a self-hosted instance of ",(0,n.jsx)(i.a,{href:"https://plausible.io",children:"Plausible Analytics"})," located in Singapore. Plausible Analytics is a lightweight and open source web analytics platform for website traffic analysis. We do not track, collect nor store any personally identifiable information; Plausible Analytics collects only aggregated information, which does not allow us to identify any visitor to our website."]}),"\n",(0,n.jsx)(i.p,{children:"This information is collected to understand how users interact with the Codec Wiki and improve our efforts to better suit the needs of these users."}),"\n",(0,n.jsx)(i.p,{children:"We do not employ the use of cookies. The following information is collected:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Page URL"}),"\n",(0,n.jsx)(i.li,{children:"HTTP Referer"}),"\n",(0,n.jsx)(i.li,{children:"Browser & Browser Version"}),"\n",(0,n.jsx)(i.li,{children:"Operating System type & version"}),"\n",(0,n.jsx)(i.li,{children:"Device type"}),"\n",(0,n.jsx)(i.li,{children:"Country, region, & city"}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Given this information, we ensure:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Analytics data is not shared explicitly with advertising companies or any other companies in general. It is made available to everyone, for free, on our ",(0,n.jsx)(i.a,{href:"https://analytics.x266.mov/wiki.x266.mov/",children:"analytics page"})]}),"\n",(0,n.jsx)(i.li,{children:"Analytics data isn't explicitly sent to any third parties"}),"\n",(0,n.jsx)(i.li,{children:"Analytics data is not monetized"}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["As a wiki dedicated to making multimedia codec knowledge more accessible, analytics information is made public via our ",(0,n.jsx)(i.a,{href:"https://analytics.x266.mov/wiki.x266.mov/",children:"analytics page"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["You may opt out with various means of ad & tracker blocking. An example would be ",(0,n.jsx)(i.a,{href:"https://ublockorigin.com/",children:"UBlock Origin"}),", which blocks our analytics script."]}),"\n",(0,n.jsxs)(i.p,{children:["If you have any questions, comments or concerns, you may reach out to site maintainer Gianni Rosato via ",(0,n.jsx)(i.a,{href:"mailto:grosatowork@proton.me",children:"grosatowork@proton.me"}),"."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.em,{children:"Last updated 12 September 2023"})})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var o=t(6540);const n={},s=o.createContext(n);function r(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d337df6f.4e231f7b.js b/assets/js/d337df6f.4e231f7b.js new file mode 100644 index 000000000..fa123fdb1 --- /dev/null +++ b/assets/js/d337df6f.4e231f7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6496],{8051:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var i=n(1229),o=n(4848),r=n(8453);const a={title:"Codec Wiki: One Year Later",description:"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.",slug:"codec-wiki-one-year-later",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["anniversary","history"],hide_table_of_contents:!1},s=void 0,c={authorsImageUrls:[void 0]},u=[];function l(e){const t={p:"p",...(0,r.R)(),...e.components};return(0,o.jsx)(t.p,{children:"Around a month ago, Codec Wiki celebrates it's very first anniversary as it officially hits one year old (Wow, that's a very long time!)."})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var i=n(6540);const o={},r=i.createContext(o);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(r.Provider,{value:t},e.children)}},1229:e=>{e.exports=JSON.parse('{"permalink":"/blog/codec-wiki-one-year-later","source":"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx","title":"Codec Wiki: One Year Later","description":"Codec\'s Wiki turbulent one-year journey since it\'s inception to everyone\'s go-to site for encoding documentation.","date":"2024-07-20T00:00:00.000Z","tags":[{"inline":true,"label":"anniversary","permalink":"/blog/tags/anniversary"},{"inline":true,"label":"history","permalink":"/blog/tags/history"}],"readingTime":3.785,"hasTruncateMarker":true,"authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Codec Wiki: One Year Later","description":"Codec\'s Wiki turbulent one-year journey since it\'s inception to everyone\'s go-to site for encoding documentation.","slug":"codec-wiki-one-year-later","authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"}],"tags":["anniversary","history"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Better late than never: SVT-AV1 v2.2.x Deep Dive","permalink":"/blog/svt-av1-third-deep-dive"},"nextItem":{"title":"AV1 for Dummies","permalink":"/blog/av1-for-dummies"}}')}}]); \ No newline at end of file diff --git a/assets/js/d337df6f.b45bda30.js b/assets/js/d337df6f.b45bda30.js deleted file mode 100644 index 74fbe1535..000000000 --- a/assets/js/d337df6f.b45bda30.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6496],{8051:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>u});var i=n(4848),o=n(8453);const r={title:"Codec Wiki: One Year Later",description:"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.",slug:"codec-wiki-one-year-later",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["anniversary","history"],hide_table_of_contents:!1},a=void 0,s={permalink:"/blog/codec-wiki-one-year-later",source:"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx",title:"Codec Wiki: One Year Later",description:"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.",date:"2024-07-20T00:00:00.000Z",tags:[{inline:!0,label:"anniversary",permalink:"/blog/tags/anniversary"},{inline:!0,label:"history",permalink:"/blog/tags/history"}],readingTime:3.785,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4",key:null,page:null}],frontMatter:{title:"Codec Wiki: One Year Later",description:"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.",slug:"codec-wiki-one-year-later",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["anniversary","history"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"AV1 for Dummies",permalink:"/blog/av1-for-dummies"}},c={authorsImageUrls:[void 0]},u=[];function l(e){const t={p:"p",...(0,o.R)(),...e.components};return(0,i.jsx)(t.p,{children:"Around a month ago, Codec Wiki celebrates it's very first anniversary as it officially hits one year old (Wow, that's a very long time!)."})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var i=n(6540);const o={},r=i.createContext(o);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5ab79da.1faa483d.js b/assets/js/d5ab79da.1faa483d.js new file mode 100644 index 000000000..802481dfd --- /dev/null +++ b/assets/js/d5ab79da.1faa483d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8382],{9060:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"audio/MP3","title":"MP3","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/audio/MP3.mdx","sourceDirName":"audio","slug":"/audio/MP3","permalink":"/docs/audio/MP3","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/MP3.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"MP3","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Dolby Digital","permalink":"/docs/audio/Dolby"},"next":{"title":"Vorbis","permalink":"/docs/audio/Vorbis"}}');var n=t(4848),s=t(8453);const a={title:"MP3",sidebar_position:4},r="MP3",d={},c=[];function l(e){const o={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"mp3",children:"MP3"})}),"\n",(0,n.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsx)(o.p,{children:"MP3, formally known as MPEG-1 Audio Layer III or MPEG-2 Audio Layer III, is a coding format for digital audio. It was developed largely by the Fraunhofer Society in Germany under the lead of Karlheinz Brandenburg, with support from other digital scientists in other countries."}),"\n",(0,n.jsx)(o.p,{children:"MP3 is defined in two ISO/IEC specification families: MPEG-1: 11172-3 and MPEG-2: 13818-32. It uses lossy compression, which often allows for large reductions in file size compared to uncompressed audio."}),"\n",(0,n.jsxs)(o.p,{children:["Lossy MP3 compression works by attempting to reduce (or approximate) the accuracy of certain components of sound that could be considered (by some ",(0,n.jsx)(o.a,{href:"/docs/introduction/terminology#perceputal--psychovisual--psychoacoustic",children:"psychoacoustic"})," analysis) to be beyond the hearing capabilities of most humans and storing the coefficients corresponding to these more salient frequency bands."]}),"\n",(0,n.jsx)(o.p,{children:"Compared to CD-quality digital audio, MP3 compression can commonly achieve a 75 to 95% reduction in size. For example, an MP3 encoded at a constant bit rate of 128 kbit/s would result in a file approximately 9% of the size of the original CD audio. MP3 audio is considered transparent at 320kb/s."}),"\n",(0,n.jsxs)(o.p,{children:["It is still very common to see MP3 files in the wild today, despite the fact that the format was finalized in 1993 (with modifications in 1995 to support lower sample rates and bit rates). This is due to the fact that MP3 could be considered the first widely adopted audio format that allowed for high quality audio to be compressed to a relatively small file size. Compared to more modern formats like ",(0,n.jsx)(o.a,{href:"/docs/audio/Opus",children:"Opus"})," and ",(0,n.jsx)(o.a,{href:"/docs/audio/AAC",children:"AAC"}),", MP3 may not seem as impressive, but it is still widely supported by many devices and pieces software and has certainly left a powerful legacy to live up to for modern codecs."]})]})}function u(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>a,x:()=>r});var i=t(6540);const n={},s=i.createContext(n);function a(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5ab79da.7a6ccdeb.js b/assets/js/d5ab79da.7a6ccdeb.js deleted file mode 100644 index 823b277c6..000000000 --- a/assets/js/d5ab79da.7a6ccdeb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8382],{2082:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var t=i(4848),n=i(8453);const s={title:"MP3",sidebar_position:4},a="MP3",r={id:"audio/MP3",title:"MP3",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/MP3.mdx",sourceDirName:"audio",slug:"/audio/MP3",permalink:"/docs/audio/MP3",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/MP3.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"MP3",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Dolby Digital",permalink:"/docs/audio/Dolby"},next:{title:"Vorbis",permalink:"/docs/audio/Vorbis"}},d={},c=[];function l(e){const o={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"mp3",children:"MP3"})}),"\n",(0,t.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsx)(o.p,{children:"MP3, formally known as MPEG-1 Audio Layer III or MPEG-2 Audio Layer III, is a coding format for digital audio. It was developed largely by the Fraunhofer Society in Germany under the lead of Karlheinz Brandenburg, with support from other digital scientists in other countries."}),"\n",(0,t.jsx)(o.p,{children:"MP3 is defined in two ISO/IEC specification families: MPEG-1: 11172-3 and MPEG-2: 13818-32. It uses lossy compression, which often allows for large reductions in file size compared to uncompressed audio."}),"\n",(0,t.jsxs)(o.p,{children:["Lossy MP3 compression works by attempting to reduce (or approximate) the accuracy of certain components of sound that could be considered (by some ",(0,t.jsx)(o.a,{href:"/docs/introduction/terminology#perceputal--psychovisual--psychoacoustic",children:"psychoacoustic"})," analysis) to be beyond the hearing capabilities of most humans and storing the coefficients corresponding to these more salient frequency bands."]}),"\n",(0,t.jsx)(o.p,{children:"Compared to CD-quality digital audio, MP3 compression can commonly achieve a 75 to 95% reduction in size. For example, an MP3 encoded at a constant bit rate of 128 kbit/s would result in a file approximately 9% of the size of the original CD audio. MP3 audio is considered transparent at 320kb/s."}),"\n",(0,t.jsxs)(o.p,{children:["It is still very common to see MP3 files in the wild today, despite the fact that the format was finalized in 1993 (with modifications in 1995 to support lower sample rates and bit rates). This is due to the fact that MP3 could be considered the first widely adopted audio format that allowed for high quality audio to be compressed to a relatively small file size. Compared to more modern formats like ",(0,t.jsx)(o.a,{href:"/docs/audio/Opus",children:"Opus"})," and ",(0,t.jsx)(o.a,{href:"/docs/audio/AAC",children:"AAC"}),", MP3 may not seem as impressive, but it is still widely supported by many devices and pieces software and has certainly left a powerful legacy to live up to for modern codecs."]})]})}function u(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,o,i)=>{i.d(o,{R:()=>a,x:()=>r});var t=i(6540);const n={},s=t.createContext(n);function a(e){const o=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5f89569.2c8d20a5.js b/assets/js/d5f89569.2c8d20a5.js new file mode 100644 index 000000000..37fa72f62 --- /dev/null +++ b/assets/js/d5f89569.2c8d20a5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1401],{5250:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"encoders/Kvazaar","title":"Kvazaar","description":"Kvazaar is an open-source H.265 / HEVC software encoder Written in C, developed by Ultra Video Group and licensed under BSD 3-clause.","source":"@site/docs/encoders/Kvazaar.mdx","sourceDirName":"encoders","slug":"/encoders/Kvazaar","permalink":"/docs/encoders/Kvazaar","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/Kvazaar.mdx","tags":[],"version":"current","sidebarPosition":11,"frontMatter":{"title":"Kvazaar","sidebar_position":11},"sidebar":"tutorialSidebar","previous":{"title":"SVT-HEVC","permalink":"/docs/encoders/SVT-HEVC"},"next":{"title":"VVenC","permalink":"/docs/encoders/VVenC"}}');var n=t(4848),s=t(8453),i=t(1470),o=t(9365);const l={title:"Kvazaar",sidebar_position:11},c="Kvazaar",d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Autotools",id:"autotools",level:3},{value:"CMake (10-bit support)",id:"cmake-10-bit-support",level:3},{value:"MSYS2",id:"msys2",level:3},{value:"Usage",id:"usage",level:2}];function h(e){const a={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"kvazaar",children:"Kvazaar"})}),"\n",(0,n.jsxs)(a.p,{children:[(0,n.jsx)(a.a,{href:"https://github.com/ultravideo/kvazaar",children:"Kvazaar"})," is an open-source ",(0,n.jsx)(a.a,{href:"/docs/video/HEVC",children:"H.265 / HEVC"})," software encoder Written in C, developed by ",(0,n.jsx)(a.a,{href:"https://ultravideo.fi/",children:"Ultra Video Group"})," and licensed under BSD 3-clause."]}),"\n",(0,n.jsxs)(a.p,{children:[(0,n.jsx)(a.a,{href:"/docs/encoders/uvg266",children:"uvg266"})," (Developed by the same group) uses Kvazaar as a base for encoding to the ",(0,n.jsx)(a.a,{href:"/docs/video/VVC",children:"VVC"})," codec."]}),"\n",(0,n.jsxs)(a.p,{children:[(0,n.jsx)(a.a,{href:"/docs/encoders/x265",children:"x265"})," is generally regarded as having better performance while producing better quality video streams."]}),"\n",(0,n.jsx)(a.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(a.p,{children:["Kvazaar is available in ",(0,n.jsx)(a.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," via ",(0,n.jsx)(a.code,{children:"libkvazaar"}),", to check if you have it, run ",(0,n.jsx)(a.code,{children:"ffmpeg -h encoder=libkvazaar"}),". You can input non-FFmpeg standard Kvazaar parameters via ",(0,n.jsx)(a.code,{children:"-kvazaar-params"}),"."]}),"\n",(0,n.jsx)(a.p,{children:'You may need to download "Full" builds. As most of the time, this encoder is not included.'}),"\n",(0,n.jsx)(a.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(a.p,{children:"Kvazaar supports the following color spaces:"}),"\n",(0,n.jsxs)(a.table,{children:[(0,n.jsx)(a.thead,{children:(0,n.jsxs)(a.tr,{children:[(0,n.jsx)(a.th,{children:"Format"}),(0,n.jsx)(a.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(a.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(a.tbody,{children:[(0,n.jsxs)(a.tr,{children:[(0,n.jsx)(a.td,{children:"YUV420P"}),(0,n.jsx)(a.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(a.td,{children:"8-bit"})]}),(0,n.jsxs)(a.tr,{children:[(0,n.jsx)(a.td,{children:"YUV420P10LE"}),(0,n.jsx)(a.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(a.td,{children:"10-bit*"})]})]})]}),"\n",(0,n.jsx)(a.p,{children:"*10-bit support requires a flag to be set during compilation with CMake."}),"\n",(0,n.jsx)(a.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(i.A,{children:[(0,n.jsxs)(o.A,{value:"unixlike",label:"Linux & macOS",default:!0,children:[(0,n.jsxs)(a.p,{children:["For Arch Linux, Kvazaar is available as ",(0,n.jsx)(a.code,{children:"kvazaar"}),". It is also available in the Arch User Repository (AUR) as ",(0,n.jsx)(a.code,{children:"kvazaar-git"}),"."]}),(0,n.jsxs)(a.p,{children:["Ultra Video Group does not ship any pre-built binaries of their encoders except for their ",(0,n.jsx)(a.a,{href:"https://ci.appveyor.com/project/Ultravideo/kvazaar",children:"AppVeyor CI"}),", but AppVeyor deletes build artifacts after a month, so most of the time you'll have to compile Kvazaar yourself. Here are the instructions to do so:"]}),(0,n.jsx)(a.h3,{id:"autotools",children:"Autotools"}),(0,n.jsxs)(a.ol,{start:"0",children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Compilation requires GNU Automake, Autoconf, Libtool, and M4. Install them via your package manager."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Clone the repository and its submodules:"}),"\n"]}),"\n"]}),(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"git clone --recursive https://github.com/ultravideo/kvazaar.git\ncd kvazaar\n./autogen.sh\n./configure\nmake -j$(nproc)\n"})}),(0,n.jsxs)(a.ol,{start:"3",children:["\n",(0,n.jsxs)(a.li,{children:["Binaries will be available in ",(0,n.jsx)(a.code,{children:"src"}),", or you can run ",(0,n.jsx)(a.code,{children:"make install"})," on Linux to install (May need elevated permissions)."]}),"\n"]}),(0,n.jsx)(a.h3,{id:"cmake-10-bit-support",children:"CMake (10-bit support)"}),(0,n.jsx)(a.p,{children:"You will need to use CMake to specify a flag to be able to encode 10-bit with the encoder; by default Kvazaar ships with only 8-bit."}),(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:'git clone --recursive https://github.com/ultravideo/kvazaar.git\ncd kvazaar/build\ncmake .. -DCMAKE_C_FLAGS="-DKVZ_BIT_DEPTH=10" # optional 10-bit flag\nmake -j$(nproc)\n'})}),(0,n.jsx)(a.p,{children:"Be aware that encoding 10-bit HEVC with Kvazaar is significantly slower, as the developers only prioritized SIMD optimizations for 8-bit encoding. Be aware that this implementation can be buggy in general."})]}),(0,n.jsxs)(o.A,{value:"wind",label:"Windows",children:[(0,n.jsxs)(a.p,{children:["Windows users are recommended to compile via MinGW-W64 which comes with ",(0,n.jsx)(a.a,{href:"https://msys2.org/",children:"MSYS2"}),". Please be advised ",(0,n.jsx)(a.strong,{children:"the usage of Clang for compiling in this situation is heavily recommended"}),"\ndue to disabled AVX2 optimizations because of a known GCC issue from 2012 (MinGW environments-exclusive). To do this, run ",(0,n.jsx)(a.code,{children:"CC=clang ./configure"})," during autoconf."]}),(0,n.jsx)(a.h3,{id:"msys2",children:"MSYS2"}),(0,n.jsxs)(a.ol,{start:"0",children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,n.jsx)(a.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Start the UCRT64 console & install the required dependencies with the ",(0,n.jsx)(a.code,{children:"pacman"})," package manager"]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:'Resume the build process as you would on a Unix-like system. See the "Linux & macOS" tab for more information.'}),"\n"]}),"\n"]})]})]}),"\n",(0,n.jsx)(a.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(a.p,{children:"Here are some examples of how to use Kvazaar on its own:"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",metastring:'title="Simple Y4M input with QP 20 and raw 265 bitstream output"',children:"kvazaar -i input.y4m --input-file-format y4m --qp 20 -o output.265\n"})}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",metastring:'title="Preset slow, CRF 20, Y4M input"',children:"kvazaar -i input.y4m --input-file-format y4m --qp 20 --preset slow -o output.265\n"})}),"\n",(0,n.jsxs)(a.p,{children:["The command below still uses the ",(0,n.jsx)(a.code,{children:"kvazaar"})," binary, but reads from a YUV4MPEG pipe instead of a file. This is useful for piping FFmpeg output to Kvazaar."]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | kvazaar -i - --input-file-format y4m --qp 20 --preset slow -o output.265\n"})})]})}function p(e={}){const{wrapper:a}={...(0,s.R)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},9365:(e,a,t)=>{t.d(a,{A:()=>i});t(6540);var r=t(4164);const n={tabItem:"tabItem_Ymn6"};var s=t(4848);function i(e){let{children:a,hidden:t,className:i}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(n.tabItem,i),hidden:t,children:a})}},1470:(e,a,t)=>{t.d(a,{A:()=>w});var r=t(6540),n=t(4164),s=t(3104),i=t(6347),o=t(205),l=t(7485),c=t(1682),d=t(679);function u(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:a,children:t}=e;return(0,r.useMemo)((()=>{const e=a??function(e){return u(e).map((e=>{let{props:{value:a,label:t,attributes:r,default:n}}=e;return{value:a,label:t,attributes:r,default:n}}))}(t);return function(e){const a=(0,c.XI)(e,((e,a)=>e.value===a.value));if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[a,t])}function p(e){let{value:a,tabValues:t}=e;return t.some((e=>e.value===a))}function m(e){let{queryString:a=!1,groupId:t}=e;const n=(0,i.W6)(),s=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,l.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const a=new URLSearchParams(n.location.search);a.set(s,e),n.replace({...n.location,search:a.toString()})}),[s,n])]}function f(e){const{defaultValue:a,queryString:t=!1,groupId:n}=e,s=h(e),[i,l]=(0,r.useState)((()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!p({value:a,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:a,tabValues:s}))),[c,u]=m({queryString:t,groupId:n}),[f,v]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[n,s]=(0,d.Dv)(t);return[n,(0,r.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:n}),b=(()=>{const e=c??f;return p({value:e,tabValues:s})?e:null})();(0,o.A)((()=>{b&&l(b)}),[b]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),v(e)}),[u,v,s]),tabValues:s}}var v=t(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(4848);function g(e){let{className:a,block:t,selectedValue:r,selectValue:i,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const a=e.currentTarget,t=l.indexOf(a),n=o[t].value;n!==r&&(c(a),i(n))},u=e=>{let a=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;a=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;a=l[t]??l[l.length-1];break}}a?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,n.A)("tabs",{"tabs--block":t},a),children:o.map((e=>{let{value:a,label:t,attributes:s}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===a?0:-1,"aria-selected":r===a,ref:e=>l.push(e),onKeyDown:u,onClick:d,...s,className:(0,n.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":r===a}),children:t??a},a)}))})}function j(e){let{lazy:a,children:t,selectedValue:s}=e;const i=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=i.find((e=>e.props.value===s));return e?(0,r.cloneElement)(e,{className:(0,n.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:i.map(((e,a)=>(0,r.cloneElement)(e,{key:a,hidden:e.props.value!==s})))})}function y(e){const a=f(e);return(0,x.jsxs)("div",{className:(0,n.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...a,...e}),(0,x.jsx)(j,{...a,...e})]})}function w(e){const a=(0,v.A)();return(0,x.jsx)(y,{...e,children:u(e.children)},String(a))}},8453:(e,a,t)=>{t.d(a,{R:()=>i,x:()=>o});var r=t(6540);const n={},s=r.createContext(n);function i(e){const a=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(s.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5f89569.f9fcd397.js b/assets/js/d5f89569.f9fcd397.js deleted file mode 100644 index e37e106a2..000000000 --- a/assets/js/d5f89569.f9fcd397.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1401],{7235:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var r=a(4848),n=a(8453),s=a(1470),i=a(9365);const o={title:"Kvazaar",sidebar_position:11},l="Kvazaar",c={id:"encoders/Kvazaar",title:"Kvazaar",description:"Kvazaar is an open-source H.265 / HEVC software encoder Written in C, developed by Ultra Video Group and licensed under BSD 3-clause.",source:"@site/docs/encoders/Kvazaar.mdx",sourceDirName:"encoders",slug:"/encoders/Kvazaar",permalink:"/docs/encoders/Kvazaar",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/Kvazaar.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"Kvazaar",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC"},next:{title:"VVenC",permalink:"/docs/encoders/VVenC"}},d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Autotools",id:"autotools",level:3},{value:"CMake (10-bit support)",id:"cmake-10-bit-support",level:3},{value:"MSYS2",id:"msys2",level:3},{value:"Usage",id:"usage",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"kvazaar",children:"Kvazaar"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://github.com/ultravideo/kvazaar",children:"Kvazaar"})," is an open-source ",(0,r.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265 / HEVC"})," software encoder Written in C, developed by ",(0,r.jsx)(t.a,{href:"https://ultravideo.fi/",children:"Ultra Video Group"})," and licensed under BSD 3-clause."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"/docs/encoders/uvg266",children:"uvg266"})," (Developed by the same group) uses Kvazaar as a base for encoding to the ",(0,r.jsx)(t.a,{href:"/docs/video/VVC",children:"VVC"})," codec."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"/docs/encoders/x265",children:"x265"})," is generally regarded as having better performance while producing better quality video streams."]}),"\n",(0,r.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,r.jsxs)(t.p,{children:["Kvazaar is available in ",(0,r.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," via ",(0,r.jsx)(t.code,{children:"libkvazaar"}),", to check if you have it, run ",(0,r.jsx)(t.code,{children:"ffmpeg -h encoder=libkvazaar"}),". You can input non-FFmpeg standard Kvazaar parameters via ",(0,r.jsx)(t.code,{children:"-kvazaar-params"}),"."]}),"\n",(0,r.jsx)(t.p,{children:'You may need to download "Full" builds. As most of the time, this encoder is not included.'}),"\n",(0,r.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,r.jsx)(t.p,{children:"Kvazaar supports the following color spaces:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Format"}),(0,r.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,r.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"YUV420P"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,r.jsx)(t.td,{children:"8-bit"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"YUV420P10LE"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,r.jsx)(t.td,{children:"10-bit*"})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"*10-bit support requires a flag to be set during compilation with CMake."}),"\n",(0,r.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsxs)(i.A,{value:"unixlike",label:"Linux & macOS",default:!0,children:[(0,r.jsxs)(t.p,{children:["For Arch Linux, Kvazaar is available as ",(0,r.jsx)(t.code,{children:"kvazaar"}),". It is also available in the Arch User Repository (AUR) as ",(0,r.jsx)(t.code,{children:"kvazaar-git"}),"."]}),(0,r.jsxs)(t.p,{children:["Ultra Video Group does not ship any pre-built binaries of their encoders except for their ",(0,r.jsx)(t.a,{href:"https://ci.appveyor.com/project/Ultravideo/kvazaar",children:"AppVeyor CI"}),", but AppVeyor deletes build artifacts after a month, so most of the time you'll have to compile Kvazaar yourself. Here are the instructions to do so:"]}),(0,r.jsx)(t.h3,{id:"autotools",children:"Autotools"}),(0,r.jsxs)(t.ol,{start:"0",children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"Compilation requires GNU Automake, Autoconf, Libtool, and M4. Install them via your package manager."}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"Clone the repository and its submodules:"}),"\n"]}),"\n"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"git clone --recursive https://github.com/ultravideo/kvazaar.git\ncd kvazaar\n./autogen.sh\n./configure\nmake -j$(nproc)\n"})}),(0,r.jsxs)(t.ol,{start:"3",children:["\n",(0,r.jsxs)(t.li,{children:["Binaries will be available in ",(0,r.jsx)(t.code,{children:"src"}),", or you can run ",(0,r.jsx)(t.code,{children:"make install"})," on Linux to install (May need elevated permissions)."]}),"\n"]}),(0,r.jsx)(t.h3,{id:"cmake-10-bit-support",children:"CMake (10-bit support)"}),(0,r.jsx)(t.p,{children:"You will need to use CMake to specify a flag to be able to encode 10-bit with the encoder; by default Kvazaar ships with only 8-bit."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:'git clone --recursive https://github.com/ultravideo/kvazaar.git\ncd kvazaar/build\ncmake .. -DCMAKE_C_FLAGS="-DKVZ_BIT_DEPTH=10" # optional 10-bit flag\nmake -j$(nproc)\n'})}),(0,r.jsx)(t.p,{children:"Be aware that encoding 10-bit HEVC with Kvazaar is significantly slower, as the developers only prioritized SIMD optimizations for 8-bit encoding. Be aware that this implementation can be buggy in general."})]}),(0,r.jsxs)(i.A,{value:"wind",label:"Windows",children:[(0,r.jsxs)(t.p,{children:["Windows users are recommended to compile via MinGW-W64 which comes with ",(0,r.jsx)(t.a,{href:"https://msys2.org/",children:"MSYS2"}),". Please be advised ",(0,r.jsx)(t.strong,{children:"the usage of Clang for compiling in this situation is heavily recommended"}),"\ndue to disabled AVX2 optimizations because of a known GCC issue from 2012 (MinGW environments-exclusive). To do this, run ",(0,r.jsx)(t.code,{children:"CC=clang ./configure"})," during autoconf."]}),(0,r.jsx)(t.h3,{id:"msys2",children:"MSYS2"}),(0,r.jsxs)(t.ol,{start:"0",children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,r.jsx)(t.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Start the UCRT64 console & install the required dependencies with the ",(0,r.jsx)(t.code,{children:"pacman"})," package manager"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:'Resume the build process as you would on a Unix-like system. See the "Linux & macOS" tab for more information.'}),"\n"]}),"\n"]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(t.p,{children:"Here are some examples of how to use Kvazaar on its own:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Simple Y4M input with QP 20 and raw 265 bitstream output"',children:"kvazaar -i input.y4m --input-file-format y4m --qp 20 -o output.265\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Preset slow, CRF 20, Y4M input"',children:"kvazaar -i input.y4m --input-file-format y4m --qp 20 --preset slow -o output.265\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The command below still uses the ",(0,r.jsx)(t.code,{children:"kvazaar"})," binary, but reads from a YUV4MPEG pipe instead of a file. This is useful for piping FFmpeg output to Kvazaar."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | kvazaar -i - --input-file-format y4m --qp 20 --preset slow -o output.265\n"})})]})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var r=a(4164);const n={tabItem:"tabItem_Ymn6"};var s=a(4848);function i(e){let{children:t,hidden:a,className:i}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(n.tabItem,i),hidden:a,children:t})}},1470:(e,t,a)=>{a.d(t,{A:()=>w});var r=a(6540),n=a(4164),s=a(3104),i=a(6347),o=a(205),l=a(7485),c=a(1682),d=a(679);function u(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:a}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:a,attributes:r,default:n}}=e;return{value:t,label:a,attributes:r,default:n}}))}(a);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function p(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.W6)(),s=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,l.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(n.location.search);t.set(s,e),n.replace({...n.location,search:t.toString()})}),[s,n])]}function v(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,s=h(e),[i,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:s}))),[c,u]=m({queryString:a,groupId:n}),[v,b]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,s]=(0,d.Dv)(a);return[n,(0,r.useCallback)((e=>{a&&s.set(e)}),[a,s])]}({groupId:n}),f=(()=>{const e=c??v;return p({value:e,tabValues:s})?e:null})();(0,o.A)((()=>{f&&l(f)}),[f]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),b(e)}),[u,b,s]),tabValues:s}}var b=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=a(4848);function g(e){let{className:t,block:a,selectedValue:r,selectValue:i,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const t=e.currentTarget,a=l.indexOf(t),n=o[a].value;n!==r&&(c(t),i(n))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const a=l.indexOf(e.currentTarget)+1;t=l[a]??l[0];break}case"ArrowLeft":{const a=l.indexOf(e.currentTarget)-1;t=l[a]??l[l.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,n.A)("tabs",{"tabs--block":a},t),children:o.map((e=>{let{value:t,label:a,attributes:s}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>l.push(e),onKeyDown:u,onClick:d,...s,className:(0,n.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":r===t}),children:a??t},t)}))})}function j(e){let{lazy:t,children:a,selectedValue:s}=e;const i=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=i.find((e=>e.props.value===s));return e?(0,r.cloneElement)(e,{className:(0,n.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:i.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=v(e);return(0,x.jsxs)("div",{className:(0,n.A)("tabs-container",f.tabList),children:[(0,x.jsx)(g,{...t,...e}),(0,x.jsx)(j,{...t,...e})]})}function w(e){const t=(0,b.A)();return(0,x.jsx)(y,{...e,children:u(e.children)},String(t))}},8453:(e,t,a)=>{a.d(t,{R:()=>i,x:()=>o});var r=a(6540);const n={},s=r.createContext(n);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d6535278.94e0b22c.js b/assets/js/d6535278.94e0b22c.js deleted file mode 100644 index dd11d42d0..000000000 --- a/assets/js/d6535278.94e0b22c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6977],{9963:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>h});var i=n(4848),s=n(8453),r=n(1470),a=n(9365);const o={title:"VMAF",sidebar_position:1},l="VMAF",c={id:"metrics/VMAF",title:"VMAF",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/VMAF.mdx",sourceDirName:"metrics",slug:"/metrics/VMAF",permalink:"/docs/metrics/VMAF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/VMAF.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"VMAF",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2"},next:{title:"XPSNR",permalink:"/docs/metrics/XPSNR"}},d={},h=[{value:"Installation",id:"installation",level:2},{value:"Using VMAF with FFmpeg",id:"using-vmaf-with-ffmpeg",level:2},{value:"Note about the model path on Windows",id:"note-about-the-model-path-on-windows",level:3},{value:"Scoring",id:"scoring",level:2},{value:"Some weaknesses",id:"some-weaknesses",level:2},{value:"Comparing to SSIMULACRA2",id:"comparing-to-ssimulacra2",level:3}];function u(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"vmaf",children:"VMAF"})}),"\n",(0,i.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsx)(t.p,{children:"Short for Video Multimethod Assessment Fusion, VMAF is a full reference video quality assessment algorithm developed primarily by Netflix."}),"\n",(0,i.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(t.p,{children:["Vmaf comes as a part of ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf",children:"libvmaf"}),". There are two ways it is commonly used:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["As an ",(0,i.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," filter"]}),"\n",(0,i.jsx)(t.li,{children:"As a standalone binary"}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["The instructions below are written for Linux & macOS. On Windows, you can use the ",(0,i.jsx)(t.a,{href:"https://docs.microsoft.com/en-us/windows/wsl/install",children:"Windows Subsystem for Linux"})," to follow along."]}),"\n",(0,i.jsxs)(r.A,{children:[(0,i.jsxs)(a.A,{value:"bin",label:"Standalone Binary",children:[(0,i.jsx)(t.p,{children:"In order to build from source, follow the instructions below."}),(0,i.jsxs)(t.ol,{start:"0",children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Install the required dependencies via your package manager of choice. The necessary dependencies are ",(0,i.jsx)(t.code,{children:"nasm"}),", ",(0,i.jsx)(t.code,{children:"ninja-build"}),", ",(0,i.jsx)(t.code,{children:"doxygen"}),", & ",(0,i.jsx)(t.code,{children:"xxd"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Clone the repository & enter the corresponding directory"}),"\n"]}),"\n"]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",metastring:'title="Clone & Enter"',children:"git clone https://github.com/Netflix/vmaf/\ncd vmaf/\n"})}),(0,i.jsxs)(t.ol,{start:"2",children:["\n",(0,i.jsxs)(t.li,{children:["Compile with ",(0,i.jsx)(t.code,{children:"meson"})," & ",(0,i.jsx)(t.code,{children:"ninja"})]}),"\n"]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"meson setup libvmaf libvmaf/build --buildtype release -Denable_float=true\nsudo ninja -vC libvmaf/build install\n"})}),(0,i.jsx)(t.p,{children:"Now, you can run the VMAF binary with the following command:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"vmaf --help\n"})}),(0,i.jsxs)(t.p,{children:["If you would not like to build from source, you may grab the latest build from the VMAF ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/releases",children:"GitHub releases"})," for your operating system."]}),(0,i.jsx)(t.p,{children:"Now, you can:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"/path/to/vmaf --reference refrence.y4m --distorted distorted.y4m\n"})}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Tip:"})," If the VMAF binary exists but is not market as executable, you might need to ",(0,i.jsx)(t.code,{children:"chmod +x /path/to/vmaf"})]}),(0,i.jsxs)(t.p,{children:["Explainer on command line flags can be found ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/blob/master/libvmaf/tools/README.md",children:"here"})]}),(0,i.jsx)(t.p,{children:"The disadvantage of using the bin is that you need .yuv|y4m files, you can that overcome by using named pipes\nSimple example using ffmpeg as a decoder:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"# create the pipes\nmkfifo ref.pipe\nmkfido dist.pipe\n\n# run these each in a new terminal, order docent matter\nffmpeg -v error -i ref.mkv -strict -1 -f yuv4mpegpipe - > ref.pipe\nffmpeg -v error -i dist.mkv -strict -1 -f yuv4mpegpipe - > dist.pipe\n\n# after starting the two ffmpeg processes,\n# start the vmaf in a new terminal\n/path/to/vmaf --reference ref.pipe --distorted dist.pipe\n\n# delete the pipes after usage\nrm ref.pipe dist.pipe\n"})}),(0,i.jsx)(t.p,{children:"The Advantages of this are:"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["No need for a ffmpeg build with ",(0,i.jsx)(t.code,{children:"--enable-libvmaf"})]}),"\n",(0,i.jsxs)(t.li,{children:["Clear & simple usage of VMAF's various options, like ",(0,i.jsx)(t.code,{children:"--aom_ctc"})]}),"\n"]}),(0,i.jsx)(t.p,{children:"Disadvantages are:"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Difficult/awkward to use without a wrapper script"}),"\n"]})]}),(0,i.jsxs)(a.A,{value:"ffmpegfilter",label:"FFmpeg Filter",children:[(0,i.jsxs)(t.p,{children:["If you are not sure if you have VMAF installed, you can check by running ",(0,i.jsx)(t.code,{children:"ffmpeg -help"})," and looking for whether or not the ",(0,i.jsx)(t.code,{children:"--enable-libvmaf"})," flag appears in the banner that is printed to the terminal. If you do not see this, you will need to build ffmpeg from source with the ",(0,i.jsx)(t.code,{children:"--enable-libvmaf"})," flag or grab a pre-compiled build of FFmpeg with the flag enabled."]}),(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.em,{children:["Via the ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/blob/master/resource/doc/ffmpeg.md",children:"VMAF github repo"}),":"]})}),(0,i.jsx)(t.h2,{id:"using-vmaf-with-ffmpeg",children:"Using VMAF with FFmpeg"}),(0,i.jsxs)(t.p,{children:["After installing ",(0,i.jsx)(t.code,{children:"libvmaf"}),", you can use it with ",(0,i.jsx)(t.a,{href:"http://ffmpeg.org/",children:"FFmpeg"}),". Under the FFmpeg directory, configure, build and install FFmpeg with:"]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:"./configure --enable-libvmaf\nmake -j4\nmake install\n"})}),(0,i.jsxs)(t.p,{children:["Using FFmpeg+libvmaf is very powerful, as you can create complex filters to calculate VMAF directly on videos of different encoding formats and resolutions. For the best practices of computing VMAF at the right resolution, refer to our ",(0,i.jsx)(t.a,{href:"https://medium.com/netflix-techblog/vmaf-the-journey-continues-44b51ee9ed12",children:"tech blog"}),"."]}),(0,i.jsxs)(t.p,{children:["We provide a few examples how you can construct the FFmpeg command line and use VMAF as a filter. Note that you may need to download the test videos from ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/tree/master/python/test/resource",children:"vmaf_resource"}),"."]}),(0,i.jsxs)(t.p,{children:["Below is an example on how you can run FFmpeg+libvmaf on a pair of YUV files. First, download the reference video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/yuv/src01_hrc00_576x324.yuv",children:(0,i.jsx)(t.code,{children:"src01_hrc00_576x324.yuv"})})," and the distorted video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/yuv/src01_hrc01_576x324.yuv",children:(0,i.jsx)(t.code,{children:"src01_hrc01_576x324.yuv"})}),". ",(0,i.jsx)(t.code,{children:"-r 24"})," sets the frame rate (note that it needs to be before ",(0,i.jsx)(t.code,{children:"-i"}),"), and ",(0,i.jsx)(t.code,{children:"PTS-STARTPTS"})," synchronizes the PTS (presentation timestamp) of the two videos (this is crucial if one of your videos does not start at PTS 0, for example, if you cut your video out of a long video stream). It is important to set the frame rate and the PTS right, since FFmpeg filters synchronize based on timestamps instead of frames."]}),(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.code,{children:"log_path"})," is set to standard output ",(0,i.jsx)(t.code,{children:"/dev/stdout"}),". It uses the ",(0,i.jsx)(t.code,{children:"model_path"})," at location ",(0,i.jsx)(t.code,{children:"/usr/local/share/model/vmaf_float_v0.6.1.json"})," (which is the default and can be omitted)."]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:'ffmpeg -video_size 576x324 -r 24 -pixel_format yuv420p -i src01_hrc00_576x324.yuv \\\n -video_size 576x324 -r 24 -pixel_format yuv420p -i src01_hrc01_576x324.yuv \\\n -lavfi "[0:v]setpts=PTS-STARTPTS[reference]; \\\n [1:v]setpts=PTS-STARTPTS[distorted]; \\\n [distorted][reference]libvmaf=log_fmt=xml:log_path=/dev/stdout:model_path={your_vmaf_dir}/model/vmaf_v0.6.1.json:n_threads=4" \\\n -f null -\n'})}),(0,i.jsx)(t.p,{children:"The expected output is:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:"[libvmaf @ 0x7fcfa3403980] VMAF score: 76.668905\n"})}),(0,i.jsxs)(t.p,{children:["Below is a more complicated example where the inputs are packaged ",(0,i.jsx)(t.code,{children:".mp4"})," files. It takes in 1) a reference video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/mp4/Seeking_30_480_1050.mp4",children:(0,i.jsx)(t.code,{children:"Seeking_30_480_1050.mp4"})})," of 480p and 2) a distorted video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/mp4/Seeking_10_288_375.mp4",children:(0,i.jsx)(t.code,{children:"Seeking_10_288_375.mp4"})})," of 288p upsampled to ",(0,i.jsx)(t.code,{children:"720x480"})," using bicubic, and compute VMAF on the two 480p videos. Bicubic is used as the recommended upsampling method (also see the ",(0,i.jsx)(t.a,{href:"https://medium.com/netflix-techblog/vmaf-the-journey-continues-44b51ee9ed12",children:"techblog"})," for more details)."]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:'ffmpeg \\\n -r 24 -i Seeking_30_480_1050.mp4 \\\n -r 24 -i Seeking_10_288_375.mp4 \\\n -lavfi "[0:v]setpts=PTS-STARTPTS[reference]; \\\n [1:v]scale=720:480:flags=bicubic,setpts=PTS-STARTPTS[distorted]; \\\n [distorted][reference]libvmaf=log_fmt=xml:log_path=/dev/stdout:model_path={your_vmaf_dir}/model/vmaf_v0.6.1.json:n_threads=4" \\\n -f null -\n'})}),(0,i.jsx)(t.p,{children:"The expected output is:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:"[libvmaf @ 0x7fb5b672bc00] VMAF score: 51.017497\n"})}),(0,i.jsxs)(t.p,{children:["See the ",(0,i.jsx)(t.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#libvmaf",children:"FFmpeg's guide to libvmaf"}),", the ",(0,i.jsx)(t.a,{href:"https://trac.ffmpeg.org/wiki/FilteringGuide",children:"FFmpeg Filtering Guide"})," for more examples of complex filters, and the ",(0,i.jsx)(t.a,{href:"https://trac.ffmpeg.org/wiki/Scaling",children:"Scaling Guide"})," for information about scaling and using different scaling algorithms."]}),(0,i.jsx)(t.h3,{id:"note-about-the-model-path-on-windows",children:"Note about the model path on Windows"}),(0,i.jsxs)(t.p,{children:["Due to Windows not having a good default for where to pull the VMAF model from, you will always need to specify ",(0,i.jsx)(t.code,{children:"model_path"})," when calling libvmaf through ",(0,i.jsx)(t.code,{children:"ffmpeg"}),". However, you will need to be careful about the path you pass to ",(0,i.jsx)(t.code,{children:"model_path"}),"."]}),(0,i.jsxs)(t.p,{children:["If you are using a relative path for your ",(0,i.jsx)(t.code,{children:"model_path"}),", you can completely ignore this whole section, else if you are trying to use an absolute Windows path (",(0,i.jsx)(t.code,{children:"D:\\mypath\\vmaf_v0.6.1.json"}),") for your ",(0,i.jsx)(t.code,{children:"model_path"})," argument, you will need to be careful so ",(0,i.jsx)(t.code,{children:"ffmpeg"})," passes the right path to ",(0,i.jsx)(t.code,{children:"libvmaf"}),"."]}),(0,i.jsxs)(t.p,{children:["The final command line will depend on what shell you are running ",(0,i.jsx)(t.code,{children:"ffmpeg"})," through, so you will need to go through the following steps to make sure your path is okay."]}),(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Convert all of the backslashes ",(0,i.jsx)(t.code,{children:"\\"})," to forward slashes ",(0,i.jsx)(t.code,{children:"/"})," (",(0,i.jsx)(t.code,{children:"D:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Escape the colon ",(0,i.jsx)(t.code,{children:":"})," character by using a backslash ",(0,i.jsx)(t.code,{children:"\\"})," (",(0,i.jsx)(t.code,{children:"D\\:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Then escape that backslash with another backslash (",(0,i.jsx)(t.code,{children:"D\\\\:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["The next step will depend on the shell that will run ",(0,i.jsx)(t.code,{children:"ffmpeg"}),":"]}),"\n",(0,i.jsxs)(t.p,{children:["For PowerShell and Command Prompt, this will be enough and your final ",(0,i.jsx)(t.code,{children:"ffmpeg"})," command line will look something like"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-powershell",children:'./ffmpeg.exe -i dist.y4m -i ref.y4m \\\n -lavfi libvmaf=model_path="D\\\\:/mypath/vmaf_v0.6.1.json" \\\n -f null -\n'})}),"\n",(0,i.jsx)(t.admonition,{title:"Quoting the path",type:"info",children:(0,i.jsxs)(t.p,{children:["Note: I only quoted the path part for trivial reasons and in this specific case, it can be unquoted or you can quote the whole part after lavfi starting from ",(0,i.jsx)(t.code,{children:"libvmaf"})," to ",(0,i.jsx)(t.code,{children:"json"})," and it should give the same result due to neither shell treating the ",(0,i.jsx)(t.code,{children:"\\"})," as a special character"]})}),"\n",(0,i.jsxs)(t.p,{children:["For bash or specifically msys2 bash, it has some additional considerations. The first thing to know is that bash treats the backslash character ",(0,i.jsx)(t.code,{children:"\\"})," a bit special in that it's an escape character normally when not put inside single quotes. The second thing to know is that msys2's bash attempts convert a posix-like path (",(0,i.jsx)(t.code,{children:"/mingw64/share/model/vmaf_v0.6.1.json"}),") to a Windows mixed path (",(0,i.jsx)(t.code,{children:"D:/msys2/mingw64/share/model/vmaf_v0.6.1.json"}),") when passing arguments to a program. Normally, this would be fine, however, in our case, this works against us since we cannot allow it to convert the path to a normal path with an un-escaped colon. For this, we will need to not only escape the escaped backslash, but we will also need to pass the ",(0,i.jsx)(t.code,{children:"MSYS2_ARG_CONV_EXCL"})," environment variable with the value of ",(0,i.jsx)(t.code,{children:"*"})," to make sure it doesn't apply that special conversion on any of the arguments"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'MSYS2_ARG_CONV_EXCL="*" \\\n ./ffmpeg.exe -i dist.y4m -i ref.y4m -lavfi \\\n libvmaf=model_path="D\\\\\\:/mypath/vmaf_v0.6.1.json" -f null -\n'})}),"\n",(0,i.jsx)(t.admonition,{title:"Quotes",type:"info",children:(0,i.jsx)(t.p,{children:"Note: in this case, the quotes are not as trivial as the PowerShell/cmd version, as removing the quotes entirely will require you to re-escape the backslash resulting in 4 total backslashes, but quoting the whole argument will be fine."})}),"\n",(0,i.jsxs)(t.admonition,{title:"Single Quotes",type:"note",children:[(0,i.jsx)(t.p,{children:"Second Note: if you use single quotes around the path, it will be fine as well and the final command line would look like"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"MSYS2_ARG_CONV_EXCL=\"*\" \\\n ./ffmpeg.exe -i dist.y4m -i ref.y4m -lavfi \\\n libvmaf=model_path='D\\\\:/mypath/vmaf_v0.6.1.json' -f null -\n"})}),(0,i.jsx)(t.p,{children:"with only a double backslash instead of a triple."})]}),"\n"]}),"\n"]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,i.jsxs)(t.p,{children:["scores range from 0 to 100, and are best interpreted in a linear way,\n100 meaning perfect quality, 0 meaning not recognisable,\nmore info ",(0,i.jsx)(t.a,{href:"https://netflixtechblog.com/vmaf-the-journey-continues-44b51ee9ed12",children:"in the Best Practices section here"}),"\nIt aligns with mean opinion scores (MOS) really well at low/medium bitrates,\nas stated ",(0,i.jsx)(t.a,{href:"https://videoprocessing.ai/benchmarks/video-quality-metrics_both.html",children:"in this benchmark"})]}),"\n",(0,i.jsx)(t.h2,{id:"some-weaknesses",children:"Some weaknesses"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Newer codecs like AV1 and VVC introduce new kinds of artifacting that v0.6.2\n(current model as of Jan 2024) doesn't recognise,\nthat's why its performance might degrade, for example, high motion scenes being affected badly"}),"\n",(0,i.jsx)(t.li,{children:'It\'s bad at "transparent" levels of quality, kinds of quality that the average viewer might not notice'}),"\n",(0,i.jsx)(t.li,{children:"Synthetic grain throws off scores, this issue is not isolated to vmaf, but it should be noted regardless"}),"\n"]}),"\n",(0,i.jsx)(t.admonition,{title:"With ffmpeg you can disable application of synthetic grain",type:"tip",children:(0,i.jsxs)(t.p,{children:["place ",(0,i.jsx)(t.code,{children:"-filmgrain 0"})," before ",(0,i.jsx)(t.code,{children:"-i"})," in the above ffmpeg commands, limited to decoding with dav1d\nTODO: replace this tip with an export_side_data solution"]})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"As of January 2024, it doesn't work on HDR content, nothing prevents you from feeding it un-tonemapped PQ but scores will be off"}),"\n",(0,i.jsx)(t.li,{children:"In contrast with SSIMULACRA2, it focuses on appeal, not necessarily on fidelity. They often align, but not always."}),"\n",(0,i.jsx)(t.li,{children:"Due to the ML nature, comparing the same video to itself will not always result in a score of 100"}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"comparing-to-ssimulacra2",children:"Comparing to SSIMULACRA2"}),"\n",(0,i.jsx)(t.p,{children:"One big advantage over SSIMULACRA2 is the inclusion of some temporal information.\nThis means that VMAF weights frames that have a lot of motion higher.\nMeanwhile, SSIMULACRA2 based solutions compare each frame to the reference frame individually, since it is an image\nmetric at heart.\nVMAF also wins in speed and general ease of use."}),"\n",(0,i.jsx)(t.h1,{id:"additional-resources",children:"Additional resources"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/tree/master/resource/doc",children:"VMAF Documentation on GitHub"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://netflixtechblog.com/vmaf-the-journey-continues-44b51ee9ed12",children:"Medium Article by Netflix"})}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var i=n(4164);const s={tabItem:"tabItem_Ymn6"};var r=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,i.A)(s.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var i=n(6540),s=n(4164),r=n(3104),a=n(6347),o=n(205),l=n(7485),c=n(1682),d=n(679);function h(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:t,children:n}=e;return(0,i.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:n,attributes:i,default:s}}=e;return{value:t,label:n,attributes:i,default:s}}))}(n);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const s=(0,a.W6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(r),(0,i.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(s.location.search);t.set(r,e),s.replace({...s.location,search:t.toString()})}),[r,s])]}function p(e){const{defaultValue:t,queryString:n=!1,groupId:s}=e,r=u(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const i=n.find((e=>e.default))??n[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:t,tabValues:r}))),[c,h]=f({queryString:n,groupId:s}),[p,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,r]=(0,d.Dv)(n);return[s,(0,i.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:s}),x=(()=>{const e=c??p;return m({value:e,tabValues:r})?e:null})();(0,o.A)((()=>{x&&l(x)}),[x]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),g(e)}),[h,g,r]),tabValues:r}}var g=n(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(4848);function j(e){let{className:t,block:n,selectedValue:i,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const t=e.currentTarget,n=l.indexOf(t),s=o[n].value;s!==i&&(c(t),a(s))},h=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",x.tabItem,r?.className,{"tabs__item--active":i===t}),children:n??t},t)}))})}function v(e){let{lazy:t,children:n,selectedValue:r}=e;const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===r));return e?(0,i.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,i.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function y(e){const t=p(e);return(0,b.jsxs)("div",{className:(0,s.A)("tabs-container",x.tabList),children:[(0,b.jsx)(j,{...t,...e}),(0,b.jsx)(v,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,b.jsx)(y,{...e,children:h(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var i=n(6540);const s={},r=i.createContext(s);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d6535278.e9ffe8cd.js b/assets/js/d6535278.e9ffe8cd.js new file mode 100644 index 000000000..22ea49198 --- /dev/null +++ b/assets/js/d6535278.e9ffe8cd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6977],{4841:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"metrics/VMAF","title":"VMAF","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/metrics/VMAF.mdx","sourceDirName":"metrics","slug":"/metrics/VMAF","permalink":"/docs/metrics/VMAF","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/VMAF.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"VMAF","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"SSIMULACRA2","permalink":"/docs/metrics/SSIMULACRA2"},"next":{"title":"XPSNR","permalink":"/docs/metrics/XPSNR"}}');var s=n(4848),r=n(8453),a=n(1470),o=n(9365);const l={title:"VMAF",sidebar_position:1},c="VMAF",d={},h=[{value:"Installation",id:"installation",level:2},{value:"Using VMAF with FFmpeg",id:"using-vmaf-with-ffmpeg",level:2},{value:"Note about the model path on Windows",id:"note-about-the-model-path-on-windows",level:3},{value:"Scoring",id:"scoring",level:2},{value:"Some weaknesses",id:"some-weaknesses",level:2},{value:"Comparing to SSIMULACRA2",id:"comparing-to-ssimulacra2",level:3}];function u(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"vmaf",children:"VMAF"})}),"\n",(0,s.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsx)(t.p,{children:"Short for Video Multimethod Assessment Fusion, VMAF is a full reference video quality assessment algorithm developed primarily by Netflix."}),"\n",(0,s.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(t.p,{children:["Vmaf comes as a part of ",(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf",children:"libvmaf"}),". There are two ways it is commonly used:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["As an ",(0,s.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," filter"]}),"\n",(0,s.jsx)(t.li,{children:"As a standalone binary"}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["The instructions below are written for Linux & macOS. On Windows, you can use the ",(0,s.jsx)(t.a,{href:"https://docs.microsoft.com/en-us/windows/wsl/install",children:"Windows Subsystem for Linux"})," to follow along."]}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsxs)(o.A,{value:"bin",label:"Standalone Binary",children:[(0,s.jsx)(t.p,{children:"In order to build from source, follow the instructions below."}),(0,s.jsxs)(t.ol,{start:"0",children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Install the required dependencies via your package manager of choice. The necessary dependencies are ",(0,s.jsx)(t.code,{children:"nasm"}),", ",(0,s.jsx)(t.code,{children:"ninja-build"}),", ",(0,s.jsx)(t.code,{children:"doxygen"}),", & ",(0,s.jsx)(t.code,{children:"xxd"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Clone the repository & enter the corresponding directory"}),"\n"]}),"\n"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",metastring:'title="Clone & Enter"',children:"git clone https://github.com/Netflix/vmaf/\ncd vmaf/\n"})}),(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsxs)(t.li,{children:["Compile with ",(0,s.jsx)(t.code,{children:"meson"})," & ",(0,s.jsx)(t.code,{children:"ninja"})]}),"\n"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"meson setup libvmaf libvmaf/build --buildtype release -Denable_float=true\nsudo ninja -vC libvmaf/build install\n"})}),(0,s.jsx)(t.p,{children:"Now, you can run the VMAF binary with the following command:"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"vmaf --help\n"})}),(0,s.jsxs)(t.p,{children:["If you would not like to build from source, you may grab the latest build from the VMAF ",(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/releases",children:"GitHub releases"})," for your operating system."]}),(0,s.jsx)(t.p,{children:"Now, you can:"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"/path/to/vmaf --reference refrence.y4m --distorted distorted.y4m\n"})}),(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Tip:"})," If the VMAF binary exists but is not market as executable, you might need to ",(0,s.jsx)(t.code,{children:"chmod +x /path/to/vmaf"})]}),(0,s.jsxs)(t.p,{children:["Explainer on command line flags can be found ",(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/blob/master/libvmaf/tools/README.md",children:"here"})]}),(0,s.jsx)(t.p,{children:"The disadvantage of using the bin is that you need .yuv|y4m files, you can that overcome by using named pipes\nSimple example using ffmpeg as a decoder:"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"# create the pipes\nmkfifo ref.pipe\nmkfido dist.pipe\n\n# run these each in a new terminal, order docent matter\nffmpeg -v error -i ref.mkv -strict -1 -f yuv4mpegpipe - > ref.pipe\nffmpeg -v error -i dist.mkv -strict -1 -f yuv4mpegpipe - > dist.pipe\n\n# after starting the two ffmpeg processes,\n# start the vmaf in a new terminal\n/path/to/vmaf --reference ref.pipe --distorted dist.pipe\n\n# delete the pipes after usage\nrm ref.pipe dist.pipe\n"})}),(0,s.jsx)(t.p,{children:"The Advantages of this are:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["No need for a ffmpeg build with ",(0,s.jsx)(t.code,{children:"--enable-libvmaf"})]}),"\n",(0,s.jsxs)(t.li,{children:["Clear & simple usage of VMAF's various options, like ",(0,s.jsx)(t.code,{children:"--aom_ctc"})]}),"\n"]}),(0,s.jsx)(t.p,{children:"Disadvantages are:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Difficult/awkward to use without a wrapper script"}),"\n"]})]}),(0,s.jsxs)(o.A,{value:"ffmpegfilter",label:"FFmpeg Filter",children:[(0,s.jsxs)(t.p,{children:["If you are not sure if you have VMAF installed, you can check by running ",(0,s.jsx)(t.code,{children:"ffmpeg -help"})," and looking for whether or not the ",(0,s.jsx)(t.code,{children:"--enable-libvmaf"})," flag appears in the banner that is printed to the terminal. If you do not see this, you will need to build ffmpeg from source with the ",(0,s.jsx)(t.code,{children:"--enable-libvmaf"})," flag or grab a pre-compiled build of FFmpeg with the flag enabled."]}),(0,s.jsx)(t.p,{children:(0,s.jsxs)(t.em,{children:["Via the ",(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/blob/master/resource/doc/ffmpeg.md",children:"VMAF github repo"}),":"]})}),(0,s.jsx)(t.h2,{id:"using-vmaf-with-ffmpeg",children:"Using VMAF with FFmpeg"}),(0,s.jsxs)(t.p,{children:["After installing ",(0,s.jsx)(t.code,{children:"libvmaf"}),", you can use it with ",(0,s.jsx)(t.a,{href:"http://ffmpeg.org/",children:"FFmpeg"}),". Under the FFmpeg directory, configure, build and install FFmpeg with:"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",metastring:"script",children:"./configure --enable-libvmaf\nmake -j4\nmake install\n"})}),(0,s.jsxs)(t.p,{children:["Using FFmpeg+libvmaf is very powerful, as you can create complex filters to calculate VMAF directly on videos of different encoding formats and resolutions. For the best practices of computing VMAF at the right resolution, refer to our ",(0,s.jsx)(t.a,{href:"https://medium.com/netflix-techblog/vmaf-the-journey-continues-44b51ee9ed12",children:"tech blog"}),"."]}),(0,s.jsxs)(t.p,{children:["We provide a few examples how you can construct the FFmpeg command line and use VMAF as a filter. Note that you may need to download the test videos from ",(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/tree/master/python/test/resource",children:"vmaf_resource"}),"."]}),(0,s.jsxs)(t.p,{children:["Below is an example on how you can run FFmpeg+libvmaf on a pair of YUV files. First, download the reference video ",(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/yuv/src01_hrc00_576x324.yuv",children:(0,s.jsx)(t.code,{children:"src01_hrc00_576x324.yuv"})})," and the distorted video ",(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/yuv/src01_hrc01_576x324.yuv",children:(0,s.jsx)(t.code,{children:"src01_hrc01_576x324.yuv"})}),". ",(0,s.jsx)(t.code,{children:"-r 24"})," sets the frame rate (note that it needs to be before ",(0,s.jsx)(t.code,{children:"-i"}),"), and ",(0,s.jsx)(t.code,{children:"PTS-STARTPTS"})," synchronizes the PTS (presentation timestamp) of the two videos (this is crucial if one of your videos does not start at PTS 0, for example, if you cut your video out of a long video stream). It is important to set the frame rate and the PTS right, since FFmpeg filters synchronize based on timestamps instead of frames."]}),(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"log_path"})," is set to standard output ",(0,s.jsx)(t.code,{children:"/dev/stdout"}),". It uses the ",(0,s.jsx)(t.code,{children:"model_path"})," at location ",(0,s.jsx)(t.code,{children:"/usr/local/share/model/vmaf_float_v0.6.1.json"})," (which is the default and can be omitted)."]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",metastring:"script",children:'ffmpeg -video_size 576x324 -r 24 -pixel_format yuv420p -i src01_hrc00_576x324.yuv \\\n -video_size 576x324 -r 24 -pixel_format yuv420p -i src01_hrc01_576x324.yuv \\\n -lavfi "[0:v]setpts=PTS-STARTPTS[reference]; \\\n [1:v]setpts=PTS-STARTPTS[distorted]; \\\n [distorted][reference]libvmaf=log_fmt=xml:log_path=/dev/stdout:model_path={your_vmaf_dir}/model/vmaf_v0.6.1.json:n_threads=4" \\\n -f null -\n'})}),(0,s.jsx)(t.p,{children:"The expected output is:"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",metastring:"script",children:"[libvmaf @ 0x7fcfa3403980] VMAF score: 76.668905\n"})}),(0,s.jsxs)(t.p,{children:["Below is a more complicated example where the inputs are packaged ",(0,s.jsx)(t.code,{children:".mp4"})," files. It takes in 1) a reference video ",(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/mp4/Seeking_30_480_1050.mp4",children:(0,s.jsx)(t.code,{children:"Seeking_30_480_1050.mp4"})})," of 480p and 2) a distorted video ",(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/mp4/Seeking_10_288_375.mp4",children:(0,s.jsx)(t.code,{children:"Seeking_10_288_375.mp4"})})," of 288p upsampled to ",(0,s.jsx)(t.code,{children:"720x480"})," using bicubic, and compute VMAF on the two 480p videos. Bicubic is used as the recommended upsampling method (also see the ",(0,s.jsx)(t.a,{href:"https://medium.com/netflix-techblog/vmaf-the-journey-continues-44b51ee9ed12",children:"techblog"})," for more details)."]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",metastring:"script",children:'ffmpeg \\\n -r 24 -i Seeking_30_480_1050.mp4 \\\n -r 24 -i Seeking_10_288_375.mp4 \\\n -lavfi "[0:v]setpts=PTS-STARTPTS[reference]; \\\n [1:v]scale=720:480:flags=bicubic,setpts=PTS-STARTPTS[distorted]; \\\n [distorted][reference]libvmaf=log_fmt=xml:log_path=/dev/stdout:model_path={your_vmaf_dir}/model/vmaf_v0.6.1.json:n_threads=4" \\\n -f null -\n'})}),(0,s.jsx)(t.p,{children:"The expected output is:"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",metastring:"script",children:"[libvmaf @ 0x7fb5b672bc00] VMAF score: 51.017497\n"})}),(0,s.jsxs)(t.p,{children:["See the ",(0,s.jsx)(t.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#libvmaf",children:"FFmpeg's guide to libvmaf"}),", the ",(0,s.jsx)(t.a,{href:"https://trac.ffmpeg.org/wiki/FilteringGuide",children:"FFmpeg Filtering Guide"})," for more examples of complex filters, and the ",(0,s.jsx)(t.a,{href:"https://trac.ffmpeg.org/wiki/Scaling",children:"Scaling Guide"})," for information about scaling and using different scaling algorithms."]}),(0,s.jsx)(t.h3,{id:"note-about-the-model-path-on-windows",children:"Note about the model path on Windows"}),(0,s.jsxs)(t.p,{children:["Due to Windows not having a good default for where to pull the VMAF model from, you will always need to specify ",(0,s.jsx)(t.code,{children:"model_path"})," when calling libvmaf through ",(0,s.jsx)(t.code,{children:"ffmpeg"}),". However, you will need to be careful about the path you pass to ",(0,s.jsx)(t.code,{children:"model_path"}),"."]}),(0,s.jsxs)(t.p,{children:["If you are using a relative path for your ",(0,s.jsx)(t.code,{children:"model_path"}),", you can completely ignore this whole section, else if you are trying to use an absolute Windows path (",(0,s.jsx)(t.code,{children:"D:\\mypath\\vmaf_v0.6.1.json"}),") for your ",(0,s.jsx)(t.code,{children:"model_path"})," argument, you will need to be careful so ",(0,s.jsx)(t.code,{children:"ffmpeg"})," passes the right path to ",(0,s.jsx)(t.code,{children:"libvmaf"}),"."]}),(0,s.jsxs)(t.p,{children:["The final command line will depend on what shell you are running ",(0,s.jsx)(t.code,{children:"ffmpeg"})," through, so you will need to go through the following steps to make sure your path is okay."]}),(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Convert all of the backslashes ",(0,s.jsx)(t.code,{children:"\\"})," to forward slashes ",(0,s.jsx)(t.code,{children:"/"})," (",(0,s.jsx)(t.code,{children:"D:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Escape the colon ",(0,s.jsx)(t.code,{children:":"})," character by using a backslash ",(0,s.jsx)(t.code,{children:"\\"})," (",(0,s.jsx)(t.code,{children:"D\\:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Then escape that backslash with another backslash (",(0,s.jsx)(t.code,{children:"D\\\\:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["The next step will depend on the shell that will run ",(0,s.jsx)(t.code,{children:"ffmpeg"}),":"]}),"\n",(0,s.jsxs)(t.p,{children:["For PowerShell and Command Prompt, this will be enough and your final ",(0,s.jsx)(t.code,{children:"ffmpeg"})," command line will look something like"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-powershell",children:'./ffmpeg.exe -i dist.y4m -i ref.y4m \\\n -lavfi libvmaf=model_path="D\\\\:/mypath/vmaf_v0.6.1.json" \\\n -f null -\n'})}),"\n",(0,s.jsx)(t.admonition,{title:"Quoting the path",type:"info",children:(0,s.jsxs)(t.p,{children:["Note: I only quoted the path part for trivial reasons and in this specific case, it can be unquoted or you can quote the whole part after lavfi starting from ",(0,s.jsx)(t.code,{children:"libvmaf"})," to ",(0,s.jsx)(t.code,{children:"json"})," and it should give the same result due to neither shell treating the ",(0,s.jsx)(t.code,{children:"\\"})," as a special character"]})}),"\n",(0,s.jsxs)(t.p,{children:["For bash or specifically msys2 bash, it has some additional considerations. The first thing to know is that bash treats the backslash character ",(0,s.jsx)(t.code,{children:"\\"})," a bit special in that it's an escape character normally when not put inside single quotes. The second thing to know is that msys2's bash attempts convert a posix-like path (",(0,s.jsx)(t.code,{children:"/mingw64/share/model/vmaf_v0.6.1.json"}),") to a Windows mixed path (",(0,s.jsx)(t.code,{children:"D:/msys2/mingw64/share/model/vmaf_v0.6.1.json"}),") when passing arguments to a program. Normally, this would be fine, however, in our case, this works against us since we cannot allow it to convert the path to a normal path with an un-escaped colon. For this, we will need to not only escape the escaped backslash, but we will also need to pass the ",(0,s.jsx)(t.code,{children:"MSYS2_ARG_CONV_EXCL"})," environment variable with the value of ",(0,s.jsx)(t.code,{children:"*"})," to make sure it doesn't apply that special conversion on any of the arguments"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'MSYS2_ARG_CONV_EXCL="*" \\\n ./ffmpeg.exe -i dist.y4m -i ref.y4m -lavfi \\\n libvmaf=model_path="D\\\\\\:/mypath/vmaf_v0.6.1.json" -f null -\n'})}),"\n",(0,s.jsx)(t.admonition,{title:"Quotes",type:"info",children:(0,s.jsx)(t.p,{children:"Note: in this case, the quotes are not as trivial as the PowerShell/cmd version, as removing the quotes entirely will require you to re-escape the backslash resulting in 4 total backslashes, but quoting the whole argument will be fine."})}),"\n",(0,s.jsxs)(t.admonition,{title:"Single Quotes",type:"note",children:[(0,s.jsx)(t.p,{children:"Second Note: if you use single quotes around the path, it will be fine as well and the final command line would look like"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"MSYS2_ARG_CONV_EXCL=\"*\" \\\n ./ffmpeg.exe -i dist.y4m -i ref.y4m -lavfi \\\n libvmaf=model_path='D\\\\:/mypath/vmaf_v0.6.1.json' -f null -\n"})}),(0,s.jsx)(t.p,{children:"with only a double backslash instead of a triple."})]}),"\n"]}),"\n"]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,s.jsxs)(t.p,{children:["scores range from 0 to 100, and are best interpreted in a linear way,\n100 meaning perfect quality, 0 meaning not recognisable,\nmore info ",(0,s.jsx)(t.a,{href:"https://netflixtechblog.com/vmaf-the-journey-continues-44b51ee9ed12",children:"in the Best Practices section here"}),"\nIt aligns with mean opinion scores (MOS) really well at low/medium bitrates,\nas stated ",(0,s.jsx)(t.a,{href:"https://videoprocessing.ai/benchmarks/video-quality-metrics_both.html",children:"in this benchmark"})]}),"\n",(0,s.jsx)(t.h2,{id:"some-weaknesses",children:"Some weaknesses"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Newer codecs like AV1 and VVC introduce new kinds of artifacting that v0.6.2\n(current model as of Jan 2024) doesn't recognise,\nthat's why its performance might degrade, for example, high motion scenes being affected badly"}),"\n",(0,s.jsx)(t.li,{children:'It\'s bad at "transparent" levels of quality, kinds of quality that the average viewer might not notice'}),"\n",(0,s.jsx)(t.li,{children:"Synthetic grain throws off scores, this issue is not isolated to vmaf, but it should be noted regardless"}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{title:"With ffmpeg you can disable application of synthetic grain",type:"tip",children:(0,s.jsxs)(t.p,{children:["place ",(0,s.jsx)(t.code,{children:"-filmgrain 0"})," before ",(0,s.jsx)(t.code,{children:"-i"})," in the above ffmpeg commands, limited to decoding with dav1d\nTODO: replace this tip with an export_side_data solution"]})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"As of January 2024, it doesn't work on HDR content, nothing prevents you from feeding it un-tonemapped PQ but scores will be off"}),"\n",(0,s.jsx)(t.li,{children:"In contrast with SSIMULACRA2, it focuses on appeal, not necessarily on fidelity. They often align, but not always."}),"\n",(0,s.jsx)(t.li,{children:"Due to the ML nature, comparing the same video to itself will not always result in a score of 100"}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"comparing-to-ssimulacra2",children:"Comparing to SSIMULACRA2"}),"\n",(0,s.jsx)(t.p,{children:"One big advantage over SSIMULACRA2 is the inclusion of some temporal information.\nThis means that VMAF weights frames that have a lot of motion higher.\nMeanwhile, SSIMULACRA2 based solutions compare each frame to the reference frame individually, since it is an image\nmetric at heart.\nVMAF also wins in speed and general ease of use."}),"\n",(0,s.jsx)(t.h1,{id:"additional-resources",children:"Additional resources"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/tree/master/resource/doc",children:"VMAF Documentation on GitHub"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://netflixtechblog.com/vmaf-the-journey-continues-44b51ee9ed12",children:"Medium Article by Netflix"})}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var i=n(4164);const s={tabItem:"tabItem_Ymn6"};var r=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,i.A)(s.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var i=n(6540),s=n(4164),r=n(3104),a=n(6347),o=n(205),l=n(7485),c=n(1682),d=n(679);function h(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:t,children:n}=e;return(0,i.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:n,attributes:i,default:s}}=e;return{value:t,label:n,attributes:i,default:s}}))}(n);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const s=(0,a.W6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(r),(0,i.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(s.location.search);t.set(r,e),s.replace({...s.location,search:t.toString()})}),[r,s])]}function p(e){const{defaultValue:t,queryString:n=!1,groupId:s}=e,r=u(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const i=n.find((e=>e.default))??n[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:t,tabValues:r}))),[c,h]=f({queryString:n,groupId:s}),[p,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,r]=(0,d.Dv)(n);return[s,(0,i.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:s}),x=(()=>{const e=c??p;return m({value:e,tabValues:r})?e:null})();(0,o.A)((()=>{x&&l(x)}),[x]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),g(e)}),[h,g,r]),tabValues:r}}var g=n(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(4848);function j(e){let{className:t,block:n,selectedValue:i,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const t=e.currentTarget,n=l.indexOf(t),s=o[n].value;s!==i&&(c(t),a(s))},h=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",x.tabItem,r?.className,{"tabs__item--active":i===t}),children:n??t},t)}))})}function v(e){let{lazy:t,children:n,selectedValue:r}=e;const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===r));return e?(0,i.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,i.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function y(e){const t=p(e);return(0,b.jsxs)("div",{className:(0,s.A)("tabs-container",x.tabList),children:[(0,b.jsx)(j,{...t,...e}),(0,b.jsx)(v,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,b.jsx)(y,{...e,children:h(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var i=n(6540);const s={},r=i.createContext(s);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d96727fd.0433b868.js b/assets/js/d96727fd.0433b868.js new file mode 100644 index 000000000..8e5d39c97 --- /dev/null +++ b/assets/js/d96727fd.0433b868.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1500],{627:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"colorimetry/matrix","title":"Matrix Coefficients","description":"Matrix coefficients represent the multiplication matrix that is used when","source":"@site/docs/colorimetry/matrix.mdx","sourceDirName":"colorimetry","slug":"/colorimetry/matrix","permalink":"/docs/colorimetry/matrix","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/matrix.mdx","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"Matrix Coefficients","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"Transfer Characteristics","permalink":"/docs/colorimetry/transfer"},"next":{"title":"Aviator","permalink":"/docs/utilities/Aviator"}}');var s=i(4848),a=i(8453);const r={title:"Matrix Coefficients",sidebar_position:6},l="Matrix Coefficients",c={},o=[{value:"0: Identity",id:"0-identity",level:3},{value:"1: BT.709",id:"1-bt709",level:3},{value:"2: Unspecified",id:"2-unspecified",level:3},{value:"4: BT.470M",id:"4-bt470m",level:3},{value:"5: BT.470BG",id:"5-bt470bg",level:3},{value:"6: SMPTE 170M",id:"6-smpte-170m",level:3},{value:"7: SMPTE 240M",id:"7-smpte-240m",level:3},{value:"8: YCgCo",id:"8-ycgco",level:3},{value:"9: BT.2020 Non-Constant Luminance",id:"9-bt2020-non-constant-luminance",level:3},{value:"10: BT.2020 Constant Luminance",id:"10-bt2020-constant-luminance",level:3},{value:"11: SMPTE 2085",id:"11-smpte-2085",level:3},{value:"12: Chromaticity-Derived Non-Constant Luminance",id:"12-chromaticity-derived-non-constant-luminance",level:3},{value:"13: Chromaticity-Derived Constant Luminance",id:"13-chromaticity-derived-constant-luminance",level:3},{value:"14: ICtCp",id:"14-ictcp",level:3}];function d(e){const n={code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"matrix-coefficients",children:"Matrix Coefficients"})}),"\n",(0,s.jsx)(n.p,{children:"Matrix coefficients represent the multiplication matrix that is used when\nconverting from YUV to RGB. As with primaries, the integer values are defined\nwithin universal specifications, and as such they will be the same across all\nencoding and playback tools."}),"\n",(0,s.jsx)(n.p,{children:"The following values are available:"}),"\n",(0,s.jsx)(n.h3,{id:"0-identity",children:"0: Identity"}),"\n",(0,s.jsx)(n.p,{children:"Specifies that the identity matrix should be used, i.e. this data is already in an RGB-compatible colorspace."}),"\n",(0,s.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"GBR (often referred to as RGB)"}),"\n",(0,s.jsx)(n.li,{children:"YZX (often referred to as XYZ)"}),"\n",(0,s.jsx)(n.li,{children:"IEC 61966-2-1 sRGB"}),"\n",(0,s.jsx)(n.li,{children:"SMPTE ST 428-1 (2019)"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"1-bt709",children:"1: BT.709"}),"\n",(0,s.jsx)(n.p,{children:"BT.709 is the standard used for modern high-definition video, and is a safe default assumption."}),"\n",(0,s.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.709-6"}),"\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.1361-0 conventional colour gamut system and extended colour\ngamut system (historical)"}),"\n",(0,s.jsx)(n.li,{children:"IEC 61966-2-4 xvYCC709"}),"\n",(0,s.jsx)(n.li,{children:"SMPTE RP 177 (1993) Annex B"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"2-unspecified",children:"2: Unspecified"}),"\n",(0,s.jsx)(n.p,{children:"This value indicates that no color matrix is set for the video, and the player must decide which value to use."}),"\n",(0,s.jsx)(n.p,{children:"mpv will use the following heuristics in this case:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'if width >= 1280 || height > 576 {\n "BT.709"\n} else {\n "SMPTE 170M"\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"4-bt470m",children:"4: BT.470M"}),"\n",(0,s.jsx)(n.p,{children:"BT.470M is a standard that was used in analog television systems in the United States."}),"\n",(0,s.jsx)(n.h3,{id:"5-bt470bg",children:"5: BT.470BG"}),"\n",(0,s.jsx)(n.p,{children:"BT.470BG is a standard that was used for European (PAL) television systems and DVDs."}),"\n",(0,s.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.470-6 System B, G (historical)"}),"\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.601-7 625"}),"\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.1358-0 625 (historical)"}),"\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.1700-0 625 PAL and 625 SECAM"}),"\n",(0,s.jsx)(n.li,{children:"IEC 61966-2-1 sYCC"}),"\n",(0,s.jsx)(n.li,{children:"IEC 61966-2-4 xvYCC601"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"6-smpte-170m",children:"6: SMPTE 170M"}),"\n",(0,s.jsx)(n.p,{children:"SMPTE 170M is a stanrard that was used for NTSC television systems and DVDs. Its matrix coefficients are equivalent to BT.470BG."}),"\n",(0,s.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.601-7 525"}),"\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.1358-1 525 or 625 (historical)"}),"\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.1700-0 NTSC"}),"\n",(0,s.jsx)(n.li,{children:"SMPTE ST 170 (2004)"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"7-smpte-240m",children:"7: SMPTE 240M"}),"\n",(0,s.jsx)(n.p,{children:"SMPTE 240M was an interim standard used during the early days of HDTV (1988-1998)."}),"\n",(0,s.jsx)(n.h3,{id:"8-ycgco",children:"8: YCgCo"}),"\n",(0,s.jsx)(n.p,{children:"The YCoCg color model, also known as the YCgCo color model,\nis the color space formed from a simple transformation of\nan associated RGB color space into a luma value and\ntwo chroma values called chrominance green and chrominance orange."}),"\n",(0,s.jsx)(n.h3,{id:"9-bt2020-non-constant-luminance",children:"9: BT.2020 Non-Constant Luminance"}),"\n",(0,s.jsx)(n.p,{children:"BT.2020 is a standard used for ultra-high-definition video, i.e. 4K and higher. It may be used with or without HDR, as HDR is defined by the transfer characteristics. If you do not know if you want non-constant or constant luminance, you probably want non-constant."}),"\n",(0,s.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.2020-2 (non-constant luminance)"}),"\n",(0,s.jsx)(n.li,{children:"Rec. ITU-R BT.2100-2 Y\u2032CbCr"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"10-bt2020-constant-luminance",children:"10: BT.2020 Constant Luminance"}),"\n",(0,s.jsx)(n.p,{children:"This is a variant of BT.2020 with constant luminance values, represented using the YcCbcCrc colorspace. You probably want the non-constant luminance variant instead, unless you know you want this one."}),"\n",(0,s.jsx)(n.h3,{id:"11-smpte-2085",children:"11: SMPTE 2085"}),"\n",(0,s.jsx)(n.p,{children:"SMPTE 2085 is a standard used with HDR signals in the XYZ colorspace. I've never actually seen it used in the wild."}),"\n",(0,s.jsx)(n.h3,{id:"12-chromaticity-derived-non-constant-luminance",children:"12: Chromaticity-Derived Non-Constant Luminance"}),"\n",(0,s.jsx)(n.p,{children:"I'm not really sure when you would use this."}),"\n",(0,s.jsx)(n.h3,{id:"13-chromaticity-derived-constant-luminance",children:"13: Chromaticity-Derived Constant Luminance"}),"\n",(0,s.jsx)(n.p,{children:"I'm not really sure when you would use this."}),"\n",(0,s.jsx)(n.h3,{id:"14-ictcp",children:"14: ICtCp"}),"\n",(0,s.jsx)(n.p,{children:"ICtCp is an alternative colorspace developed for use with HDR and wide gamut video, by Dolby because they love doing extra stuff like this. I've never actually seen it used in the wild."})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var t=i(6540);const s={},a=t.createContext(s);function r(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d96727fd.3aace257.js b/assets/js/d96727fd.3aace257.js deleted file mode 100644 index 5e25601e0..000000000 --- a/assets/js/d96727fd.3aace257.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1500],{8566:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>o});var t=i(4848),s=i(8453);const a={title:"Matrix Coefficients",sidebar_position:6},r="Matrix Coefficients",l={id:"colorimetry/matrix",title:"Matrix Coefficients",description:"Matrix coefficients represent the multiplication matrix that is used when",source:"@site/docs/colorimetry/matrix.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/matrix",permalink:"/docs/colorimetry/matrix",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/matrix.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Matrix Coefficients",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Transfer Characteristics",permalink:"/docs/colorimetry/transfer"},next:{title:"Aviator",permalink:"/docs/utilities/Aviator"}},c={},o=[{value:"0: Identity",id:"0-identity",level:3},{value:"1: BT.709",id:"1-bt709",level:3},{value:"2: Unspecified",id:"2-unspecified",level:3},{value:"4: BT.470M",id:"4-bt470m",level:3},{value:"5: BT.470BG",id:"5-bt470bg",level:3},{value:"6: SMPTE 170M",id:"6-smpte-170m",level:3},{value:"7: SMPTE 240M",id:"7-smpte-240m",level:3},{value:"8: YCgCo",id:"8-ycgco",level:3},{value:"9: BT.2020 Non-Constant Luminance",id:"9-bt2020-non-constant-luminance",level:3},{value:"10: BT.2020 Constant Luminance",id:"10-bt2020-constant-luminance",level:3},{value:"11: SMPTE 2085",id:"11-smpte-2085",level:3},{value:"12: Chromaticity-Derived Non-Constant Luminance",id:"12-chromaticity-derived-non-constant-luminance",level:3},{value:"13: Chromaticity-Derived Constant Luminance",id:"13-chromaticity-derived-constant-luminance",level:3},{value:"14: ICtCp",id:"14-ictcp",level:3}];function d(e){const n={code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"matrix-coefficients",children:"Matrix Coefficients"})}),"\n",(0,t.jsx)(n.p,{children:"Matrix coefficients represent the multiplication matrix that is used when\nconverting from YUV to RGB. As with primaries, the integer values are defined\nwithin universal specifications, and as such they will be the same across all\nencoding and playback tools."}),"\n",(0,t.jsx)(n.p,{children:"The following values are available:"}),"\n",(0,t.jsx)(n.h3,{id:"0-identity",children:"0: Identity"}),"\n",(0,t.jsx)(n.p,{children:"Specifies that the identity matrix should be used, i.e. this data is already in an RGB-compatible colorspace."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"GBR (often referred to as RGB)"}),"\n",(0,t.jsx)(n.li,{children:"YZX (often referred to as XYZ)"}),"\n",(0,t.jsx)(n.li,{children:"IEC 61966-2-1 sRGB"}),"\n",(0,t.jsx)(n.li,{children:"SMPTE ST 428-1 (2019)"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"1-bt709",children:"1: BT.709"}),"\n",(0,t.jsx)(n.p,{children:"BT.709 is the standard used for modern high-definition video, and is a safe default assumption."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.709-6"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1361-0 conventional colour gamut system and extended colour\ngamut system (historical)"}),"\n",(0,t.jsx)(n.li,{children:"IEC 61966-2-4 xvYCC709"}),"\n",(0,t.jsx)(n.li,{children:"SMPTE RP 177 (1993) Annex B"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"2-unspecified",children:"2: Unspecified"}),"\n",(0,t.jsx)(n.p,{children:"This value indicates that no color matrix is set for the video, and the player must decide which value to use."}),"\n",(0,t.jsx)(n.p,{children:"mpv will use the following heuristics in this case:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'if width >= 1280 || height > 576 {\n "BT.709"\n} else {\n "SMPTE 170M"\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"4-bt470m",children:"4: BT.470M"}),"\n",(0,t.jsx)(n.p,{children:"BT.470M is a standard that was used in analog television systems in the United States."}),"\n",(0,t.jsx)(n.h3,{id:"5-bt470bg",children:"5: BT.470BG"}),"\n",(0,t.jsx)(n.p,{children:"BT.470BG is a standard that was used for European (PAL) television systems and DVDs."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.470-6 System B, G (historical)"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.601-7 625"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1358-0 625 (historical)"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1700-0 625 PAL and 625 SECAM"}),"\n",(0,t.jsx)(n.li,{children:"IEC 61966-2-1 sYCC"}),"\n",(0,t.jsx)(n.li,{children:"IEC 61966-2-4 xvYCC601"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"6-smpte-170m",children:"6: SMPTE 170M"}),"\n",(0,t.jsx)(n.p,{children:"SMPTE 170M is a stanrard that was used for NTSC television systems and DVDs. Its matrix coefficients are equivalent to BT.470BG."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.601-7 525"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1358-1 525 or 625 (historical)"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1700-0 NTSC"}),"\n",(0,t.jsx)(n.li,{children:"SMPTE ST 170 (2004)"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"7-smpte-240m",children:"7: SMPTE 240M"}),"\n",(0,t.jsx)(n.p,{children:"SMPTE 240M was an interim standard used during the early days of HDTV (1988-1998)."}),"\n",(0,t.jsx)(n.h3,{id:"8-ycgco",children:"8: YCgCo"}),"\n",(0,t.jsx)(n.p,{children:"The YCoCg color model, also known as the YCgCo color model,\nis the color space formed from a simple transformation of\nan associated RGB color space into a luma value and\ntwo chroma values called chrominance green and chrominance orange."}),"\n",(0,t.jsx)(n.h3,{id:"9-bt2020-non-constant-luminance",children:"9: BT.2020 Non-Constant Luminance"}),"\n",(0,t.jsx)(n.p,{children:"BT.2020 is a standard used for ultra-high-definition video, i.e. 4K and higher. It may be used with or without HDR, as HDR is defined by the transfer characteristics. If you do not know if you want non-constant or constant luminance, you probably want non-constant."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.2020-2 (non-constant luminance)"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.2100-2 Y\u2032CbCr"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"10-bt2020-constant-luminance",children:"10: BT.2020 Constant Luminance"}),"\n",(0,t.jsx)(n.p,{children:"This is a variant of BT.2020 with constant luminance values, represented using the YcCbcCrc colorspace. You probably want the non-constant luminance variant instead, unless you know you want this one."}),"\n",(0,t.jsx)(n.h3,{id:"11-smpte-2085",children:"11: SMPTE 2085"}),"\n",(0,t.jsx)(n.p,{children:"SMPTE 2085 is a standard used with HDR signals in the XYZ colorspace. I've never actually seen it used in the wild."}),"\n",(0,t.jsx)(n.h3,{id:"12-chromaticity-derived-non-constant-luminance",children:"12: Chromaticity-Derived Non-Constant Luminance"}),"\n",(0,t.jsx)(n.p,{children:"I'm not really sure when you would use this."}),"\n",(0,t.jsx)(n.h3,{id:"13-chromaticity-derived-constant-luminance",children:"13: Chromaticity-Derived Constant Luminance"}),"\n",(0,t.jsx)(n.p,{children:"I'm not really sure when you would use this."}),"\n",(0,t.jsx)(n.h3,{id:"14-ictcp",children:"14: ICtCp"}),"\n",(0,t.jsx)(n.p,{children:"ICtCp is an alternative colorspace developed for use with HDR and wide gamut video, by Dolby because they love doing extra stuff like this. I've never actually seen it used in the wild."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var t=i(6540);const s={},a=t.createContext(s);function r(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ddce1156.112d455b.js b/assets/js/ddce1156.112d455b.js deleted file mode 100644 index 3f0b619ab..000000000 --- a/assets/js/ddce1156.112d455b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1408],{5856:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>u});var o=i(4848),n=i(8453);const s={title:"MP4Box",sidebar_position:12},r="MP4Box",c={id:"utilities/mp4box",title:"MP4Box",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/utilities/mp4box.mdx",sourceDirName:"utilities",slug:"/utilities/mp4box",permalink:"/docs/utilities/mp4box",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/mp4box.mdx",tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"MP4Box",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool"},next:{title:"YUView",permalink:"/docs/utilities/YUView"}},a={},u=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"mp4box",children:"MP4Box"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(t.p,{children:["MP4Box is a software for multi-purpose MP4 file manipulation. Part of the free and open-source multimedia framework called ",(0,o.jsx)(t.a,{href:"https://github.com/gpac/gpac",children:"GPAC"})," for working with the MP4/ISOBMFF standard."]})]})}function l(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>c});var o=i(6540);const n={},s=o.createContext(n);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ddce1156.a807cbdd.js b/assets/js/ddce1156.a807cbdd.js new file mode 100644 index 000000000..0a2099c1c --- /dev/null +++ b/assets/js/ddce1156.a807cbdd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1408],{4382:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"utilities/mp4box","title":"MP4Box","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/utilities/mp4box.mdx","sourceDirName":"utilities","slug":"/utilities/mp4box","permalink":"/docs/utilities/mp4box","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/mp4box.mdx","tags":[],"version":"current","sidebarPosition":12,"frontMatter":{"title":"MP4Box","sidebar_position":12},"sidebar":"tutorialSidebar","previous":{"title":"hdr10plus_tool","permalink":"/docs/utilities/hdr10plus_tool"},"next":{"title":"YUView","permalink":"/docs/utilities/YUView"}}');var n=i(4848),s=i(8453);const r={title:"MP4Box",sidebar_position:12},a="MP4Box",c={},u=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"mp4box",children:"MP4Box"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(t.p,{children:["MP4Box is a software for multi-purpose MP4 file manipulation. Part of the free and open-source multimedia framework called ",(0,n.jsx)(t.a,{href:"https://github.com/gpac/gpac",children:"GPAC"})," for working with the MP4/ISOBMFF standard."]})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var o=i(6540);const n={},s=o.createContext(n);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e157395a.207bb473.js b/assets/js/e157395a.207bb473.js new file mode 100644 index 000000000..56a08148a --- /dev/null +++ b/assets/js/e157395a.207bb473.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7967],{6620:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"images/HEIC","title":"HEIC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/images/HEIC.mdx","sourceDirName":"images","slug":"/images/HEIC","permalink":"/docs/images/HEIC","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/HEIC.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"HEIC","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"GIF","permalink":"/docs/images/GIF"},"next":{"title":"WebP","permalink":"/docs/images/WebP"}}');var t=i(4848),o=i(8453);const r={title:"HEIC",sidebar_position:4},c="HEIC",a={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2}];function l(e){const s={a:"a",admonition:"admonition",blockquote:"blockquote",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"heic",children:"HEIC"})}),"\n",(0,t.jsx)(s.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(s.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(s.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(s.p,{children:["The HEIC image format, also known as the High Efficiency Image Format, is a newer image codec that was developed to provide improved compression and better performance compared to traditional image formats like ",(0,t.jsx)(s.a,{href:"/docs/images/JPEG",children:"JPEG"}),". HEIC files use ",(0,t.jsx)(s.a,{href:"/docs/video/HEVC",children:"HEVC"})," internally, meaning the format is not royalty free. While this has limited its adoption across the Web, this format is supported by many modern devices including the entire Apple ecosystem. iPhones shoot HDR HEIC photos by default by utilizing the iPhone's HEVC hardware video encoder to capture these images. Some Android phones are capable of shooting HEIC as well, but these are often transcoded from JPEG. HEIC has largely been surpassed by ",(0,t.jsx)(s.a,{href:"/docs/images/AVIF",children:"AVIF"}),", which uses the same container to store ",(0,t.jsx)(s.a,{href:"/docs/video/AV1",children:"AV1"}),"-compressed images."]}),"\n",(0,t.jsx)(s.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,t.jsxs)(s.p,{children:["Lossless? ",(0,t.jsx)(s.em,{children:"No"})]}),"\n",(0,t.jsxs)(s.p,{children:["Lossy? ",(0,t.jsx)(s.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(s.p,{children:["Supported Bit Depths:\n",(0,t.jsx)(s.em,{children:"8 BPC, 10 BPC"})]}),"\n",(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.em,{children:"Higher bit depths not widely supported"})}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:["HDR/Wide Gamut? ",(0,t.jsx)(s.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(s.p,{children:["Animation? ",(0,t.jsx)(s.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(s.p,{children:["Transparency? ",(0,t.jsx)(s.em,{children:"Yes"})]}),"\n",(0,t.jsxs)(s.p,{children:["Progressive Decode? ",(0,t.jsx)(s.em,{children:"No"})]}),"\n",(0,t.jsxs)(s.p,{children:["Royalty Free? ",(0,t.jsx)(s.em,{children:"No"})]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,i)=>{i.d(s,{R:()=>r,x:()=>c});var n=i(6540);const t={},o=n.createContext(t);function r(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e157395a.b8778f91.js b/assets/js/e157395a.b8778f91.js deleted file mode 100644 index 1b05bb12b..000000000 --- a/assets/js/e157395a.b8778f91.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7967],{8935:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var n=s(4848),t=s(8453);const o={title:"HEIC",sidebar_position:4},r="HEIC",c={id:"images/HEIC",title:"HEIC",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/HEIC.mdx",sourceDirName:"images",slug:"/images/HEIC",permalink:"/docs/images/HEIC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/HEIC.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"HEIC",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"GIF",permalink:"/docs/images/GIF"},next:{title:"WebP",permalink:"/docs/images/WebP"}},a={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2}];function l(e){const i={a:"a",admonition:"admonition",blockquote:"blockquote",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"heic",children:"HEIC"})}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(i.p,{children:["The HEIC image format, also known as the High Efficiency Image Format, is a newer image codec that was developed to provide improved compression and better performance compared to traditional image formats like ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),". HEIC files use ",(0,n.jsx)(i.a,{href:"/docs/video/HEVC",children:"HEVC"})," internally, meaning the format is not royalty free. While this has limited its adoption across the Web, this format is supported by many modern devices including the entire Apple ecosystem. iPhones shoot HDR HEIC photos by default by utilizing the iPhone's HEVC hardware video encoder to capture these images. Some Android phones are capable of shooting HEIC as well, but these are often transcoded from JPEG. HEIC has largely been surpassed by ",(0,n.jsx)(i.a,{href:"/docs/images/AVIF",children:"AVIF"}),", which uses the same container to store ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"}),"-compressed images."]}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"No"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"8 BPC, 10 BPC"})]}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.em,{children:"Higher bit depths not widely supported"})}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"No"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"No"})]})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>c});var n=s(6540);const t={},o=n.createContext(t);function r(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e1a437f7.415b8f79.js b/assets/js/e1a437f7.415b8f79.js deleted file mode 100644 index 0a65161f7..000000000 --- a/assets/js/e1a437f7.415b8f79.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9381],{801:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var n=i(4848),o=i(8453);const s={title:"bzip2",sidebar_position:3},a="bzip2",r={id:"data/bzip2",title:"bzip2",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/bzip2.mdx",sourceDirName:"data",slug:"/data/bzip2",permalink:"/docs/data/bzip2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/bzip2.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"bzip2",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"gzip",permalink:"/docs/data/gzip"},next:{title:"7z",permalink:"/docs/data/7z"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"bzip2",children:"bzip2"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(t.p,{children:["bzip2 is a open source file compression format and utility. It's efficency is slightly better than ",(0,n.jsx)(t.a,{href:"/docs/data/zip",children:"zip"}),", but worse than lzma based formats like ",(0,n.jsx)(t.a,{href:"/docs/data/xz",children:"xz"})," and ",(0,n.jsx)(t.a,{href:"/docs/data/7z",children:"7z"}),". bzip2 cannot be used to compress mutliple files at once, you should collate files together into a ",(0,n.jsx)(t.a,{href:"/docs/data/tar",children:"tarball"})," to compress mutliple files using bzip2."]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var n=i(6540);const o={},s=n.createContext(o);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e1a437f7.50b0acba.js b/assets/js/e1a437f7.50b0acba.js new file mode 100644 index 000000000..ea378c0ed --- /dev/null +++ b/assets/js/e1a437f7.50b0acba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9381],{6189:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"data/bzip2","title":"bzip2","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/data/bzip2.mdx","sourceDirName":"data","slug":"/data/bzip2","permalink":"/docs/data/bzip2","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/bzip2.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"bzip2","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"gzip","permalink":"/docs/data/gzip"},"next":{"title":"7z","permalink":"/docs/data/7z"}}');var o=i(4848),s=i(8453);const a={title:"bzip2",sidebar_position:3},r="bzip2",c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"bzip2",children:"bzip2"})}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(t.p,{children:["bzip2 is a open source file compression format and utility. It's efficency is slightly better than ",(0,o.jsx)(t.a,{href:"/docs/data/zip",children:"zip"}),", but worse than lzma based formats like ",(0,o.jsx)(t.a,{href:"/docs/data/xz",children:"xz"})," and ",(0,o.jsx)(t.a,{href:"/docs/data/7z",children:"7z"}),". bzip2 cannot be used to compress mutliple files at once, you should collate files together into a ",(0,o.jsx)(t.a,{href:"/docs/data/tar",children:"tarball"})," to compress mutliple files using bzip2."]})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var n=i(6540);const o={},s=n.createContext(o);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e1c48702.31de42f4.js b/assets/js/e1c48702.31de42f4.js deleted file mode 100644 index 3c727578e..000000000 --- a/assets/js/e1c48702.31de42f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6377],{1356:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>a,contentTitle:()=>r,default:()=>m,frontMatter:()=>t,metadata:()=>c,toc:()=>d});var o=i(4848),n=i(8453);const t={title:"Lossy Compression",sidebar_position:4},r="Lossy Compression",c={id:"introduction/lossy",title:"Lossy Compression",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/introduction/lossy.mdx",sourceDirName:"introduction",slug:"/introduction/lossy",permalink:"/docs/introduction/lossy",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/lossy.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Lossy Compression",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Lossless Compression",permalink:"/docs/introduction/lossless"},next:{title:"Spotting Video Artifacts",permalink:"/docs/introduction/video-artifacts"}},a={},d=[{value:"How Lossy Compression Works",id:"how-lossy-compression-works",level:2}];function l(e){const s={admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"lossy-compression",children:"Lossy Compression"})}),"\n",(0,o.jsx)(s.admonition,{title:"Under Maintenance",type:"info",children:(0,o.jsx)(s.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,o.jsx)(s.p,{children:"Lossy multimedia compression reduces the file size of multimedia data by permanently removing some of the information. This process leverages the limitations of the human senses, fidelity metrics, or appeal metrics to discard information that is considered less salient. The goal of lossy compression is to reduce the file size of multimedia data while maintaining a desired level of quality."}),"\n",(0,o.jsx)(s.h2,{id:"how-lossy-compression-works",children:"How Lossy Compression Works"}),"\n",(0,o.jsx)(s.p,{children:"Lossy compression works by analyzing the input signal and removing parts of it that are less salient. Some processes by which this is done include:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:"Perceptual Coding"})," (audio): This technique removes audio frequencies that are outside the range of human hearing or masked by other sounds."]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:"Quantization"})," (audio): This process reduces the precision of certain audio components, which can significantly reduce file size without a noticeable impact on perceived quality."]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.em,{children:"More coming soon"})})]})}function m(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,s,i)=>{i.d(s,{R:()=>r,x:()=>c});var o=i(6540);const n={},t=o.createContext(n);function r(e){const s=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e1c48702.b987ce2c.js b/assets/js/e1c48702.b987ce2c.js new file mode 100644 index 000000000..308e1b3b9 --- /dev/null +++ b/assets/js/e1c48702.b987ce2c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6377],{8600:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>a,contentTitle:()=>c,default:()=>m,frontMatter:()=>r,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"introduction/lossy","title":"Lossy Compression","description":"The content in this entry is incomplete & is in the process of being completed.","source":"@site/docs/introduction/lossy.mdx","sourceDirName":"introduction","slug":"/introduction/lossy","permalink":"/docs/introduction/lossy","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/lossy.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Lossy Compression","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Lossless Compression","permalink":"/docs/introduction/lossless"},"next":{"title":"Spotting Video Artifacts","permalink":"/docs/introduction/video-artifacts"}}');var n=o(4848),t=o(8453);const r={title:"Lossy Compression",sidebar_position:4},c="Lossy Compression",a={},d=[{value:"How Lossy Compression Works",id:"how-lossy-compression-works",level:2}];function l(e){const s={admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"lossy-compression",children:"Lossy Compression"})}),"\n",(0,n.jsx)(s.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(s.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsx)(s.p,{children:"Lossy multimedia compression reduces the file size of multimedia data by permanently removing some of the information. This process leverages the limitations of the human senses, fidelity metrics, or appeal metrics to discard information that is considered less salient. The goal of lossy compression is to reduce the file size of multimedia data while maintaining a desired level of quality."}),"\n",(0,n.jsx)(s.h2,{id:"how-lossy-compression-works",children:"How Lossy Compression Works"}),"\n",(0,n.jsx)(s.p,{children:"Lossy compression works by analyzing the input signal and removing parts of it that are less salient. Some processes by which this is done include:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"Perceptual Coding"})," (audio): This technique removes audio frequencies that are outside the range of human hearing or masked by other sounds."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"Quantization"})," (audio): This process reduces the precision of certain audio components, which can significantly reduce file size without a noticeable impact on perceived quality."]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.em,{children:"More coming soon"})})]})}function m(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,s,o)=>{o.d(s,{R:()=>r,x:()=>c});var i=o(6540);const n={},t=i.createContext(n);function r(e){const s=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e33da66d.7bf505ce.js b/assets/js/e33da66d.97d80f76.js similarity index 66% rename from assets/js/e33da66d.7bf505ce.js rename to assets/js/e33da66d.97d80f76.js index 9b89d7290..24c4537fa 100644 --- a/assets/js/e33da66d.7bf505ce.js +++ b/assets/js/e33da66d.97d80f76.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2361],{9109:e=>{e.exports=JSON.parse('{"tag":{"label":"video","permalink":"/blog/tags/video","allTagsPath":"/blog/tags","count":5,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/video","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2361],{9109:e=>{e.exports=JSON.parse('{"tag":{"label":"video","permalink":"/blog/tags/video","allTagsPath":"/blog/tags","count":6,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/video","page":1,"postsPerPage":10,"totalPages":1,"totalCount":6,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/e3b00369.068a46ff.js b/assets/js/e3b00369.068a46ff.js deleted file mode 100644 index 28514ada8..000000000 --- a/assets/js/e3b00369.068a46ff.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[921],{1364:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>d,toc:()=>c});var a=i(4848),s=i(8453);const t={title:"av1an-command-gen",sidebar_position:14},r="Av1an Command Generator",d={id:"utilities/av1an-command-gen",title:"av1an-command-gen",description:"Av1an Command Generator is a rudimentary tool for easily generating Av1an commands for AV1 encoding. It is written in the Zig programming language. It is very similar to rAV1ator CLI in the sense that it can produce Av1an commands based on user input.",source:"@site/docs/utilities/av1an-command-gen.mdx",sourceDirName:"utilities",slug:"/utilities/av1an-command-gen",permalink:"/docs/utilities/av1an-command-gen",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/av1an-command-gen.mdx",tags:[],version:"current",sidebarPosition:14,frontMatter:{title:"av1an-command-gen",sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"Discord",permalink:"/docs/utilities/Discord"},next:{title:"autocompressor",permalink:"/docs/utilities/autocompressor"}},o={},c=[{value:"Description",id:"description",level:2},{value:"Usage",id:"usage",level:2},{value:"Examples",id:"examples",level:2},{value:"Installation",id:"installation",level:2},{value:"License",id:"license",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"av1an-command-generator",children:"Av1an Command Generator"})}),"\n",(0,a.jsxs)(n.p,{children:["Av1an Command Generator is a rudimentary tool for easily generating Av1an commands for AV1 encoding. It is written in the Zig programming language. It is very similar to ",(0,a.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," in the sense that it can produce Av1an commands based on user input."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://github.com/gianni-rosato/av1an-command-gen/",children:"GitHub Link"})}),"\n",(0,a.jsx)(n.h2,{id:"description",children:"Description"}),"\n",(0,a.jsxs)(n.p,{children:["Av1an Command Generator is designed for beginners, although experienced encoders can use it to speed up their Av1an scripting. The program generates an AV1 video encoding command for use with ",(0,a.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"}),", a chunked video encoding tool that can be used with ",(0,a.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),", ",(0,a.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", and ",(0,a.jsx)(n.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"This tool takes in the video resolution, frame rate, desired encoder, speed preset, and target bitrate range as command line arguments. Based on these parameters, it calculates settings like tile columns/rows, lag-in-frames, CRF, and encoder speed preset. Then, it injects these into a generated encoding command string."}),"\n",(0,a.jsxs)(n.p,{children:["The output is a full ",(0,a.jsx)(n.code,{children:"av1an"})," command that can be run to encode a video based on the specified settings."]}),"\n",(0,a.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"av1an-command-gen [width] [height] [fps] [encoder] [speed] [bitrate_target]\n"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"width"})," - Input video width in pixels"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"height"})," - Input video height in pixels"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"fps"})," - Input video frame rate"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"encoder"})," - ",(0,a.jsx)(n.code,{children:"aom"}),", ",(0,a.jsx)(n.code,{children:"svt"}),", or ",(0,a.jsx)(n.code,{children:"rav1e"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"speed"})," - ",(0,a.jsx)(n.code,{children:"slower"}),", ",(0,a.jsx)(n.code,{children:"slow"}),", ",(0,a.jsx)(n.code,{children:"med"}),", ",(0,a.jsx)(n.code,{children:"fast"}),", ",(0,a.jsx)(n.code,{children:"faster"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"bitrate_target"})," - ",(0,a.jsx)(n.code,{children:"lowest"}),", ",(0,a.jsx)(n.code,{children:"low"}),", ",(0,a.jsx)(n.code,{children:"med"}),", ",(0,a.jsx)(n.code,{children:"high"})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,a.jsx)(n.p,{children:"Generate a command for encoding a 1280x720 video at 24 fps using rav1e at 'med' speed and 'low' bitrate target:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"av1an-command-gen 1280 720 24 rav1e med low\n"})}),"\n",(0,a.jsx)(n.p,{children:"Generate a command for encoding a 1920x1080 video at 30 fps using svt-av1 at 'fast' speed and 'high' bitrate target:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"av1an-command-gen 1920 1080 30 svt fast high\n"})}),"\n",(0,a.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsxs)(n.p,{children:["This program requires the ",(0,a.jsx)(n.a,{href:"https://ziglang.org/",children:"Zig"})," v0.11.0 programming language."]}),"\n",(0,a.jsx)(n.p,{children:"To build:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zig build\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This will produce a standalone binary ",(0,a.jsx)(n.code,{children:"av1an-command-gen"})," in ",(0,a.jsx)(n.code,{children:"zig-out/bin/"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"license",children:"License"}),"\n",(0,a.jsx)(n.p,{children:"This project is licensed under the BSD 3-Clause License."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>d});var a=i(6540);const s={},t=a.createContext(s);function r(e){const n=a.useContext(t);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e3b00369.6a6f7366.js b/assets/js/e3b00369.6a6f7366.js new file mode 100644 index 000000000..0e3946be5 --- /dev/null +++ b/assets/js/e3b00369.6a6f7366.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[921],{8105:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"utilities/av1an-command-gen","title":"av1an-command-gen","description":"Av1an Command Generator is a rudimentary tool for easily generating Av1an commands for AV1 encoding. It is written in the Zig programming language. It is very similar to rAV1ator CLI in the sense that it can produce Av1an commands based on user input.","source":"@site/docs/utilities/av1an-command-gen.mdx","sourceDirName":"utilities","slug":"/utilities/av1an-command-gen","permalink":"/docs/utilities/av1an-command-gen","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/av1an-command-gen.mdx","tags":[],"version":"current","sidebarPosition":14,"frontMatter":{"title":"av1an-command-gen","sidebar_position":14},"sidebar":"tutorialSidebar","previous":{"title":"Discord","permalink":"/docs/utilities/Discord"},"next":{"title":"autocompressor","permalink":"/docs/utilities/autocompressor"}}');var a=i(4848),t=i(8453);const r={title:"av1an-command-gen",sidebar_position:14},d="Av1an Command Generator",o={},c=[{value:"Description",id:"description",level:2},{value:"Usage",id:"usage",level:2},{value:"Examples",id:"examples",level:2},{value:"Installation",id:"installation",level:2},{value:"License",id:"license",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"av1an-command-generator",children:"Av1an Command Generator"})}),"\n",(0,a.jsxs)(n.p,{children:["Av1an Command Generator is a rudimentary tool for easily generating Av1an commands for AV1 encoding. It is written in the Zig programming language. It is very similar to ",(0,a.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," in the sense that it can produce Av1an commands based on user input."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://github.com/gianni-rosato/av1an-command-gen/",children:"GitHub Link"})}),"\n",(0,a.jsx)(n.h2,{id:"description",children:"Description"}),"\n",(0,a.jsxs)(n.p,{children:["Av1an Command Generator is designed for beginners, although experienced encoders can use it to speed up their Av1an scripting. The program generates an AV1 video encoding command for use with ",(0,a.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"}),", a chunked video encoding tool that can be used with ",(0,a.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),", ",(0,a.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", and ",(0,a.jsx)(n.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"This tool takes in the video resolution, frame rate, desired encoder, speed preset, and target bitrate range as command line arguments. Based on these parameters, it calculates settings like tile columns/rows, lag-in-frames, CRF, and encoder speed preset. Then, it injects these into a generated encoding command string."}),"\n",(0,a.jsxs)(n.p,{children:["The output is a full ",(0,a.jsx)(n.code,{children:"av1an"})," command that can be run to encode a video based on the specified settings."]}),"\n",(0,a.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"av1an-command-gen [width] [height] [fps] [encoder] [speed] [bitrate_target]\n"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"width"})," - Input video width in pixels"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"height"})," - Input video height in pixels"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"fps"})," - Input video frame rate"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"encoder"})," - ",(0,a.jsx)(n.code,{children:"aom"}),", ",(0,a.jsx)(n.code,{children:"svt"}),", or ",(0,a.jsx)(n.code,{children:"rav1e"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"speed"})," - ",(0,a.jsx)(n.code,{children:"slower"}),", ",(0,a.jsx)(n.code,{children:"slow"}),", ",(0,a.jsx)(n.code,{children:"med"}),", ",(0,a.jsx)(n.code,{children:"fast"}),", ",(0,a.jsx)(n.code,{children:"faster"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"bitrate_target"})," - ",(0,a.jsx)(n.code,{children:"lowest"}),", ",(0,a.jsx)(n.code,{children:"low"}),", ",(0,a.jsx)(n.code,{children:"med"}),", ",(0,a.jsx)(n.code,{children:"high"})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,a.jsx)(n.p,{children:"Generate a command for encoding a 1280x720 video at 24 fps using rav1e at 'med' speed and 'low' bitrate target:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"av1an-command-gen 1280 720 24 rav1e med low\n"})}),"\n",(0,a.jsx)(n.p,{children:"Generate a command for encoding a 1920x1080 video at 30 fps using svt-av1 at 'fast' speed and 'high' bitrate target:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"av1an-command-gen 1920 1080 30 svt fast high\n"})}),"\n",(0,a.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsxs)(n.p,{children:["This program requires the ",(0,a.jsx)(n.a,{href:"https://ziglang.org/",children:"Zig"})," v0.11.0 programming language."]}),"\n",(0,a.jsx)(n.p,{children:"To build:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zig build\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This will produce a standalone binary ",(0,a.jsx)(n.code,{children:"av1an-command-gen"})," in ",(0,a.jsx)(n.code,{children:"zig-out/bin/"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"license",children:"License"}),"\n",(0,a.jsx)(n.p,{children:"This project is licensed under the BSD 3-Clause License."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>d});var s=i(6540);const a={},t=s.createContext(a);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e641ee58.05299a4b.js b/assets/js/e641ee58.05299a4b.js deleted file mode 100644 index f65ac1d92..000000000 --- a/assets/js/e641ee58.05299a4b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5738],{3493:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>p,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var i=o(4848),n=o(8453);const s={title:"Speex",sidebar_position:6},r="Speex",c={id:"audio/Speex",title:"Speex",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/Speex.mdx",sourceDirName:"audio",slug:"/audio/Speex",permalink:"/docs/audio/Speex",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Speex.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Speex",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Vorbis",permalink:"/docs/audio/Vorbis"},next:{title:"ALAC",permalink:"/docs/audio/ALAC"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"speex",children:"Speex"})}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(t.p,{children:["Speex is an open-source audio codec designed for speech. It has largely been replaced by ",(0,i.jsx)(t.a,{href:"/docs/audio/Opus",children:"Opus"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>c});var i=o(6540);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e641ee58.c64968a6.js b/assets/js/e641ee58.c64968a6.js new file mode 100644 index 000000000..6b124effd --- /dev/null +++ b/assets/js/e641ee58.c64968a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5738],{6311:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"audio/Speex","title":"Speex","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/audio/Speex.mdx","sourceDirName":"audio","slug":"/audio/Speex","permalink":"/docs/audio/Speex","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Speex.mdx","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"Speex","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"Vorbis","permalink":"/docs/audio/Vorbis"},"next":{"title":"ALAC","permalink":"/docs/audio/ALAC"}}');var n=o(4848),s=o(8453);const r={title:"Speex",sidebar_position:6},a="Speex",c={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"speex",children:"Speex"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(t.p,{children:["Speex is an open-source audio codec designed for speech. It has largely been replaced by ",(0,n.jsx)(t.a,{href:"/docs/audio/Opus",children:"Opus"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>a});var i=o(6540);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/edaea366.3a139970.js b/assets/js/edaea366.3a139970.js new file mode 100644 index 000000000..4ba94b0c0 --- /dev/null +++ b/assets/js/edaea366.3a139970.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7978],{8207:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"colorimetry/transfer","title":"Transfer Characteristics","description":"Transfer characteristics, also known as transfer functions, represent the","source":"@site/docs/colorimetry/transfer.mdx","sourceDirName":"colorimetry","slug":"/colorimetry/transfer","permalink":"/docs/colorimetry/transfer","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/transfer.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"Transfer Characteristics","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Color Primaries","permalink":"/docs/colorimetry/primaries"},"next":{"title":"Matrix Coefficients","permalink":"/docs/colorimetry/matrix"}}');var t=n(4848),r=n(8453);const a={title:"Transfer Characteristics",sidebar_position:5},l="Transfer Characteristics",d={},o=[{value:"1: BT.1886",id:"1-bt1886",level:3},{value:"2: Unspecified",id:"2-unspecified",level:3},{value:"4: BT.470M",id:"4-bt470m",level:3},{value:"5: BT.470BG",id:"5-bt470bg",level:3},{value:"6: SMPTE 170M",id:"6-smpte-170m",level:3},{value:"7: SMPTE 240M",id:"7-smpte-240m",level:3},{value:"8: Linear",id:"8-linear",level:3},{value:"9: Logarithmic 100",id:"9-logarithmic-100",level:3},{value:"10: Logarithmic 316",id:"10-logarithmic-316",level:3},{value:"11: XVYCC",id:"11-xvycc",level:3},{value:"12: BT.1361E",id:"12-bt1361e",level:3},{value:"13: sRGB",id:"13-srgb",level:3},{value:"14: BT.2020 10-bit",id:"14-bt2020-10-bit",level:3},{value:"15: BT.2020 12-bit",id:"15-bt2020-12-bit",level:3},{value:"16: PQ aka SMPTE 2084",id:"16-pq-aka-smpte-2084",level:3},{value:"17: SMPTE 428",id:"17-smpte-428",level:3},{value:"18: HLG aka Hybrid Log-Gamma",id:"18-hlg-aka-hybrid-log-gamma",level:3}];function c(e){const i={h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"transfer-characteristics",children:"Transfer Characteristics"})}),"\n",(0,t.jsx)(i.p,{children:"Transfer characteristics, also known as transfer functions, represent the\ngamma function of a video--that is, how to convert from a gamma-compressed\nvideo to one that is in linear light. These are sometimes also called EOTF\nand OETF functions."}),"\n",(0,t.jsx)(i.p,{children:"As with primaries, the integer values are defined within universal specifications,\nand as such they will be the same across all encoding and playback tools."}),"\n",(0,t.jsx)(i.p,{children:"The following values are available:"}),"\n",(0,t.jsx)(i.h3,{id:"1-bt1886",children:"1: BT.1886"}),"\n",(0,t.jsx)(i.p,{children:"BT.1886 is the standard used for most modern, SDR video, and is a safe default assumption."}),"\n",(0,t.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.709-6"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.1361-0 conventional\ncolour gamut system (historical)"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"2-unspecified",children:"2: Unspecified"}),"\n",(0,t.jsx)(i.p,{children:"This value indicates that no transfer function is set for the video, and the player must decide which value to use."}),"\n",(0,t.jsx)(i.p,{children:"mpv will always assume BT.1886 in this case."}),"\n",(0,t.jsx)(i.h3,{id:"4-bt470m",children:"4: BT.470M"}),"\n",(0,t.jsx)(i.p,{children:"BT.470M is a standard that was used in analog television systems in the United States. This transfer represents a power function with a gamma of 2.2."}),"\n",(0,t.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.470-6 System M\n(historical)"}),"\n",(0,t.jsx)(i.li,{children:"United States National Television\nSystem Committee 1953\nRecommendation for transmission\nstandards for color television"}),"\n",(0,t.jsx)(i.li,{children:"United States Federal Communications\nCommission (2003) Title 47 Code of\nFederal Regulations 73.682 (a) (20)"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 625 PAL and\n625 SECAM"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"5-bt470bg",children:"5: BT.470BG"}),"\n",(0,t.jsx)(i.p,{children:"BT.470BG is a standard that was used for European (PAL) television systems and DVDs. This transfer represents a power function with a gamma of 2.8."}),"\n",(0,t.jsx)(i.h3,{id:"6-smpte-170m",children:"6: SMPTE 170M"}),"\n",(0,t.jsx)(i.p,{children:"SMPTE 170M is a stanrard that was used for NTSC television systems and DVDs. Its transfer function is equivalent to BT.1886."}),"\n",(0,t.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.601-7 525 or 625"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.1358-1 525 or 625\n(historical)"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 NTSC"}),"\n",(0,t.jsx)(i.li,{children:"SMPTE ST 170 (2004)"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"7-smpte-240m",children:"7: SMPTE 240M"}),"\n",(0,t.jsx)(i.p,{children:"SMPTE 240M was an interim standard used during the early days of HDTV (1988-1998)."}),"\n",(0,t.jsx)(i.h3,{id:"8-linear",children:"8: Linear"}),"\n",(0,t.jsx)(i.p,{children:"This value indicates that the content is already in linear light."}),"\n",(0,t.jsx)(i.h3,{id:"9-logarithmic-100",children:"9: Logarithmic 100"}),"\n",(0,t.jsx)(i.p,{children:"Indicates a logarithmic transfer function with a 100:1 range."}),"\n",(0,t.jsx)(i.h3,{id:"10-logarithmic-316",children:"10: Logarithmic 316"}),"\n",(0,t.jsx)(i.p,{children:"Indicates a logarithmic transfer function with a (100 * sqrt(10)):1 range."}),"\n",(0,t.jsx)(i.h3,{id:"11-xvycc",children:"11: XVYCC"}),"\n",(0,t.jsx)(i.p,{children:"Used in standard IEC 61966-2-4. I have no idea what this actually is."}),"\n",(0,t.jsx)(i.h3,{id:"12-bt1361e",children:"12: BT.1361E"}),"\n",(0,t.jsx)(i.p,{children:'This was intended to be a standard for "future" television systems, but it never really came into use.'}),"\n",(0,t.jsx)(i.h3,{id:"13-srgb",children:"13: sRGB"}),"\n",(0,t.jsx)(i.p,{children:"Represents the sRGB colorspace."}),"\n",(0,t.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"IEC 61966-2-1 sRGB (with\nMatrixCoefficients equal to 0)"}),"\n",(0,t.jsx)(i.li,{children:"IEC 61966-2-1 sYCC (with\nMatrixCoefficients equal to 5)"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"14-bt2020-10-bit",children:"14: BT.2020 10-bit"}),"\n",(0,t.jsx)(i.p,{children:"Typically used with ultra-high-definition 10-bit SDR video. Its transfer function is equivalent to BT.1886."}),"\n",(0,t.jsx)(i.h3,{id:"15-bt2020-12-bit",children:"15: BT.2020 12-bit"}),"\n",(0,t.jsx)(i.p,{children:"Typically used with ultra-high-definition 12-bit SDR video. Its transfer function is equivalent to BT.1886."}),"\n",(0,t.jsx)(i.h3,{id:"16-pq-aka-smpte-2084",children:"16: PQ aka SMPTE 2084"}),"\n",(0,t.jsx)(i.p,{children:"PQ is the most widely used transfer function for HDR content. It allows for a wider range of luminance to be represented than conventional transfer functions."}),"\n",(0,t.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"SMPTE ST 2084 (2014) for 10-, 12-,\n14- and 16-bit systems"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.2100-2 perceptual\nquantization (PQ) system"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"17-smpte-428",children:"17: SMPTE 428"}),"\n",(0,t.jsx)(i.p,{children:"SMPTE 428 is used for D-Cinema Distribution Masters, aka DCDM."}),"\n",(0,t.jsx)(i.h3,{id:"18-hlg-aka-hybrid-log-gamma",children:"18: HLG aka Hybrid Log-Gamma"}),"\n",(0,t.jsx)(i.p,{children:"HLG is an alternative transfer function for HDR content used by some televisions."}),"\n",(0,t.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"ARIB STD-B67 (2015)"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.2100-2 hybrid log-\ngamma (HLG) system"}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>a,x:()=>l});var s=n(6540);const t={},r=s.createContext(t);function a(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/edaea366.d4254e2a.js b/assets/js/edaea366.d4254e2a.js deleted file mode 100644 index 6d838e971..000000000 --- a/assets/js/edaea366.d4254e2a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7978],{4992:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>o});var s=n(4848),t=n(8453);const r={title:"Transfer Characteristics",sidebar_position:5},a="Transfer Characteristics",l={id:"colorimetry/transfer",title:"Transfer Characteristics",description:"Transfer characteristics, also known as transfer functions, represent the",source:"@site/docs/colorimetry/transfer.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/transfer",permalink:"/docs/colorimetry/transfer",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/transfer.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"Transfer Characteristics",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Color Primaries",permalink:"/docs/colorimetry/primaries"},next:{title:"Matrix Coefficients",permalink:"/docs/colorimetry/matrix"}},d={},o=[{value:"1: BT.1886",id:"1-bt1886",level:3},{value:"2: Unspecified",id:"2-unspecified",level:3},{value:"4: BT.470M",id:"4-bt470m",level:3},{value:"5: BT.470BG",id:"5-bt470bg",level:3},{value:"6: SMPTE 170M",id:"6-smpte-170m",level:3},{value:"7: SMPTE 240M",id:"7-smpte-240m",level:3},{value:"8: Linear",id:"8-linear",level:3},{value:"9: Logarithmic 100",id:"9-logarithmic-100",level:3},{value:"10: Logarithmic 316",id:"10-logarithmic-316",level:3},{value:"11: XVYCC",id:"11-xvycc",level:3},{value:"12: BT.1361E",id:"12-bt1361e",level:3},{value:"13: sRGB",id:"13-srgb",level:3},{value:"14: BT.2020 10-bit",id:"14-bt2020-10-bit",level:3},{value:"15: BT.2020 12-bit",id:"15-bt2020-12-bit",level:3},{value:"16: PQ aka SMPTE 2084",id:"16-pq-aka-smpte-2084",level:3},{value:"17: SMPTE 428",id:"17-smpte-428",level:3},{value:"18: HLG aka Hybrid Log-Gamma",id:"18-hlg-aka-hybrid-log-gamma",level:3}];function c(e){const i={h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"transfer-characteristics",children:"Transfer Characteristics"})}),"\n",(0,s.jsx)(i.p,{children:"Transfer characteristics, also known as transfer functions, represent the\ngamma function of a video--that is, how to convert from a gamma-compressed\nvideo to one that is in linear light. These are sometimes also called EOTF\nand OETF functions."}),"\n",(0,s.jsx)(i.p,{children:"As with primaries, the integer values are defined within universal specifications,\nand as such they will be the same across all encoding and playback tools."}),"\n",(0,s.jsx)(i.p,{children:"The following values are available:"}),"\n",(0,s.jsx)(i.h3,{id:"1-bt1886",children:"1: BT.1886"}),"\n",(0,s.jsx)(i.p,{children:"BT.1886 is the standard used for most modern, SDR video, and is a safe default assumption."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.709-6"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1361-0 conventional\ncolour gamut system (historical)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"2-unspecified",children:"2: Unspecified"}),"\n",(0,s.jsx)(i.p,{children:"This value indicates that no transfer function is set for the video, and the player must decide which value to use."}),"\n",(0,s.jsx)(i.p,{children:"mpv will always assume BT.1886 in this case."}),"\n",(0,s.jsx)(i.h3,{id:"4-bt470m",children:"4: BT.470M"}),"\n",(0,s.jsx)(i.p,{children:"BT.470M is a standard that was used in analog television systems in the United States. This transfer represents a power function with a gamma of 2.2."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.470-6 System M\n(historical)"}),"\n",(0,s.jsx)(i.li,{children:"United States National Television\nSystem Committee 1953\nRecommendation for transmission\nstandards for color television"}),"\n",(0,s.jsx)(i.li,{children:"United States Federal Communications\nCommission (2003) Title 47 Code of\nFederal Regulations 73.682 (a) (20)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 625 PAL and\n625 SECAM"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"5-bt470bg",children:"5: BT.470BG"}),"\n",(0,s.jsx)(i.p,{children:"BT.470BG is a standard that was used for European (PAL) television systems and DVDs. This transfer represents a power function with a gamma of 2.8."}),"\n",(0,s.jsx)(i.h3,{id:"6-smpte-170m",children:"6: SMPTE 170M"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 170M is a stanrard that was used for NTSC television systems and DVDs. Its transfer function is equivalent to BT.1886."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.601-7 525 or 625"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1358-1 525 or 625\n(historical)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 NTSC"}),"\n",(0,s.jsx)(i.li,{children:"SMPTE ST 170 (2004)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"7-smpte-240m",children:"7: SMPTE 240M"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 240M was an interim standard used during the early days of HDTV (1988-1998)."}),"\n",(0,s.jsx)(i.h3,{id:"8-linear",children:"8: Linear"}),"\n",(0,s.jsx)(i.p,{children:"This value indicates that the content is already in linear light."}),"\n",(0,s.jsx)(i.h3,{id:"9-logarithmic-100",children:"9: Logarithmic 100"}),"\n",(0,s.jsx)(i.p,{children:"Indicates a logarithmic transfer function with a 100:1 range."}),"\n",(0,s.jsx)(i.h3,{id:"10-logarithmic-316",children:"10: Logarithmic 316"}),"\n",(0,s.jsx)(i.p,{children:"Indicates a logarithmic transfer function with a (100 * sqrt(10)):1 range."}),"\n",(0,s.jsx)(i.h3,{id:"11-xvycc",children:"11: XVYCC"}),"\n",(0,s.jsx)(i.p,{children:"Used in standard IEC 61966-2-4. I have no idea what this actually is."}),"\n",(0,s.jsx)(i.h3,{id:"12-bt1361e",children:"12: BT.1361E"}),"\n",(0,s.jsx)(i.p,{children:'This was intended to be a standard for "future" television systems, but it never really came into use.'}),"\n",(0,s.jsx)(i.h3,{id:"13-srgb",children:"13: sRGB"}),"\n",(0,s.jsx)(i.p,{children:"Represents the sRGB colorspace."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"IEC 61966-2-1 sRGB (with\nMatrixCoefficients equal to 0)"}),"\n",(0,s.jsx)(i.li,{children:"IEC 61966-2-1 sYCC (with\nMatrixCoefficients equal to 5)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"14-bt2020-10-bit",children:"14: BT.2020 10-bit"}),"\n",(0,s.jsx)(i.p,{children:"Typically used with ultra-high-definition 10-bit SDR video. Its transfer function is equivalent to BT.1886."}),"\n",(0,s.jsx)(i.h3,{id:"15-bt2020-12-bit",children:"15: BT.2020 12-bit"}),"\n",(0,s.jsx)(i.p,{children:"Typically used with ultra-high-definition 12-bit SDR video. Its transfer function is equivalent to BT.1886."}),"\n",(0,s.jsx)(i.h3,{id:"16-pq-aka-smpte-2084",children:"16: PQ aka SMPTE 2084"}),"\n",(0,s.jsx)(i.p,{children:"PQ is the most widely used transfer function for HDR content. It allows for a wider range of luminance to be represented than conventional transfer functions."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"SMPTE ST 2084 (2014) for 10-, 12-,\n14- and 16-bit systems"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.2100-2 perceptual\nquantization (PQ) system"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"17-smpte-428",children:"17: SMPTE 428"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 428 is used for D-Cinema Distribution Masters, aka DCDM."}),"\n",(0,s.jsx)(i.h3,{id:"18-hlg-aka-hybrid-log-gamma",children:"18: HLG aka Hybrid Log-Gamma"}),"\n",(0,s.jsx)(i.p,{children:"HLG is an alternative transfer function for HDR content used by some televisions."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"ARIB STD-B67 (2015)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.2100-2 hybrid log-\ngamma (HLG) system"}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>a,x:()=>l});var s=n(6540);const t={},r=s.createContext(t);function a(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee513c31.027b1fe5.js b/assets/js/ee513c31.027b1fe5.js deleted file mode 100644 index ffd4cb09b..000000000 --- a/assets/js/ee513c31.027b1fe5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1137],{7155:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>l,metadata:()=>u,toc:()=>d});var o=n(4848),r=n(8453),i=n(1470),a=n(9365);const l={title:"dovi_tool",sidebar_position:9},s="dovi_tool",u={id:"utilities/dovi_tool",title:"dovi_tool",description:"dovi_tool is a command line tool written in Rust combining multiple utilities for working with Dolby Vision.",source:"@site/docs/utilities/dovi_tool.mdx",sourceDirName:"utilities",slug:"/utilities/dovi_tool",permalink:"/docs/utilities/dovi_tool",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/dovi_tool.mdx",tags:[],version:"current",sidebarPosition:9,frontMatter:{title:"dovi_tool",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"FFMetrics",permalink:"/docs/utilities/FFMetrics"},next:{title:"eac3to",permalink:"/docs/utilities/eac3to"}},c={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"dovi_tool",children:"dovi_tool"})}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"dovi_tool"})," is a command line tool written in Rust combining multiple utilities for working with Dolby Vision."]}),"\n",(0,o.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(i.A,{children:[(0,o.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,o.jsxs)(t.p,{children:["You can download official pre-built binaries for Linux & macOS from ",(0,o.jsx)(t.a,{href:"https://github.com/quietvoid/dovi_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,o.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})})]}),(0,o.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,o.jsxs)(t.p,{children:["You can download official pre-built binaries for Windows from ",(0,o.jsx)(t.a,{href:"https://github.com/quietvoid/dovi_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,o.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-pwsh",children:"git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})})]})]}),"\n",(0,o.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",metastring:'title="General usage"',children:"dovi_tool [OPTIONS] \n"})}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",metastring:'title="Get more options for a subcommand"',children:"dovi_tool --help\n"})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var o=n(4164);const r={tabItem:"tabItem_Ymn6"};var i=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>y});var o=n(6540),r=n(4164),i=n(3104),a=n(6347),l=n(205),s=n(7485),u=n(1682),c=n(679);function d(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,o.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:o,default:r}}=e;return{value:t,label:n,attributes:o,default:r}}))}(n);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const r=(0,a.W6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s.aZ)(i),(0,o.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,i=h(e),[a,s]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const o=n.find((e=>e.default))??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:i}))),[u,d]=m({queryString:n,groupId:r}),[b,f]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,c.Dv)(n);return[r,(0,o.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:r}),v=(()=>{const e=u??b;return p({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{v&&s(v)}),[v]);return{selectedValue:a,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),f(e)}),[d,f,i]),tabValues:i}}var f=n(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=n(4848);function x(e){let{className:t,block:n,selectedValue:o,selectValue:a,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:u}=(0,i.a_)(),c=e=>{const t=e.currentTarget,n=s.indexOf(t),r=l[n].value;r!==o&&(u(t),a(r))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=s.indexOf(e.currentTarget)+1;t=s[n]??s[0];break}case"ArrowLeft":{const n=s.indexOf(e.currentTarget)-1;t=s[n]??s[s.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},t),children:l.map((e=>{let{value:t,label:n,attributes:i}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,ref:e=>s.push(e),onKeyDown:d,onClick:c,...i,className:(0,r.A)("tabs__item",v.tabItem,i?.className,{"tabs__item--active":o===t}),children:n??t},t)}))})}function w(e){let{lazy:t,children:n,selectedValue:i}=e;const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===i));return e?(0,o.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function j(e){const t=b(e);return(0,g.jsxs)("div",{className:(0,r.A)("tabs-container",v.tabList),children:[(0,g.jsx)(x,{...t,...e}),(0,g.jsx)(w,{...t,...e})]})}function y(e){const t=(0,f.A)();return(0,g.jsx)(j,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>l});var o=n(6540);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee513c31.57d08833.js b/assets/js/ee513c31.57d08833.js new file mode 100644 index 000000000..c26dd3d43 --- /dev/null +++ b/assets/js/ee513c31.57d08833.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1137],{5540:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"utilities/dovi_tool","title":"dovi_tool","description":"dovi_tool is a command line tool written in Rust combining multiple utilities for working with Dolby Vision.","source":"@site/docs/utilities/dovi_tool.mdx","sourceDirName":"utilities","slug":"/utilities/dovi_tool","permalink":"/docs/utilities/dovi_tool","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/dovi_tool.mdx","tags":[],"version":"current","sidebarPosition":9,"frontMatter":{"title":"dovi_tool","sidebar_position":9},"sidebar":"tutorialSidebar","previous":{"title":"FFMetrics","permalink":"/docs/utilities/FFMetrics"},"next":{"title":"eac3to","permalink":"/docs/utilities/eac3to"}}');var r=n(4848),i=n(8453),a=n(1470),l=n(9365);const s={title:"dovi_tool",sidebar_position:9},u="dovi_tool",c={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"dovi_tool",children:"dovi_tool"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"dovi_tool"})," is a command line tool written in Rust combining multiple utilities for working with Dolby Vision."]}),"\n",(0,r.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(a.A,{children:[(0,r.jsxs)(l.A,{value:"unixlike",label:"Linux & macOS",children:[(0,r.jsxs)(t.p,{children:["You can download official pre-built binaries for Linux & macOS from ",(0,r.jsx)(t.a,{href:"https://github.com/quietvoid/dovi_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,r.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})})]}),(0,r.jsxs)(l.A,{value:"windows",label:"Windows",children:[(0,r.jsxs)(t.p,{children:["You can download official pre-built binaries for Windows from ",(0,r.jsx)(t.a,{href:"https://github.com/quietvoid/dovi_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,r.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-pwsh",children:"git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="General usage"',children:"dovi_tool [OPTIONS] \n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Get more options for a subcommand"',children:"dovi_tool --help\n"})})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var o=n(4164);const r={tabItem:"tabItem_Ymn6"};var i=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>y});var o=n(6540),r=n(4164),i=n(3104),a=n(6347),l=n(205),s=n(7485),u=n(1682),c=n(679);function d(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,o.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:o,default:r}}=e;return{value:t,label:n,attributes:o,default:r}}))}(n);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const r=(0,a.W6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s.aZ)(i),(0,o.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,i=h(e),[a,s]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const o=n.find((e=>e.default))??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:i}))),[u,d]=m({queryString:n,groupId:r}),[b,f]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,c.Dv)(n);return[r,(0,o.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:r}),v=(()=>{const e=u??b;return p({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{v&&s(v)}),[v]);return{selectedValue:a,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),f(e)}),[d,f,i]),tabValues:i}}var f=n(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=n(4848);function x(e){let{className:t,block:n,selectedValue:o,selectValue:a,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:u}=(0,i.a_)(),c=e=>{const t=e.currentTarget,n=s.indexOf(t),r=l[n].value;r!==o&&(u(t),a(r))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=s.indexOf(e.currentTarget)+1;t=s[n]??s[0];break}case"ArrowLeft":{const n=s.indexOf(e.currentTarget)-1;t=s[n]??s[s.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},t),children:l.map((e=>{let{value:t,label:n,attributes:i}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,ref:e=>s.push(e),onKeyDown:d,onClick:c,...i,className:(0,r.A)("tabs__item",v.tabItem,i?.className,{"tabs__item--active":o===t}),children:n??t},t)}))})}function w(e){let{lazy:t,children:n,selectedValue:i}=e;const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===i));return e?(0,o.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function j(e){const t=b(e);return(0,g.jsxs)("div",{className:(0,r.A)("tabs-container",v.tabList),children:[(0,g.jsx)(x,{...t,...e}),(0,g.jsx)(w,{...t,...e})]})}function y(e){const t=(0,f.A)();return(0,g.jsx)(j,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>l});var o=n(6540);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee8c27e3.1c988f9b.js b/assets/js/ee8c27e3.1c988f9b.js deleted file mode 100644 index 080ca62aa..000000000 --- a/assets/js/ee8c27e3.1c988f9b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9819],{3835:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var o=i(4848),t=i(8453);const r={title:"uvg266",sidebar_position:13},s="uvg266",l={id:"encoders/uvg266",title:"uvg266",description:"uvg266 is an open-source software encoder for encoding to the H.266 / VVC codec. Developed by the Ultra Video Group, written in C and licensed under BSD 3-clause.",source:"@site/docs/encoders/uvg266.mdx",sourceDirName:"encoders",slug:"/encoders/uvg266",permalink:"/docs/encoders/uvg266",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/uvg266.mdx",tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"uvg266",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"VVenC",permalink:"/docs/encoders/VVenC"},next:{title:"VTM",permalink:"/docs/encoders/VTM"}},c={},a=[{value:"Installation",id:"installation",level:2},{value:"Arch Linux",id:"arch-linux",level:3},{value:"Compiling",id:"compiling",level:3},{value:"10-bit Support",id:"10-bit-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"uvg266",children:"uvg266"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://github.com/ultravideo/uvg266/",children:"uvg266"})," is an open-source software encoder for encoding to the ",(0,o.jsx)(n.a,{href:"/docs/video/VVC",children:"H.266 / VVC"})," codec. Developed by the ",(0,o.jsx)(n.a,{href:"https://ultravideo.fi/",children:"Ultra Video Group"}),", written in C and licensed under BSD 3-clause.\nThe encoder is based on ",(0,o.jsx)(n.a,{href:"/docs/encoders/Kvazaar",children:"Kvazaar"}),", their open source ",(0,o.jsx)(n.a,{href:"/docs/video/HEVC",children:"HEVC"})," encoder solution."]}),"\n",(0,o.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(n.h3,{id:"arch-linux",children:"Arch Linux"}),"\n",(0,o.jsxs)(n.p,{children:["uvg266 is available in the Arch User Repository (AUR) as ",(0,o.jsx)(n.code,{children:"uvg266"})," and ",(0,o.jsx)(n.code,{children:"uvg266-git"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"compiling",children:"Compiling"}),"\n",(0,o.jsx)(n.p,{children:"Ultra Video Group does not ship any pre-built binaries of their encoders so you'll have to compile them yourself."}),"\n",(0,o.jsxs)(n.p,{children:["Windows users are recommended to compile via MinGW-W64 which comes with ",(0,o.jsx)(n.a,{href:"https://msys2.org/",children:"MSYS2"}),"."]}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"Compilation requires GNU Make and CMake"})}),"\n",(0,o.jsxs)(n.admonition,{type:"tip",children:[(0,o.jsx)(n.p,{children:"The following build procedure should work across all common operating systems. Using Clang instead of GCC works."}),(0,o.jsxs)(n.p,{children:["You may add ",(0,o.jsx)(n.code,{children:'-DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_C_FLAGS_INIT="-flto=8 -static"'})," in CMake for better performance."]})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/ultravideo/uvg266.git\ncd uvg266/build\ncmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0\nmake -j 8\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Binaries will be available in the same folder (",(0,o.jsx)(n.code,{children:"build"}),"), or you can run ",(0,o.jsx)(n.code,{children:"make install"})," on Linux to install (May need elevated permissions)."]}),"\n",(0,o.jsx)(n.h3,{id:"10-bit-support",children:"10-bit Support"}),"\n",(0,o.jsxs)(n.p,{children:["You need to compile with ",(0,o.jsx)(n.code,{children:"-DUVG_BIT_DEPTH=10"})," in the CMake ",(0,o.jsx)(n.code,{children:"-DCMAKE_C_FLAGS"})," option to enable support for encoding 10-bit videos."]}),"\n",(0,o.jsx)(n.p,{children:"For example:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'-DCMAKE_C_FLAGS="-DUVG_BIT_DEPTH=10"\n'})}),"\n",(0,o.jsx)(n.p,{children:"With native optimizations:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'-DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt -DUVG_BIT_DEPTH=10"\n'})}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsx)(n.p,{children:"Encoding 10-bit with uvg266 is significantly slower as the developers only prioritized SIMD optimizations for 8-bit, and can get really buggy."})}),"\n",(0,o.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Simple Y4M input with QP 20 and raw 266 bitstream output"',children:"uvg266 -i input.y4m --input-file-format y4m --qp 20 -o output.266\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Preset slow, CRF 20, Y4M input"',children:"uvg266 -i input.y4m --input-file-format y4m --qp 20 --preset slow -o output.266\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | uvg266 -i - --input-file-format y4m --qp 20 --preset slow -o output.266\n"})}),"\n",(0,o.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Could not find a strategy for crc32c_8x8!"})," - You're out of luck, uvg266 failed to initialize its block partitioning strategy for your specific CPU instruction set, so you ",(0,o.jsx)(n.strong,{children:"can't use the encoder or encode that specific video"}),"."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>l});var o=i(6540);const t={},r=o.createContext(t);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee8c27e3.bedb0161.js b/assets/js/ee8c27e3.bedb0161.js new file mode 100644 index 000000000..8654c694b --- /dev/null +++ b/assets/js/ee8c27e3.bedb0161.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9819],{5892:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"encoders/uvg266","title":"uvg266","description":"uvg266 is an open-source software encoder for encoding to the H.266 / VVC codec. Developed by the Ultra Video Group, written in C and licensed under BSD 3-clause.","source":"@site/docs/encoders/uvg266.mdx","sourceDirName":"encoders","slug":"/encoders/uvg266","permalink":"/docs/encoders/uvg266","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/uvg266.mdx","tags":[],"version":"current","sidebarPosition":13,"frontMatter":{"title":"uvg266","sidebar_position":13},"sidebar":"tutorialSidebar","previous":{"title":"VVenC","permalink":"/docs/encoders/VVenC"},"next":{"title":"VTM","permalink":"/docs/encoders/VTM"}}');var t=i(4848),s=i(8453);const r={title:"uvg266",sidebar_position:13},l="uvg266",c={},a=[{value:"Installation",id:"installation",level:2},{value:"Arch Linux",id:"arch-linux",level:3},{value:"Compiling",id:"compiling",level:3},{value:"10-bit Support",id:"10-bit-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"uvg266",children:"uvg266"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/ultravideo/uvg266/",children:"uvg266"})," is an open-source software encoder for encoding to the ",(0,t.jsx)(n.a,{href:"/docs/video/VVC",children:"H.266 / VVC"})," codec. Developed by the ",(0,t.jsx)(n.a,{href:"https://ultravideo.fi/",children:"Ultra Video Group"}),", written in C and licensed under BSD 3-clause.\nThe encoder is based on ",(0,t.jsx)(n.a,{href:"/docs/encoders/Kvazaar",children:"Kvazaar"}),", their open source ",(0,t.jsx)(n.a,{href:"/docs/video/HEVC",children:"HEVC"})," encoder solution."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.h3,{id:"arch-linux",children:"Arch Linux"}),"\n",(0,t.jsxs)(n.p,{children:["uvg266 is available in the Arch User Repository (AUR) as ",(0,t.jsx)(n.code,{children:"uvg266"})," and ",(0,t.jsx)(n.code,{children:"uvg266-git"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"compiling",children:"Compiling"}),"\n",(0,t.jsx)(n.p,{children:"Ultra Video Group does not ship any pre-built binaries of their encoders so you'll have to compile them yourself."}),"\n",(0,t.jsxs)(n.p,{children:["Windows users are recommended to compile via MinGW-W64 which comes with ",(0,t.jsx)(n.a,{href:"https://msys2.org/",children:"MSYS2"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsx)(n.p,{children:"Compilation requires GNU Make and CMake"})}),"\n",(0,t.jsxs)(n.admonition,{type:"tip",children:[(0,t.jsx)(n.p,{children:"The following build procedure should work across all common operating systems. Using Clang instead of GCC works."}),(0,t.jsxs)(n.p,{children:["You may add ",(0,t.jsx)(n.code,{children:'-DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_C_FLAGS_INIT="-flto=8 -static"'})," in CMake for better performance."]})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/ultravideo/uvg266.git\ncd uvg266/build\ncmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0\nmake -j 8\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Binaries will be available in the same folder (",(0,t.jsx)(n.code,{children:"build"}),"), or you can run ",(0,t.jsx)(n.code,{children:"make install"})," on Linux to install (May need elevated permissions)."]}),"\n",(0,t.jsx)(n.h3,{id:"10-bit-support",children:"10-bit Support"}),"\n",(0,t.jsxs)(n.p,{children:["You need to compile with ",(0,t.jsx)(n.code,{children:"-DUVG_BIT_DEPTH=10"})," in the CMake ",(0,t.jsx)(n.code,{children:"-DCMAKE_C_FLAGS"})," option to enable support for encoding 10-bit videos."]}),"\n",(0,t.jsx)(n.p,{children:"For example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'-DCMAKE_C_FLAGS="-DUVG_BIT_DEPTH=10"\n'})}),"\n",(0,t.jsx)(n.p,{children:"With native optimizations:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'-DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt -DUVG_BIT_DEPTH=10"\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"Encoding 10-bit with uvg266 is significantly slower as the developers only prioritized SIMD optimizations for 8-bit, and can get really buggy."})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Simple Y4M input with QP 20 and raw 266 bitstream output"',children:"uvg266 -i input.y4m --input-file-format y4m --qp 20 -o output.266\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Preset slow, CRF 20, Y4M input"',children:"uvg266 -i input.y4m --input-file-format y4m --qp 20 --preset slow -o output.266\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | uvg266 -i - --input-file-format y4m --qp 20 --preset slow -o output.266\n"})}),"\n",(0,t.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Could not find a strategy for crc32c_8x8!"})," - You're out of luck, uvg266 failed to initialize its block partitioning strategy for your specific CPU instruction set, so you ",(0,t.jsx)(n.strong,{children:"can't use the encoder or encode that specific video"}),"."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var o=i(6540);const t={},s=o.createContext(t);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4fea690.cf767130.js b/assets/js/f4fea690.cf767130.js new file mode 100644 index 000000000..a6a9f1aeb --- /dev/null +++ b/assets/js/f4fea690.cf767130.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4924],{6596:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"encoders/JM","title":"JM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/encoders/JM.mdx","sourceDirName":"encoders","slug":"/encoders/JM","permalink":"/docs/encoders/JM","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/JM.mdx","tags":[],"version":"current","sidebarPosition":17,"frontMatter":{"title":"JM","sidebar_position":17},"sidebar":"tutorialSidebar","previous":{"title":"HM","permalink":"/docs/encoders/HM"},"next":{"title":"aom-av1-lavish","permalink":"/docs/encoders/aom-av1-lavish"}}');var o=t(4848),r=t(8453);const s={title:"JM",sidebar_position:17},c="JM",a={},d=[];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"jm",children:"JM"})}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(n.p,{children:["JM is the original ",(0,o.jsx)(n.a,{href:"/docs/video/AVC",children:"H.264"})," reference encoder, predating alternatives like ",(0,o.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"}),". Since x264 became highly performant and perceptually driven, it joins other MPEG reference encoders such as ",(0,o.jsx)(n.a,{href:"/docs/encoders/HM",children:"HM"})," & ",(0,o.jsx)(n.a,{href:"/docs/encoders/VTM",children:"VTM"})," in their reputations for being highly niche offerings that are used rarely due to their usage complexity & speed disadvantages. x264 is generally more efficient than JM."]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4fea690.d2c6d21a.js b/assets/js/f4fea690.d2c6d21a.js deleted file mode 100644 index ee4197a1b..000000000 --- a/assets/js/f4fea690.d2c6d21a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4924],{278:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var i=t(4848),o=t(8453);const r={title:"JM",sidebar_position:17},s="JM",c={id:"encoders/JM",title:"JM",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/encoders/JM.mdx",sourceDirName:"encoders",slug:"/encoders/JM",permalink:"/docs/encoders/JM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/JM.mdx",tags:[],version:"current",sidebarPosition:17,frontMatter:{title:"JM",sidebar_position:17},sidebar:"tutorialSidebar",previous:{title:"HM",permalink:"/docs/encoders/HM"},next:{title:"aom-av1-lavish",permalink:"/docs/encoders/aom-av1-lavish"}},a={},d=[];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"jm",children:"JM"})}),"\n",(0,i.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(n.p,{children:["JM is the original ",(0,i.jsx)(n.a,{href:"/docs/video/AVC",children:"H.264"})," reference encoder, predating alternatives like ",(0,i.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"}),". Since x264 became highly performant and perceptually driven, it joins other MPEG reference encoders such as ",(0,i.jsx)(n.a,{href:"/docs/encoders/HM",children:"HM"})," & ",(0,i.jsx)(n.a,{href:"/docs/encoders/VTM",children:"VTM"})," in their reputations for being highly niche offerings that are used rarely due to their usage complexity & speed disadvantages. x264 is generally more efficient than JM."]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f81c1134.0751ef83.js b/assets/js/f81c1134.0751ef83.js new file mode 100644 index 000000000..441b87866 --- /dev/null +++ b/assets/js/f81c1134.0751ef83.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8130],{7735:t=>{t.exports=JSON.parse("{\"archive\":{\"blogPosts\":[{\"id\":\"svt-av1-third-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-third-deep-dive\",\"source\":\"@site/blog/2024-11-14-svt-av1-deep-dive3-v2-2-x.mdx\",\"title\":\"Better late than never: SVT-AV1 v2.2.x Deep Dive\",\"description\":\"How does SVT-AV1 2.2.x stack up against the encoder previous version?\",\"date\":\"2024-11-14T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"inline\":true,\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":77.835,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\",\"socials\":{},\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Better late than never: SVT-AV1 v2.2.x Deep Dive\",\"description\":\"How does SVT-AV1 2.2.x stack up against the encoder previous version?\",\"slug\":\"svt-av1-third-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-2.2.x-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"nextItem\":{\"title\":\"Codec Wiki: One Year Later\",\"permalink\":\"/blog/codec-wiki-one-year-later\"}},\"content\":\"import { CarouselGenerator, TabbedCarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\n\\n\\nSVT-AV1 v2.2.0 was released in late August and a minor version v2.2.1 followed suit to adress some bugs. This blog post will focus on comparing this new encoder version to the last, on the basis of benchmarks and visual comparisons. We will quantify the new trade-offs between compression efficiency and encoding speed, so you can choose the right balance for your projects. Our metrics of choice today will be SSIMULACRA2 and XPSNR, used in conjonction with a revised methodology.\\n\\n\x3c!--truncate--\x3e\\n\\n## Feedback\\n\\nThe biggest missed opportunity of the previous SVT-AV1 deep dives was the absence of visual comparisons. Indeed, metrics may be convenient for easily quantifying differences between encoder versions or encoding parameters, but they fail to give the information of how much these differences matter for your eyes. However, making properly useful visual comparisons isn't an easy task. Comparing two encodes of varying bitrates will bias the result against one or the other, which is not desirable. Figuring out the best way to present these comparisons and making the appropriate scripts took me weeks. Gathering all the necessary data, crafting the comparisons and proceeding to a double-checking pass took me another few weeks. These reasons explain why this blog post took so long to release, but I hope it will have been worth the wait! On that note though, I have been uploading thousands of png screenshots to *slow.pics* and I ended up rate-limited. This has prevented me from uploading the visual comparisons for preset 11, 12 and some of 10. I'm actively trying to fix this situation, so please understand. \\n\\nAnother reason for this taking so long was my decision to increase the amount of video samples while increasing the amount of CRF values tested. A grand total of 3682 encodes were done for this blog post alone, in the span of around two weeks, where my PC would be exclusively encoding 24/7. Send help.\\n\\nAlso, the graphs will now be using the harmonic mean instead of the arithmetic mean. Indeed, arithmetic mean scores fail to account for deviations and outliers. Using the harmonic mean implies low-scoring frames have more weight towards the final score, which adds a consistency component to the picture. That's not it though! Consistency is capital in an enjoyable watching experience. As such, each graph now possesses a SSIMULACRA2 (Harmonic) version, a XPSNR (Harmonic) version and a SSIMULACRA2 (Standard Deviation) version, in order to closely monitor variations in consistency between presets.\\n\\nLastly, the biggest complaint I have received is me exclusively using anime clips. The reason for that is pretty simple: I mostly encode anime content on my free time and am myself very little interested in other types of media. However, these blog posts have grown in exposure and I understand a majority of people is more concerned about the performance of encoders on live action content or gaming clips. Thus, this new blog post is comprised of 3 live action clips, 2 gaming clips and 2 anime clips! See the sacrifices I'm making for y'all?\\n\\n## Methodology\\n\\nThe resources provided will include both graphs and image comparisons. Graphs offer a straightforward, objective look at efficiency across encoder parameters, using metrics as benchmarks for performance. In contrast, image comparisons display actual samples from encoded files, allowing you to assess quality firsthand. This adds a subjective dimension to the comparisons, giving you a more nuanced understanding of each preset's impact on visual quality.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples with a wide range of content types, uncompressed to the y4m file format for ease of use. These lossless files are *directly* fed to SvtAv1EncApp, implying the performance of a single encoder instance is what's being measured here. A more serious AV1 encoding pipeline should probably be leveraging a chunked encoding approach, especially on higher core count systems. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2), XPSNR scores on the other hand are calculated using a [ffmpeg filter](https://github.com/fraunhoferhhi/xpsnr), and the data is then aggregated into a final Harmonic or Standard Deviation score to create the graphs for this benchmark. The Constant Rate Factor (CRF) is plotted against encoding time, and the metrics scores against encode size (bitrate). The former may represent the efficiency as defined by the speed achieved at a certain quality target. For the latter, Bits Per Pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the compression efficiency, normalized by resolution.\\n\\nHow to read the graphs? For the compression efficiency ones, the closer to the top left the better. For the encoding speed ones, the closer to the left the faster. For the standard deviation ones, the closer to the bottom left the better.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v2.1.2 and v2.2.1 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/) using Clang 18.1.8 and the provided `Build/linux/build.sh` script with the following command: `build.sh cc=clang cxx=clang++ jobs=$(nproc) enable-lto static native release`. The testing machine is comprised of an i3 12100 in its stock configuration, with 2x8GB of 3200MHz CL14 DDR4 RAM, in Arch Linux with kernel 6.9.12 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nI want to give a disclaimer concerning encoding speeds. Contrary to the efficiency results which should be reproducible independantly of the machine, measuring speed is a pretty difficult endeavor, with increased risks for errors. The performance numbers I mention may differ for you depending on the hardware configuration at hand.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples & Encoding Settings\\n\\nThe samples are as follows:\\n- 17s `Avatar The Way Of Water (trailer 3)` clip sourced from [thedigitaltheater.com](https://thedigitaltheater.com/category/movie-trailers/lossless-movie-trailers/) (1916x804p, 23.976fps).\\n- 6s `Ducks Take Off` clip sourced from [xiph.org](https://media.xiph.org/video/derf/) (1280x720p, 50fps).\\n- 3s `Fallout 4` clip sourced from another encoder fellow (1920x1080p, 60fps).\\n- 8s `Minecraft` clip sourced from [xiph.org](https://media.xiph.org/video/derf/) (1920x1080p, 60fps).\\n- 8s `Sol Levante` HDR clip sourced from [opencontent.netflix.com](http://download.opencontent.netflix.com/?prefix=SolLevante/) (3840x2160p, 24fps). This one is pretty educative as SVT-AV1's behavior isn't influenced by the existence (or lack thereof) of HDR metadata in a source.\\n- 21s `Suzume (trailer 2)` clip sourced from [thedigitaltheater.com](https://thedigitaltheater.com/category/movie-trailers/lossless-movie-trailers/) (1920x808p, 23.976fps).\\n- 13s `The Mandalorian (trailer 2)` clip sourced from [thedigitaltheater.com](https://thedigitaltheater.com/category/movie-trailers/lossless-movie-trailers/) (1920x800p, 23.976fps).\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 10` to `--crf 50`, by increments of 2, with the exception of preset -1 that uses increments of 4.**\\n\\n`--preset X --hierarchical-levels 4` are the only parameter used here, in conjunction with the CRF values. I have been asked to use `--hierarchical-levels 4` by fellow SVT-AV1-PSY developers to force smaller mini GOPs, more appropriate for testing.\\n\\nElse, the SVT-AV1 defaults were used. The ones worth mentioning are:\\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n## Visual comparisons\\n\\n![comp_showcase](/img/comp_showcase.webp)\\n\\nThroughout this blog post, you\u2019ll find *slow.pics* links that provide various visual comparisons between presets.\\n\\n- The \u201cfull\u201d links offer comparisons across the entire quality range for each source.\\n- The HQ (High Quality), MQ (Medium Quality), and LQ (Low Quality) links showcase more targeted comparisons. These have been carefully handcrafted to be as size-normalized as possible, given the available encodes. We want to be focusing on encodes with minimal bitrate deviation for a fair comparison.\\n\\nFeel free to double-check the bitrate of each frame or scene to make a more informed observation, keeping the size difference in mind when comparing the encodes.\\n\\nUse the arrow keys and numpad to navigate between screenshots. Alternatively, you can click on \\\"Slider comparison\\\" and select two sources if you prefer comparing this way.\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> 12)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 12`.**\\n> Just like in __v2.1.x__, preset 6 and 13 do not exist in __v2.2.x__ and are instead mapped to preset 7 and 12 respectively.\\n\\n### Efficiency\\n\\n- First of all, the complete efficiency graphs:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nYou may notice something odd going on with the Avatar results using XPSNR. I have tried to understand the cause, without success. For the remainder of this blog post, the Avatar XPSNR results will be omitted. I will continue investigating and aim to have a workaround in place for next time.\\n\\nAnyway, this graph may be impressive, but difficult to read. So let's analyse different quality targets.\\n\\n- The same graphs but focusing on the \\\"high quality\\\" range (CRF10 -> 22):\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Same, but now focusing on the \\\"medium quality\\\" range (CRF24 -> 36):\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- And lastly, focusing on the \\\"low quality\\\" range (CRF38 -> 50):\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- If we now focus on __presets 4__ and below, where it's more difficult to discern the differences between presets, we get this at \\\"high quality\\\":\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- This at \\\"medium quality\\\":\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- And the following at \\\"low quality\\\":\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n### Speed\\n\\n- **Let's now compare the speed of all presets:**\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nUnusable, right?\\n\\n- Then, here is what it looks like with a logarithmic scale:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n### Interpretation\\n\\nIt appears as if once again **preset 2** through **preset 4** remain the most balanced presets all-around in an efficient encoding scenario, with **preset 3** not offering much improvements over **preset 4** in average scores but nicely improving on consistency instead, and **preset 2** offering a nice efficiency and consistency uplift on top.\\n\\nIn this release again, the quality gap between **preset 2** and **preset 1** is pretty narrow, and the speed penalty from **preset 1** onward continuously increases, ending up close to ~2x. In comparison, the penalty of going from **preset 3** to **preset 2** is closer to ~1.5x. As such, using **preset 1** is entering placebo territory and it is usually not recommended to waste precious encoding resources on **preset 0** and **preset -1**. This especially applies at medium to high quality, though at extremely low quality targets, like the CRF40-50 range, we can still see appreciable gains from these placebo presets in some clips.\\n\\nAs for the faster presets, **presets 5 to 10** are usually grouped on the graphs focusing on average scores and the ones focusing on consistency. They tend to stand apart from their slower counterparts by just a bit. Though **preset 10** can be worryingly close to **preset 11** on some occasions. They are all viable for your real-time needs. The rule is the same as usual: **go the slowest you can bear that still achieves your goal!**\\n\\n**Presets 11 and 12** are especially inefficient and inconsistent, and to be avoided at all costs. If possible, forget they even exist, as it's probably better to use a comparably fast (or faster) competing codec. They could still be of use in a convex-hull scenario, but in the case of realtime transcoding, you will be better off with some hardware solution like the ones found in RTX 4000 or Arc GPUs.\\n\\n### TLDR\\n\\nThe same conclusions as the previous blog posts can be made: \\n**clear quality gains can be observed as we decrease presets, until __preset 2__, however the effectiveness of dropping presets is noticeably less and less important as quality is increased.**\\n\\n## SVT-AV1 v2.1.x vs v2.2.x presets comparisons:\\n\\nIn this section, we\u2019ll examine the efficiency and speed differences across presets when upgrading from SVT-AV1 2.1.x to 2.2.x. This comparison should bring a new level of nuance to our results, highlighting both incremental improvements and any notable shifts in performance.\\n\\nSVT-AV1 __v2.1.x__ brought some nice improvements over __v2.0.0__, but does __v2.2.x__ bring appreciable improvements in the presets trade-offs this time around as well? Let's find out!\\n\\n### `preset -1`: v2.1.x vs v2.2.x\\n\\n- **Let's start things off with the battle of the placebos, with the Compression efficiency & consistency at \\\"high to medium-ish quality\\\" (CRF10 -> 30):**\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Along with the Compression efficiency & consistency at \\\"medium-ish to low quality\\\" (CRF34 -> 50):\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nBasically no changes at all, except a slight regression on Minecraft.\\n\\n- What about their speeds though?:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nWell **preset -1** basically became 15 to 25% faster, not bad at all!\\n\\n- Preset -1 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/LdIsYSua), [Avatar (HQ)](https://slow.pics/c/19Oi8pWw), [Avatar (LQ)](https://slow.pics/c/4Ir6SG5S)\\n\\n[Ducks (full)](https://slow.pics/c/BpxD7oZd), [Ducks (HQ)](https://slow.pics/c/qBdzKUFm), [Ducks (LQ)](https://slow.pics/c/XFaep0lc)\\n\\n[Fallout (full)](https://slow.pics/c/EOIoOoAQ), [Fallout (HQ)](https://slow.pics/c/lPg9yLv9), [Fallout (LQ)](https://slow.pics/c/FquLoNSq)\\n\\n[Minecraft (full)](https://slow.pics/c/XRHmsQOw), [Minecraft (HQ)](https://slow.pics/c/ZCzJfBUC), [Minecraft (LQ)](https://slow.pics/c/P0VLDoMT)\\n\\n[Sol Levante (full)](https://slow.pics/c/AQC1xzLS), [Sol Levante (HQ)](https://slow.pics/c/BCVbL7w2), [Sol Levante (LQ)](https://slow.pics/c/UwSQfopm)\\n\\n[Suzume (full)](https://slow.pics/c/Ab6bkcpS), [Suzume (HQ)](https://slow.pics/c/W9KlRAts), [Suzume (LQ)](https://slow.pics/c/6yHhAeM5)\\n\\n[The Mandalorian (full)](https://slow.pics/c/BAF89tjA), [The Mandalorian (HQ)](https://slow.pics/c/DkkK3GYV), [The Mandalorian (LQ)](https://slow.pics/c/xmZmIEar)\\n\\n### `preset 0`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nEfficiency wise, this new **preset 0** is close to unchanged from the old **preset 0**, but its consistency improved slightly in a few clips at high quality and decreased in one clip at low quality.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 0**'s speed sees an improvement of about 20% at best. Overall, **preset 0** got a proper upgrade!\\n\\n- Preset 0 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/7n5bAB2d), [Avatar (HQ)](https://slow.pics/c/AHmNT8Pw), [Avatar (MQ)](https://slow.pics/c/VC6lZr6D), [Avatar (LQ)](https://slow.pics/c/97SAuLaO)\\n\\n[Ducks (full)](https://slow.pics/c/m9iPnqqW), [Ducks (HQ)](https://slow.pics/c/gBXawmpH), [Ducks (MQ)](https://slow.pics/c/7dRVJzXD), [Ducks (LQ)](https://slow.pics/c/qshRSgnZ)\\n\\n[Fallout (full)](https://slow.pics/c/aq9eTZf5), [Fallout (HQ)](https://slow.pics/c/xu99HM0j), [Fallout (MQ)](https://slow.pics/c/eC0gzO7y), [Fallout (LQ)](https://slow.pics/c/pB9Ps3a6)\\n\\n[Minecraft (full)](https://slow.pics/c/aWbIxmgr), [Minecraft (HQ)](https://slow.pics/c/3jVGagWZ), [Minecraft (MQ)](https://slow.pics/c/MlYl7i4e), [Minecraft (LQ)](https://slow.pics/c/7MImyYc0)\\n\\n[Sol Levante (full)](https://slow.pics/c/SmDGEAPx), [Sol Levante (HQ)](https://slow.pics/c/ZiCgjlxE), [Sol Levante (MQ)](https://slow.pics/c/4GbaSzv6), [Sol Levante (LQ)](https://slow.pics/c/EPTFWHQI)\\n\\n[Suzume (full)](https://slow.pics/c/oVZqCWsl), [Suzume (HQ)](https://slow.pics/c/LqadqVGG), [Suzume (MQ)](https://slow.pics/c/TnD6CAyF), [Suzume (LQ)](https://slow.pics/c/CDuu3SOK)\\n\\n[The Mandalorian (full)](https://slow.pics/c/x8Sot0wg), [The Mandalorian (HQ)](https://slow.pics/c/idbPz3uh), [The Mandalorian (MQ)](https://slow.pics/c/OpFzXtjr), [The Mandalorian (LQ)](https://slow.pics/c/3d8gpuoo)\\n\\n### `preset 1`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 1** is mostly unchanged but sees another slight regression in Minecraft at high quality.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nDepending on the clip, speed is mostly unchanged or ever so slighty improved. **Preset 1** is a bit stagnant this release.\\n\\n- Preset 1 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/BnOX37oJ), [Avatar (HQ)](https://slow.pics/c/bWjBtTyR), [Avatar (MQ)](https://slow.pics/c/6UQKyNac), [Avatar (LQ)](https://slow.pics/c/NpyxU3uF)\\n\\n[Ducks (full)](https://slow.pics/c/KVX4piAj), [Ducks (HQ)](https://slow.pics/c/EsEpbKVY), [Ducks (MQ)](https://slow.pics/c/8AxTTvKw), [Ducks (LQ)](https://slow.pics/c/ZgW8715d)\\n\\n[Fallout (full)](https://slow.pics/c/xQprIMbB), [Fallout (HQ)](https://slow.pics/c/qRvBez7k), [Fallout (MQ)](https://slow.pics/c/taXnNGUx), [Fallout (LQ)](https://slow.pics/c/s6fbIqvr)\\n\\n[Minecraft (full)](https://slow.pics/c/cE86n2Gb), [Minecraft (HQ)](https://slow.pics/c/eOyUxHhq), [Minecraft (MQ)](https://slow.pics/c/tKPYsd9K), [Minecraft (LQ)](https://slow.pics/c/evfzJDjc)\\n\\n[Sol Levante (full)](https://slow.pics/c/BSzecR9N), [Sol Levante (HQ)](https://slow.pics/c/mWIoU45b), [Sol Levante (MQ)](https://slow.pics/c/geYXLoIY), [Sol Levante (LQ)](https://slow.pics/c/QzSjaYXF)\\n\\n[Suzume (full)](https://slow.pics/c/pBVidgiB), [Suzume (HQ)](https://slow.pics/c/5KtTXd3q), [Suzume (MQ)](https://slow.pics/c/lb0yMDhZ), [Suzume (LQ)](https://slow.pics/c/TipcRRJr)\\n\\n[The Mandalorian (full)](https://slow.pics/c/4ouGFV9s), [The Mandalorian (HQ)](https://slow.pics/c/oxPNsHdU), [The Mandalorian (MQ)](https://slow.pics/c/EPju5ULC), [The Mandalorian (LQ)](https://slow.pics/c/e58LmgFm)\\n\\n### `preset 2`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 2**'s efficiency has regressed at high quality on some clips, improved in some and stayed the same in others. Except in one clip, consistency seems to have improved all around. At low to medium quality targets, efficiency is mostly unchanged, same for consistency. Not exactly noteworthy.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nSpeed was improved by about 10-20%. Not a bad showcase, for sure.\\n\\n- Preset 2 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/CJg3dsFg), [Avatar (HQ)](https://slow.pics/c/71wpH5eB), [Avatar (MQ)](https://slow.pics/c/AN0syhNv), [Avatar (LQ)](https://slow.pics/c/NRocyEay)\\n\\n[Ducks (full)](https://slow.pics/c/NyGfMRpQ), [Ducks (HQ)](https://slow.pics/c/OAqs5b8k), [Ducks (MQ)](https://slow.pics/c/tQSF50Ro), [Ducks (LQ)](https://slow.pics/c/gJjm3BGl)\\n\\n[Fallout (full)](https://slow.pics/c/snQuTi1f), [Fallout (HQ)](https://slow.pics/c/0rLG3TUT), [Fallout (MQ)](https://slow.pics/c/MMX6DgNz), [Fallout (LQ)](https://slow.pics/c/lwoIkLfm)\\n\\n[Minecraft (full)](https://slow.pics/c/5OYsrhGY), [Minecraft (HQ)](https://slow.pics/c/kCwbA7Ir), [Minecraft (MQ)](https://slow.pics/c/1nnyrvjD), [Minecraft (LQ)](https://slow.pics/c/F1RTfQf7)\\n\\n[Sol Levante (full)](https://slow.pics/c/xduJGoTU), [Sol Levante (HQ)](https://slow.pics/c/8SdKLegQ), [Sol Levante (MQ)](https://slow.pics/c/uHNR7DNz), [Sol Levante (LQ)](https://slow.pics/c/wgZgH7w6)\\n\\n[Suzume (full)](https://slow.pics/c/zC4AEMLt), [Suzume (HQ)](https://slow.pics/c/kGip9wuY), [Suzume (MQ)](https://slow.pics/c/aoQ0m9ms), [Suzume (LQ)](https://slow.pics/c/7ZMT3inc)\\n\\n[The Mandalorian (full)](https://slow.pics/c/8BKkJ4du), [The Mandalorian (HQ)](https://slow.pics/c/XQeD7vfY), [The Mandalorian (MQ)](https://slow.pics/c/6rQMASQR), [The Mandalorian (LQ)](https://slow.pics/c/Jl2Fh5wE)\\n\\n### `preset 3`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nPractically, it's a wash.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nStill, **preset 3** got slightly faster, I'm happy to report this is a speedup!\\n\\n- Preset 3 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/Vql4MJWQ), [Avatar (HQ)](https://slow.pics/c/Iuqp0Zbz), [Avatar (MQ)](https://slow.pics/c/MuTOEHE9), [Avatar (LQ)](https://slow.pics/c/poiDDJRQ)\\n\\n[Ducks (full)](https://slow.pics/c/mqWOgsYF), [Ducks (HQ)](https://slow.pics/c/16L6HyaH), [Ducks (MQ)](https://slow.pics/c/KaoPy7ae), [Ducks (LQ)](https://slow.pics/c/0L84OWnI)\\n\\n[Fallout (full)](https://slow.pics/c/JuXAjSY6), [Fallout (HQ)](https://slow.pics/c/mR5rJfsU), [Fallout (MQ)](https://slow.pics/c/Zpy7Hzds), [Fallout (LQ)](https://slow.pics/c/GeQrpfhp)\\n\\n[Minecraft (full)](https://slow.pics/c/rBCbaJkx), [Minecraft (HQ)](https://slow.pics/c/AJHQ4KNL), [Minecraft (MQ)](https://slow.pics/c/MYLA8KPH), [Minecraft (LQ)](https://slow.pics/c/aEMnRk7D)\\n\\n[Sol Levante (full)](https://slow.pics/c/F7rmPiaW), [Sol Levante (HQ)](https://slow.pics/c/PYO4K4sy), [Sol Levante (MQ)](https://slow.pics/c/viWYsgX7), [Sol Levante (LQ)](https://slow.pics/c/4NBaUoEX)\\n\\n[Suzume (full)](https://slow.pics/c/d15XbowQ), [Suzume (HQ)](https://slow.pics/c/eS6EQKng), [Suzume (MQ)](https://slow.pics/c/IJtLW35Z), [Suzume (LQ)](https://slow.pics/c/zf352iox)\\n\\n[The Mandalorian (full)](https://slow.pics/c/UrAekqg6), [The Mandalorian (HQ)](https://slow.pics/c/WWgygRS4), [The Mandalorian (MQ)](https://slow.pics/c/ry5sPqmB), [The Mandalorian (LQ)](https://slow.pics/c/6wI4wexZ)\\n\\n### `preset 4`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 4** sees a consistent though small improvement in average scores and standard deviation accross the entire quality range on basically all clips.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nUnfortunately, it got slower as a result. If you remember, **v2.1.0** did the exact contrary over **v2.0.0**, I wonder if **preset 4** simply took back the place it previously had...\\n\\n- Preset 4 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/ArdO4K7R), [Avatar (HQ)](https://slow.pics/c/88ikqaZn), [Avatar (MQ)](https://slow.pics/c/rM6LRBg0), [Avatar (LQ)](https://slow.pics/c/ofmHWCkv)\\n\\n[Ducks (full)](https://slow.pics/c/HVkqo5G3), [Ducks (HQ)](https://slow.pics/c/w44DNiqe), [Ducks (MQ)](https://slow.pics/c/GlRLCaBt), [Ducks (LQ)](https://slow.pics/c/Lkzi1VBU)\\n\\n[Fallout (full)](https://slow.pics/c/44jtBEqw), [Fallout (HQ)](https://slow.pics/c/G9YPifBb), [Fallout (MQ)](https://slow.pics/c/86m4exaw), [Fallout (LQ)](https://slow.pics/c/m4KHBihZ)\\n\\n[Minecraft (full)](https://slow.pics/c/n9OP2sht), [Minecraft (HQ)](https://slow.pics/c/JohJ3MzJ), [Minecraft (MQ)](https://slow.pics/c/e6b8R24h), [Minecraft (LQ)](https://slow.pics/c/xNwNlmAG)\\n\\n[Sol Levante (full)](https://slow.pics/c/vB7ndGZI), [Sol Levante (HQ)](https://slow.pics/c/R5uENbD5), [Sol Levante (MQ)](https://slow.pics/c/i7eV72sl), [Sol Levante (LQ)](https://slow.pics/c/zUMYarNf)\\n\\n[Suzume (full)](https://slow.pics/c/rgmuB5xB), [Suzume (HQ)](https://slow.pics/c/y9rxWVre), [Suzume (MQ)](https://slow.pics/c/4GhRL8gZ), [Suzume (LQ)](https://slow.pics/c/F3Hq8V9z)\\n\\n[The Mandalorian (full)](https://slow.pics/c/3BAR5P80), [The Mandalorian (HQ)](https://slow.pics/c/s2xzApJd), [The Mandalorian (MQ)](https://slow.pics/c/Ihjks1JO), [The Mandalorian (LQ)](https://slow.pics/c/JjGKUO1r)\\n\\n### `preset 5`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nBoth metrics say **preset 5** regressed slightly to moderately, though surprisingly its consistency is basically unchanged.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe result of this regression is an impressive speedup of up to 25%.\\n\\n- Preset 5 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/Lc8HjJBK), [Avatar (HQ)](https://slow.pics/c/r3gJkCv3), [Avatar (MQ)](https://slow.pics/c/k2TwNLHN), [Avatar (LQ)](https://slow.pics/c/cMlNo17a)\\n\\n[Ducks (full)](https://slow.pics/c/X4EZFJcM), [Ducks (HQ)](https://slow.pics/c/zKLphp19), [Ducks (MQ)](https://slow.pics/c/dYs1snV3), [Ducks (LQ)](https://slow.pics/c/JFtne5WV)\\n\\n[Fallout (full)](https://slow.pics/c/9ye1q9Rm), [Fallout (HQ)](https://slow.pics/c/zhEuOjRc), [Fallout (MQ)](https://slow.pics/c/YmZ3aRLO), [Fallout (LQ)](https://slow.pics/c/9ye1q9Rm)\\n\\n[Minecraft (full)](https://slow.pics/c/kyjcJWxt), [Minecraft (HQ)](https://slow.pics/c/UTWgYc3P), [Minecraft (MQ)](https://slow.pics/c/FtOxX3RH), [Minecraft (LQ)](https://slow.pics/c/jNyqLPgP)\\n\\n[Sol Levante (full)](https://slow.pics/c/ipyfREjA), [Sol Levante (HQ)](https://slow.pics/c/73V8CGKk), [Sol Levante (MQ)](https://slow.pics/c/z8P9UokS), [Sol Levante (LQ)](https://slow.pics/c/OPwerF86)\\n\\n[Suzume (full)](https://slow.pics/c/xfsYGM5C), [Suzume (HQ)](https://slow.pics/c/dL2J923D), [Suzume (MQ)](https://slow.pics/c/OhZNMzjx), [Suzume (LQ)](https://slow.pics/c/XFCnEebJ)\\n\\n[The Mandalorian (full)](https://slow.pics/c/xrO227rQ), [The Mandalorian (HQ)](https://slow.pics/c/m7Yky6EK), [The Mandalorian (MQ)](https://slow.pics/c/pN0cH6Yn), [The Mandalorian (LQ)](https://slow.pics/c/vB9zK9iz)\\n\\n### ~~`preset 6`: v2.1.x vs v2.2.x~~\\n\\n**Preset 6** is mapped to **preset 7** in **v2.2.x**.\\n\\n### `preset 7`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 7** is close to unchanged in **v2.2.x**.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nIt still got some slight to moderate speedups though, which can be appreciated.\\n\\n- Preset 7 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/YtvMG9X6), [Avatar (HQ)](https://slow.pics/c/P0gF7nbQ), [Avatar (MQ)](https://slow.pics/c/syT6uiVt), [Avatar (LQ)](https://slow.pics/c/zkkv1ePp)\\n\\n[Ducks (full)](https://slow.pics/c/pyVQmAWj), [Ducks (HQ)](https://slow.pics/c/eXSNnqV7), [Ducks (MQ)](https://slow.pics/c/ja7d0sFU), [Ducks (LQ)](https://slow.pics/c/JCTFfcMu)\\n\\n[Fallout (full)](https://slow.pics/c/S6SbCW8x), [Fallout (HQ)](https://slow.pics/c/bWCLQWwV), [Fallout (MQ)](https://slow.pics/c/hvauusst), [Fallout (LQ)](https://slow.pics/c/04LVSbGD)\\n\\n[Minecraft (full)](https://slow.pics/c/mh8VUfrO), [Minecraft (HQ)](https://slow.pics/c/P0pIx6XP), [Minecraft (MQ)](https://slow.pics/c/vnrXVajs), [Minecraft (LQ)](https://slow.pics/c/8WKQdw2N)\\n\\n[Sol Levante (full)](https://slow.pics/c/kH9LcEzG), [Sol Levante (HQ)](https://slow.pics/c/1DWCNq2B), [Sol Levante (MQ)](https://slow.pics/c/clxjB7Uw), [Sol Levante (LQ)](https://slow.pics/c/52wLF7NR)\\n\\n[Suzume (full)](https://slow.pics/c/3VlVk3O9), [Suzume (HQ)](https://slow.pics/c/FKel5bhI), [Suzume (MQ)](https://slow.pics/c/XXiyyCNN), [Suzume (LQ)](https://slow.pics/c/rrBoua68)\\n\\n[The Mandalorian (full)](https://slow.pics/c/unxuKHEK), [The Mandalorian (HQ)](https://slow.pics/c/GMXnxSdA), [The Mandalorian (MQ)](https://slow.pics/c/v8wSN90W), [The Mandalorian (LQ)](https://slow.pics/c/fswh5kCT)\\n\\n### `preset 8`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe efficiency and consistency of **preset 8** has improved at high quality.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nAnd we can observe a speed increase of around 10%. Some crazy speed deviations can be noticed in Sol Levante. \\n\\n- Preset 8 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/8tKOAvGN), [Avatar (HQ)](https://slow.pics/c/YLWgqmxU), [Avatar (MQ)](https://slow.pics/c/pDg4gLry), [Avatar (LQ)](https://slow.pics/c/ADFSsXmP)\\n\\n[Ducks (full)](https://slow.pics/c/ug0TVcoF), [Ducks (HQ)](https://slow.pics/c/WiDmtcVZ), [Ducks (MQ)](https://slow.pics/c/ERVfuYHH), [Ducks (LQ)](https://slow.pics/c/I0N97rQw)\\n\\n[Fallout (full)](https://slow.pics/c/MqVzmFIi), [Fallout (HQ)](https://slow.pics/c/jUoB0PGo), [Fallout (MQ)](https://slow.pics/c/hXGIfwVj), [Fallout (LQ)](https://slow.pics/c/QUy3iX2H)\\n\\n[Minecraft (full)](https://slow.pics/c/frkuJR97), [Minecraft (HQ)](https://slow.pics/c/GayEkyrn), [Minecraft (MQ)](https://slow.pics/c/S36Ha8LP), [Minecraft (LQ)](https://slow.pics/c/lxoYsv8k)\\n\\n[Sol Levante (full)](https://slow.pics/c/YupMFGeu), [Sol Levante (HQ)](https://slow.pics/c/evfWqxZ9), [Sol Levante (MQ)](https://slow.pics/c/Juh027Eq), [Sol Levante (LQ)](https://slow.pics/c/ETPf9ppU)\\n\\n[Suzume (full)](https://slow.pics/c/oeFUWMHd), [Suzume (HQ)](https://slow.pics/c/01vzYfnq), [Suzume (MQ)](https://slow.pics/c/BIL4g7zk), [Suzume (LQ)](https://slow.pics/c/boxyyeZN)\\n\\n[The Mandalorian (full)](https://slow.pics/c/57M6RHM0), [The Mandalorian (HQ)](https://slow.pics/c/8WJcnZfU), [The Mandalorian (MQ)](https://slow.pics/c/M7q5PYz8), [The Mandalorian (LQ)](https://slow.pics/c/ctoke6p1)\\n\\n### `preset 9`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nEfficiency and consistency stayed mostly the same.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nSpeed improved by a few percents at most. **Preset 9** has stagnated over **v2.1.x**.\\n\\n- Preset 9 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/P3zZKVF0), [Avatar (HQ)](https://slow.pics/c/sL4HPZLa), [Avatar (MQ)](https://slow.pics/c/QOxyI9h0), [Avatar (LQ)](https://slow.pics/c/RfLKIRjj)\\n\\n[Ducks (full)](https://slow.pics/c/aj6SVcIZ), [Ducks (HQ)](https://slow.pics/c/UpnejngN), [Ducks (MQ)](https://slow.pics/c/KJRzl3FY), [Ducks (LQ)](https://slow.pics/c/4mMq9sz3)\\n\\n[Fallout (full)](https://slow.pics/c/vHqlIJBK), [Fallout (HQ)](https://slow.pics/c/XHoe9Udp), [Fallout (MQ)](https://slow.pics/c/tukibDud), [Fallout (LQ)](https://slow.pics/c/cV57jRF9)\\n\\n[Minecraft (full)](https://slow.pics/c/XRT1OYnX), [Minecraft (HQ)](https://slow.pics/c/HqtoRlvV), [Minecraft (MQ)](https://slow.pics/c/Ml2rLjvO), [Minecraft (LQ)](https://slow.pics/c/EGCsqcSl)\\n\\n[Sol Levante (full)](https://slow.pics/c/8URvlnba), [Sol Levante (HQ)](https://slow.pics/c/jPFT5hMG), [Sol Levante (MQ)](https://slow.pics/c/92EZO3U3), [Sol Levante (LQ)](https://slow.pics/c/bWgcvUtj)\\n\\n[Suzume (full)](https://slow.pics/c/yA2y0v92), [Suzume (HQ)](https://slow.pics/c/pAPBbl7r), [Suzume (MQ)](https://slow.pics/c/7hTvbMy1), [Suzume (LQ)](https://slow.pics/c/arrDGAd9)\\n\\n[The Mandalorian (full)](https://slow.pics/c/KQHqkAVZ), [The Mandalorian (HQ)](https://slow.pics/c/UzdN0rSC), [The Mandalorian (MQ)](https://slow.pics/c/dxKpfcvs), [The Mandalorian (LQ)](https://slow.pics/c/FPJAf74J)\\n\\n### `preset 10`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 10** received the most efficiency and consistency improvements out of all presets in this release. What will be the cost of such drastic change though?\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nWell, not that much all things considered! **Preset 10**'s speed did decrease from barely anything to 20% in the most extreme situation, but its improvements well outshine its speed regression. Overall, **preset 11** went from borderline unusable to becoming an interesting new fast real-time preset. This is pretty huge in my opinion, as it offers a new kind of trade-off no other AV1 encoder or prior SVT-AV1 versions did.\\n\\n- Preset 10 visual comparisons:\\n\\n[Avatar (full)](https://slow.pics/c/8GjtQQAm), [Avatar (HQ)](https://slow.pics/c/FriwG6rw), [Avatar (MQ)](https://slow.pics/c/vqau9jk1), [Avatar (LQ)](https://slow.pics/c/WQTbcWvH)\\n\\n[Ducks (full)](https://slow.pics/c/xYotraaP), [Ducks (HQ)](https://slow.pics/c/HHlwCvwc), [Ducks (MQ)](https://slow.pics/c/bgV6MoQz), [Ducks (LQ)](https://slow.pics/c/bOAyMVUk)\\n\\n[Fallout (full)](https://slow.pics/c/MrYTMHoQ), [Fallout (HQ)](https://slow.pics/c/qL9xmCfI), [Fallout (MQ)](https://slow.pics/c/dwdE0pWt), [Fallout (LQ)](https://slow.pics/c/uo7Ztb5f)\\n\\n[Minecraft (full)](https://slow.pics/c/fICToF3E), [Minecraft (HQ)](https://slow.pics/c/cGBhBsaS), [Minecraft (MQ)](https://slow.pics/c/w1P4LAu5), [Minecraft (LQ)](https://slow.pics/c/rNqRWd61)\\n\\n[Sol Levante (full)](https://slow.pics/c/UyMpDhx0), [Sol Levante (HQ)](https://slow.pics/c/b0B7ndsZ), [Sol Levante (MQ)](https://slow.pics/c/3H4ewpMI), [Sol Levante (LQ)](https://slow.pics/c/wpCnz72u)\\n\\n[Suzume (full)](https://slow.pics/c/ZYoFdtdS), [Suzume (HQ)](https://slow.pics/c/L2z8yEd5), ~~Suzume (MQ)~~, ~~Suzume (LQ)~~\\n\\n[The Mandalorian (full)](https://slow.pics/c/NhYFWBzc), ~~The Mandalorian (HQ)~~, ~~The Mandalorian (MQ)~~, ~~The Mandalorian (LQ)~~\\n\\n### `preset 11`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe new **preset 11** places itself between the old **preset 11** and the old **preset 12** efficiency and consistency wise. \\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nUnsurprisingly, its speed is also in-between the old **preset 11** and the old **preset 12**. I'm unsure this new trade-off helps in anything.\\n\\n### `preset 12`: v2.1.x vs v2.2.x\\n\\n- Compression efficiency & consistency graphs, high quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, medium quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Compression efficiency & consistency graphs, low quality range:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n stddev: {\\n label: 'STD DEV',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 12** is almost unchanged from the previous release.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nSame speed wise. So, no improvements at all for the two fastest presets. They remain all around very bad performers. In hindsight, it doesn't matter that I couldn't upload the **preset 11 & 12** visual comparisons, because there is literally nothing to see.\\n\\n### ~~`preset 13`: v2.1.x vs v2.2.x~~\\n\\n**Preset 13** is mapped to **preset 12** in **v2.2.x**.\\n\\n### TLDR\\n\\nWith **v2.2.x**, we observed new efficiency/speed trade-offs for a good amount of presets.\\nSome presets, like **-1** and **0**, received significant speed improvements at no efficiency cost. **Presets 3 and 7** received more reasonable speedups. **Presets 2, 8 and 11** have seen new trade-offs that are mostly beneficial. **Preset 10** was deeply revamped and replaces **preset 9** in my book as the fastest, still viable, real-time preset. **Preset 4** seems to have returned to the state it was in **v2.0.0**. On the other hand, **preset 5** seemed to have regressed slightly, and **presets 1, 9 and 12** are basically unchanged from **v2.1.x**.\\n\\n## Conclusion\\n\\nThe release of SVT-AV1 **v2.2.x** brings some welcome speed improvements. **Presets 2 through 4** continue to lead in efficiency for AV1 encoding, delivering top-tier quality and compression. Meanwhile, **presets 5 through 10** offer solid alternatives for those who find **presets 2 through 4** too slow, balancing quality with noticeably faster encoding times.\\n\\nHopefully, this comprehensive third deep dive has given you a helpful starting point for choosing settings when encoding with ~~the latest~~ SVT-AV1(-PSY) v2.2.x.\\n\\n## Future\\n\\nOnce more, this testing focused on establishing the new presets dynamics, however I haven't revisited the different SVT-AV1 parameters since **v1.8.0**. A few meaningful features have been added since, like variance boost, and with this overhauled methodology, the conclusion made in that blog post may be different now. I think it will be worth to revisit this in the future, maybe in the next blog post for **v2.3.0**? \\nYes, I'm fully aware I'm late because **v2.3.0** has already been out for two whole weeks. Even if the frontend of this blog post doesn't seem to have radically changed, my entire workflow has tremendously evolved since last time. It may have taken me since mid-August to manage to complete this blog post, but my efforts should allow me to produce a follow-up faster.\\n\\nI am conscious of this blog post's limitations. First of all, I observed some odd behaviors from XPSNR on certain clips which I haven't been able to pinpoint yet. It would also give me nonsensical standard deviation results, which is the reason why only the standard deviation in SSIMU2 scores was given. Second of all, SVT-AV1's own behavior starts to get messy when you approach the SSIMULACRA2 0 score, rendering all the data in that region pretty much useless. Plus, aggregating these metrics scores take forever, so I'm looking into ways to accelerate the process, for instance by offloading the work to my GPU using [turbo-metrics](https://github.com/Gui-Yom/turbo-metrics). Also, I'm stuck between wanting to increase the amount of data points in each graphs to get more detailed results and having to keep everything readable. This time around I had to seperate each graph into three quality levels, but that's already too much for my liking. I will look into improving myself on the data presentation front. I feel like I have to streamline this formula to make it more digestible for everyone.\\n\\nPlease, I'm open to **your** remarks and suggestions to improve on this blog post formula.\\n\\nThat said, here are my plans for future blog posts:\\n- a follow-up v2.3.0 article that also revisits the useful SVT-AV1 parameters. *__I'm planning for this to release before 2025.__*\\n- an article focused on giving you encoding tips and explaining common AV1 encoding knowlegde is still planned for *someday*.\\n- a *future* article focused on observing the evolution of all software AV1 encoders since the beginning of their development, as well as comparisons with vpxenc, AVM (development ground for AV2) and VVenC.\\n- and many more...\\n\\nThanks for reading!\\n\\n*Support me by making a donation on [my Ko-Fi page](https://ko-fi.com/nekotrix), as a reward for my efforts and to compensate for the electricity bills of two whole weeks of non-stop encoding.*\\n\\n{}\"},{\"id\":\"codec-wiki-one-year-later\",\"metadata\":{\"permalink\":\"/blog/codec-wiki-one-year-later\",\"source\":\"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx\",\"title\":\"Codec Wiki: One Year Later\",\"description\":\"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.\",\"date\":\"2024-07-20T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"anniversary\",\"permalink\":\"/blog/tags/anniversary\"},{\"inline\":true,\"label\":\"history\",\"permalink\":\"/blog/tags/history\"}],\"readingTime\":3.785,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"socials\":{},\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Codec Wiki: One Year Later\",\"description\":\"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.\",\"slug\":\"codec-wiki-one-year-later\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"anniversary\",\"history\"],\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Better late than never: SVT-AV1 v2.2.x Deep Dive\",\"permalink\":\"/blog/svt-av1-third-deep-dive\"},\"nextItem\":{\"title\":\"AV1 for Dummies\",\"permalink\":\"/blog/av1-for-dummies\"}},\"content\":\"Around a month ago, Codec Wiki celebrates it's very first anniversary as it officially hits one year old (Wow, that's a very long time!).\\r\\n\\r\\n\x3c!--truncate--\x3e\\r\\n\\r\\nFirst and foremost, I apologize for this delayed celebration post, I have been very busy for the past month, y'know, real life things. Second of all, I would like to say **THANK YOU** for everyone who helped build this wiki from the ground up and writing down the entries, you know who you are!\\r\\n\\r\\n## Stats\\r\\n\\r\\nThanks to everyone's efforts, over the course of 12 months Codec Wiki has grown into the (almost) go-to documentation and guide for newcomers just starting out in the quirky and wild world of multimedia encoding. So here are some pretty graphs to look at our progress so far!\\r\\n\\r\\n### Plausible\\r\\n\\r\\nAs you may know, we run our own Plausible Analytics instance. Which is a self-hosted, open source, and privacy-respecting analytics. Currently hosted in Singapore and available for everyone to view [here](https://analytics.x266.mov/wiki.x266.mov).\\r\\n\\r\\n\\r\\n \\r\\n \\\"Plausible\\r\\n\\r\\n\\r\\n7.7K unique total visitors for a whole year may not be much but it's a great start!\\r\\n\\r\\nLet's not forget those who use uBlock Origin or similar to block the analytics script. So the visitor count could be two or three times more!\\r\\n\\r\\n\\r\\n### Google Search Console\\r\\n\\r\\nFor those who are unfamiliar, Google Search Console is used for viewing well.. Google search data for your website. This data is unfortunately private and only the owner and those invited can see the data, no setting available for public view. Probably for the better.\\r\\n\\r\\n\\r\\n \\r\\n \\\"Google\\r\\n\\r\\n



\\r\\n\\r\\nAnd for our top 10 search queries in the last 28 days:\\r\\n\\r\\n\\r\\n \\r\\n \\\"Search\\r\\n\\r\\n\\r\\n \\r\\n \\\"Search\\r\\n\\r\\n



\\r\\n\\r\\nWith pretty much zero competition in this niche of a market, it skyrocketed Codec Wiki to the top of search results for everything multimedia related \ud83d\ude05.\\r\\n\\r\\n\\r\\n## A Brief History\\r\\n\\r\\nAround a year ago, I started work on an unofficial \\\"wiki\\\" for all things encoding, it initially started as a half-serious joke because I was annoyed there were no good documentation available\\r\\nanywhere on the internet on the real application and usage of encoders such as \\\"Should I use tune SSIM in x encoder?\\\". With the search results you'll be presented with being one or more of these:\\r\\n\\r\\n- Doesn't exist.\\r\\n- Mentioned in the FFmpeg mailing list but nothing else.\\r\\n- PDF research papers on IEEE and similar.\\r\\n- Outdated information on Doom9 or Multimedia Wiki.\\r\\n- \\\"The documentation are in the code blocks\\\".\\r\\n- Link rot.\\r\\n- Abandoned, or mostly focused on other topics.\\r\\n- Focused on a specific type of storytelling medium.\\r\\n- Actual good explanation in an old forgotten site (rare).\\r\\n\\r\\nSome or maybe even most of these results still appear up to this day.\\r\\n\\r\\n\\r\\nFrustrated with how scarce information is available on the open internet and combined with the fact that most, if not all of them only exist in non-search-engine-reachable private chat communities such as Discord where you'll have to join and scroll around older conversations.\\r\\n\\r\\nProne to data erasure as Discord can nuke these servers for whatever reason they please and years of \\\"documentation\\\" is lost in an instant. It is simply not a good platform for a plethora of valuable information.\\r\\n\\r\\n**That's why I took initiative.**\\r\\n\\r\\n\\r\\n## Bumps in the Road\\r\\n\\r\\nThere were also generally a lot of distrust and pushbacks when this project first began, particularly from those who are more experienced with encoding. Which is understandable because everyone who attempted before burned out and never finished it.\\r\\n\\r\\nBut Codec Wiki stood the test of time with constant updates through active collaboration of everyone involved, nowadays those voices have mostly subsided or even joined the project themselves. And I am grateful for that.\\r\\n\\r\\n\\r\\n## Closing Statement\\r\\n\\r\\nOnce again, **THANK YOU VERY MUCH** for those who are involved in this project and making the once pipe dream of a one-stop-shop user-friendly documentation for encoding into something that's possible.\\r\\n\\r\\nLet's continue documenting the most crucial yet invisible driving force of internet traffic, pages by pages.\\r\\n\\r\\nTogether we are strong, divided we burn out.\\r\\n\\r\\n\\r\\n

\\r\\n> \\\"There are times when a critic truly risks something, and that is the discovery and defense of the *new*. **The world is often unkind to new talent, new creations. The new needs friends**.\\\"\\r\\n>\\r\\n> \u2014 Anton Ego\"},{\"id\":\"av1-for-dummies\",\"metadata\":{\"permalink\":\"/blog/av1-for-dummies\",\"source\":\"@site/blog/2024-06-24-av1-for-dummies-2.mdx\",\"title\":\"AV1 for Dummies\",\"description\":\"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.\",\"date\":\"2024-06-24T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":16.645,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"socials\":{},\"key\":null,\"page\":null},{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"socials\":{},\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"AV1 for Dummies\",\"description\":\"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.\",\"slug\":\"av1-for-dummies\",\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"},{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"video\",\"compression\"],\"image\":\"/img/av1_for_dummies_guide.jpg\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Codec Wiki: One Year Later\",\"permalink\":\"/blog/codec-wiki-one-year-later\"},\"nextItem\":{\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"permalink\":\"/blog/svt-av1-second-deep-dive\"}},\"content\":\"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.\\n\\n\x3c!--truncate--\x3e\\n\\n![Compare](/img/av1_for_dummies_guide.avif)\\n\\n## Introduction\\n\\n[AV1](https://wiki.x266.mov/docs/video/AV1) is a royalty-free video codec developed by the Alliance for Open Media. It is designed to replace [VP9](https://wiki.x266.mov/docs/video/VP9) and presently competes with [H.266](https://wiki.x266.mov/docs/video/VVC). AV1 is known for its high compression efficiency, which the marketing will have you believe reduces file sizes by up to 50% compared to [H.264](https://wiki.x266.mov/docs/video/AVC) and up to 30% compared to [H.265](https://wiki.x266.mov/docs/video/HEVC) across the board. It is supported by several major browsers and is widely used across many streaming services and video platforms.\\n\\n### Why AV1?\\n\\nBefore we dive in, it is important to understand *why* you may want to use AV1 instead of other codecs. The reality is that AV1 is *not* better than H.264/5 in every single scenario; video encoding is a complicated field, and the best codec for you will depend on your specific needs. AV1 excels in:\\n- Low to medium-high fidelity encoding\\n- Higher resolution encoding\\n- Encoding content with very little grain or noise\\n- Slow, non-realtime contexts (e.g. offline encoding)\\n\\nThe enumeration above still consists of broad strokes, but the point is to understand that AV1 is not a silver bullet. It will not automatically make your videos smaller while preserving your desired quality. To make things more difficult, the [x264](https://wiki.x266.mov/docs/encoders/x264) & [x265](https://wiki.x266.mov/docs/encoders/x265) encoders are very mature, while AV1 encoding efforts designed to meet the extremely complicated needs of the human eye are still in their infancy.\\n\\nThis guide focuses almost entirely on tools great for offline, non-realtime encoding for various kinds of content. Streaming is an altogether different application of AV1, and is only covered sparsely here.\\n\\n### Do's & Don'ts\\n\\nDue to a lot of misunderstandings about codecs and compression, there are a lot of common misconceptions that are held regarding video encoding. We'll start by outlining some bad practices:\\n\\n- **Don't** encode the same video multiple times. This is a common mistake made by people new to video encoding. Every time you encode a video, you lose additional quality due to *generation loss*. This is because video codecs are lossy, and every time you encode a video, you lose more information. This is why it is important to keep the original video file if you frequently re-encode it.\\n- **Don't** blindly copy settings from others without understanding them. What works for one person's content and workflow may not work for yours. Even the default settings on many encoders are not optimal for most content.\\n- **Don't** assume that higher bitrate equates to better quality. Inefficient encoding can waste bits without improving visual quality, and efficient encoding can make lower bitrate video look drastically better than higher bitrate video using the same codec.\\n- **Don't** assume all encoders/presets/settings/implementations are created equal. Even given two encoding frameworks that use the same underlying encoder, you may achieve different results given encoder version mismatches or subtly different settings used under the hood.\\n- **Don't** use unnecessarily slow presets/speeds unless you have a specific need and ample time. While slower presets improve encoding efficiency most of the time, the quality gains reach a point of diminishing returns beyond a certain point. Use the slowest preset you can tolerate, not the slowest preset available.\\n- **Don't** blindly trust metric scores. It is unfortunate how trusted [VMAF](https://wiki.x266.mov/docs/metrics/VMAF) is considering how infrequently it correlates with visual fidelity in practice now that it has become so popular. Even the beloved [SSIMULACRA2](https://wiki.x266.mov/docs/metrics/SSIMULACRA2) is not a perfect one-to-one with the human eye.\\n\\nNow, let's move on to some **good** practices:\\n- Experiment with different settings and compare the results.\\n- Consider your content type when choosing encoding settings. Film, animation, and sports all have different characteristics that benefit from distinct approaches.\\n- Try to use CRF for offline encoding, as opposed to CBR or VBR. While the latter two are effective for precisely targeting a particular bitrate, CRF is more effective at targeting a specific quality level efficiently.\\n- Always use 10-bit color, even with an 8-bit source. AV1's internal workings are much more suited to 10-bit color, and you are almost always guaranteed quality improvements with zero compatibility penalty as 10-bit color is part of AV1's baseline profile.\\n- Consider using grain synthesis for grainy content, as AV1 can struggle with preserving film grain efficiently.\\n- Keep your encoding software up-to-date; the encoding world moves quickly.\\n\\n## Tools\\n\\nSince writing the last guide, there are now several versatile tools available for AV1 encoding. Below, we've assembled some tables of popular encoding tools and their features.\\n\\n### GUI\\n\\nHere's the key:\\n- **Encoder(s)**: The AV1 encoder(s) the software uses or is able to use. This is between [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1), [aomenc](https://wiki.x266.mov/docs/encoders/aomenc), [rav1e](https://wiki.x266.mov/docs/encoders/rav1e), [SVT-AV1-PSY](https://wiki.x266.mov/docs/encoders/SVT-AV1-PSY), and various aomenc forks. We'll get into this more later.\\n- **Ease of Use**: How intuitive the software is, especially for beginners.\\n- **Complexity**: How flexible the software can be for advanced users.\\n- **Efficiency**: How \\\"good\\\" the underlying encoder(s) are. This is more subjective, but tools with bad defaults, misleading options, or slow release cycles won't score well here.\\n\\n| Name | Platform(s) | Encoder(s) | Ease of Use | Complexity | Efficiency |\\n|---------|-------------|:----------:|:-----------:|:-----------:|------------|\\n| [Aviator](https://wiki.x266.mov/docs/utilities/Aviator) | Linux | SVT-AV1-PSY| \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cb\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf |\\n| [NMKODER](https://wiki.x266.mov/docs/utilities/nmkoder) | Windows | Any | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb |\\n| [Av1ation Station](https://github.com/Av1ation-Association/Av1ation-Creations/releases/) | Any | Any | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cf\u25cb |\\n| [StaxRip](https://github.com/staxrip/staxrip) | Windows | Any | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cf\u25cb |\\n| [NEAV1E](https://github.com/Alkl58/NotEnoughAV1Encodes) | Windows | Any | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb |\\n| [Handbrake](https://handbrake.fr/) | Any | SVT-AV1 | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb |\\n| [FastFlix](https://github.com/cdgriffith/FastFlix) | Any | Any | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb |\\n| [rAV1ator](https://wiki.x266.mov/docs/utilities/rav1ator) | Linux | rav1e | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cb\u25cb\u25cb\u25cb |\\n| [Autocompressor](https://autocompressor.net/) | Web | SVT-AV1 | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cb\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cb\u25cb |\\n\\nOur top pics are:\\n- For beginners: **Aviator**. If you are on Linux and you want zero hassle whatsoever, Aviator is simple but highly effective. As a Flatpak application, it ships a bundled SVT-AV1-PSY binary that is up-to-date, compiled efficiently, and handled with extensively tested defaults. It is hard to go wrong with Aviator even as an advanced user, despite its simplicity.\\n- For advanced users: **Av1ation Station**. Av1ator Station is thoughtfully designed to be your one-stop shop for video encoding. Even though it is brand new, it has proven itself to be a capable and reliable solution for advanced video encoders that have a lot of settings to tweak and encodes to keep track of.\\n- For Windows users: **StaxRip**. StaxRip is a long-standing, well-maintained, and highly flexible video encoding tool that supports a plethora of encoders and formats. It comes bundled with SVT-AV1-PSY and is a great choice for Windows users who want a powerful and versatile tool for video encoding.\\n\\n### CLI\\n\\nIn the terminal, advanced encoders can explore a much greater degree of complexity than many GUIs allow. That being said, ease of use is still a consideration when managing complex command-line encoding workflows. Let's begin with the key:\\n- We're omitting the \\\"Platform(s)\\\" column here, as this section targets Linux users. As a Windows user, WSL has you covered - as a Mac user, you're likely to experience parity with Linux (most of the time).\\n\\n| Name | Framework(s) | Ease of Use | Complexity | Features | Scene Detection |\\n|------|--------------|:-----------:|:----------:|:--------:|:---------------:|\\n| SvtAv1EncApp | None | \u25cf\u25cb\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cb\u25cb\u25cb\u25cb | No |\\n| [FFmpeg](https://wiki.x266.mov/docs/utilities/ffmpeg) | Itself | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cf\u25cb | No |\\n| [Av1an](https://wiki.x266.mov/docs/utilities/av1an) | FFmpeg | \u25cf\u25cb\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cb\u25cb | Yes |\\n| [rAV1ator CLI](https://wiki.x266.mov/docs/utilities/rav1ator-cli) | Av1an | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cb | Yes |\\n| [alabamaEncoder](https://github.com/kingstefan26/alabamaEncoder) | FFmpeg | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cf\u25cf | Yes |\\n\\nOur top picks are:\\n- For beginners: **rAV1ator CLI**. rAV1ator CLI essentially walks you through the process of writing Av1an commands. It can install binaries for you, save your previous commands, and detect scenes via Av1an. This makes it a great choice for beginners who want to learn the ropes of AV1 encoding without diving into the deep end headfirst. For advanced users, it makes rapidly writing, testing, & cataloging Av1an encoding commands much simpler.\\n- For advanced users: **alabamaEncoder**. alabamaEncoder is a powerful and flexible tool that allows you to encode video with FFmpeg and AV1. It is highly configurable and supports a mind-bending array of powerful features that would be hard to find elsewhere. While the tool is still new, it is already a great choice for advanced users who want to push the boundaries of what is possible to incorporate into an encoding workflow.\\n\\n### Conclusion\\n\\nIn conclusion, the best AV1 tool for you will depend on your needs and experience level. If you are a beginner, Aviator is a great choice for Linux users, while StaxRip is a good option for Windows users. For advanced users, Av1ation Station is a powerful and versatile tool that can handle numerous encoding tasks. If you prefer the command line, rAV1ator CLI is a great choice for beginners, while alabamaEncoder is a powerful tool for advanced users. No matter which tool you choose, it is hard to go wrong in the modern AV1 encoding landscape when it comes to your utility of choice.\\n\\n## Encoders\\n\\nThe world of AV1 encoding is diverse and complex, with several open-source encoders available, each bringing its own set of strengths, weaknesses, and unique features to the table. In this section, we'll dive deep into the characteristics of four major AV1 encoders:\\n1. SVT-AV1,\\n2. rav1e,\\n3. aomenc (libaom), and\\n4. SVT-AV1-PSY\\n\\nUnderstanding these encoders is crucial for making informed decisions about what best suits your specific encoding needs.\\n\\n### SVT-AV1\\n\\n[SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1) (Scalable Video Technology for AV1) is an AV1 encoder library and application developed by Intel, Netflix, and others. It has gained significant popularity in the encoding community due to its impressive balance of speed, quality, and scalability.\\n\\nLinks:\\n- Wiki page: [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1)\\n- Git repository: https://gitlab.com/AOMediaCodec/SVT-AV1\\n- Documentation: https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/README.md\\n\\n1. **Performance & Scalability**\\n - SVT-AV1 is renowned for its encoding speed, particularly at higher speed presets.\\n - It leverages parallel processing, making it exceptionally efficient on multi-core systems. Fun fact: SVT-AV1's parallel processing is lossless, so it doesn't compromise quality for speed.\\n\\n2. **Quality-to-Speed Ratio**\\n - SVT-AV1 strikes an impressive balance between encoding speed and output quality.\\n - At faster presets, it usually outperforms other encoders in quality per unit of encoding time.\\n - While it may not achieve the absolute highest *quality per bit* possible, its quality is generally considered impressive for its speed.\\n\\n3. **Flexibility**\\n - SVT-AV1 offers a wide range of encoding options and presets, allowing fine-tuned control over the encoding process.\\n - It provides 14 presets (0-13), with 0 being the slowest and highest quality, and 13 being the fastest but lowest quality.\\n - Advanced options allow users to adjust parameters like hierarchical levels, intra-refresh type, and tuning modes.\\n\\n4. **Continuous Development**\\n - SVT-AV1 receives frequent updates and optimizations, with new releases often coming alongside big changes.\\n - The open-source nature of the project encourages community contributions and rapid feature development.\\n\\nSVT-AV1 is an excellent choice for a wide range of encoding scenarios. It's particularly well-suited for:\\n- High-volume encoding operations where speed is crucial\\n- Live or near-live encoding of high-resolution content\\n- Scenarios where a balance between quality and encoding speed is required\\n- Users with multi-core systems who want to leverage their hardware efficiently\\n\\nSome downsides include:\\n- Higher memory usage compared to other encoders\\n- The developers assess quality via its performance on traditional legacy metrics, which harms its perceptual fidelity ceiling.\\n\\n### rav1e\\n\\n[rav1e](https://wiki.x266.mov/docs/encoders/rav1e) is an AV1 encoder written in Rust & Assembly. Developed by the open-source community alongside Xiph, it brings a unique approach to AV1 encoding with its focus on safety and correctness.\\n\\nLinks:\\n- Wiki page: [rav1e](https://wiki.x266.mov/docs/encoders/rav1e)\\n- Git repository: https://github.com/xiph/rav1e\\n- Documentation: https://github.com/xiph/rav1e/tree/master/doc#readme\\n\\n1. **Safety & Reliability**\\n - Being written in Rust, rav1e emphasizes memory safety and thread safety.\\n - This focus on safety translates to a more stable and reliable encoding process, with reduced risks of crashes or undefined behavior.\\n\\n2. **High Fidelity**\\n - At high fidelity targets - an area where AV1 usually lacks - rav1e is a strong contender compared to other encoders.\\n - It excels in preserving fine details and textures, making it a good choice for high-fidelity encoding.\\n\\n3. **Quality**\\n - While not typically matching aomenc or SVT-AV1 in pure compression efficiency, rav1e can produce high-quality output videos.\\n - It often achieves a good balance between quality and encoding time, especially at medium-speed settings.\\n\\n4. **Perceptually Driven**\\n - rav1e's development is driven by visual fidelity, without relying heavily on metrics.\\n - This focus on perceptual quality leads to a stronger foundation for future potential improvements in visual quality, as well as making the encoder very easy to use as it does not require excessive tweaking.\\n\\nrav1e is well-suited for:\\n- Projects where stability is paramount\\n- Users who prioritize a community-driven, open-source development approach\\n- Encoding tasks where a balance between quality and speed is needed, but the absolute fastest speeds are not required\\n\\nSome limitations of rav1e include:\\n- Lagging development compared to other encoders\\n- Slower encoding speeds compared to SVT-AV1 at similar quality & size\\n- Fewer advanced options compared to other encoders\\n\\n### aomenc (libaom)\\n\\n[aomenc](https://wiki.x266.mov/docs/encoders/aomenc), based on the libaom library, is the reference encoder for AV1. Developed by the Alliance for Open Media (AOM), it is the benchmark for AV1 encoding quality and compliance.\\n\\nLinks:\\n- Wiki page: [aomenc](https://wiki.x266.mov/docs/encoders/aomenc)\\n- Git repository: https://aomedia.googlesource.com/aom/\\n\\n1. **Encoding Quality**\\n - aomenc is widely regarded as the gold standard for AV1 encoding quality.\\n - It often achieves high compression efficiency among AV1 encoders, especially at slower speed settings.\\n - The encoder squeezes out nearly every last bit of efficiency from the AV1 codec, making it ideal for archival purposes or when quality per bit is critical.\\n\\n2. **Encoding Speed**\\n - aomenc is generally the slowest among major AV1 encoders.\\n - It offers 13 CPU speed levels (0-12), but even at its fastest settings, it's typically slower than other encoders at their slower settings.\\n - The slow speed is often considered a trade-off for its high compression efficiency.\\n\\n3. **Extensive Options**\\n - As the reference implementation, aomenc offers the most comprehensive encoding options.\\n - It provides fine-grained control over nearly every aspect of the AV1 encoding process.\\n - Advanced users can tweak many parameters to optimize for specific content types or encoding scenarios.\\n\\n4. **Flexibility**\\n - Being the reference encoder, aomenc produces highly standards-compliant AV1 bitstreams that take advantage of the full arsenal of AV1 features.\\n - It supports 4:2:0 and 4:4:4 chroma subsampling, 8- to 12-bit color depth, and various other advanced features that more specialized encoders like SVT-AV1 do not support.\\n\\naomenc is ideal for:\\n- Scenarios where achieving the highest possible quality is the primary goal\\n- Archival encoding where compression efficiency is crucial\\n- Research and development in video compression\\n- Encoding projects where encoding time is not a significant constraint\\n\\nSome drawbacks of aomenc include:\\n- Unresponsive development driven by legacy metrics, leading to slower adoption of new techniques and ignoring improvements communicated by people outside the Google development team\\n- Cripplingly difficult to use for beginners, with a culture of cargo-culting settings\\n- Slow encoding speeds compared to other AV1 encoders, which has less of an impact on the quality of the output than it used to compared to maturing encoders like SVT-AV1\\n\\n### SVT-AV1-PSY\\n\\n[SVT-AV1-PSY](https://wiki.x266.mov/docs/encoders/svt-av1-psy) is a community fork of the SVT-AV1 encoder focused on psychovisual optimizations to enhance perceived visual quality. It aims at closing the distance between SVT-AV1's high speeds and the perceptual quality of aomenc's slow brute force approach.\\n\\nLinks:\\n- Wiki page: [SVT-AV1-PSY](https://wiki.x266.mov/docs/encoders/svt-av1-psy)\\n- Git repository: https://github.com/gianni-rosato/svt-av1-psy\\n- Documentation: https://github.com/gianni-rosato/svt-av1-psy/blob/master/Docs/PSY-Development.md\\n\\n1. **Perceptual Optimizations**\\n - SVT-AV1-PSY introduces various psychovisual enhancements to improve the perceived quality of encoded video.\\n - These optimizations often result in output that looks better to the human eye, even if it might not always score as well in objective metrics.\\n\\n2. **Additional Features**\\n - Introduces new options like variance boost, which can help maintain detail in high-contrast scenes.\\n - Offers alternative curve options for more nuanced control over the encoding process.\\n - Extends the CRF (Constant Rate Factor) range to 70 (from 63 in mainline SVT-AV1), allowing for extremely low-bitrate encodes.\\n - Introduces additional tuning options, including a new \\\"SSIM with Subjective Quality Tuning\\\" mode that can improve perceived quality.\\n\\n3. **Visual Fidelity Focus**\\n - Aims to produce more visually pleasing results, sometimes at the expense of metric performance.\\n - Includes options like sharpness adjustment and adaptive film grain synthesis which can significantly impact the visual characteristics of the output.\\n - Features modified defaults driven by perceptual quality considerations.\\n\\n4. **Extended HDR Support**\\n - Includes built-in support for Dolby Vision & HDR10+ encoding.\\n - This makes it particularly useful for encoding HDR content without requiring additional post-processing steps or external tools.\\n\\n5. **Performance**\\n - Based on SVT-AV1, it retains the performance characteristics of its parent encoder.\\n - Adds super slow presets (-2 and -3) for research purposes and extremely high-quality encoding. These additional presets can be useful for creating reference encodes or applications where encoding time is not a concern.\\n\\nSVT-AV1-PSY is particularly well-suited for:\\n- Encoding scenarios where subjective visual quality is prioritized over pure metric performance\\n- HDR content encoding in Dolby Vision or HDR10+\\n- Users who want fine-grained control over psychovisual aspects of encoding\\n- Projects that require a balance between the speed of SVT-AV1 and enhanced visual quality\\n- Encoding challenging content with complex textures or high-contrast scenes\\n\\nSome drawbacks are:\\n- Everything that applies to SVT-AV1, including the lack of support for 4:4:4 chroma subsampling and 12-bit color depth that are useful in specific scenarios\\n\\n### Conclusion\\n\\nWhile SVT-AV1 is known for being fast, aomenc is renowned for its high-quality output, and rav1e is recognized for its safety and reliability, each encoder has strengths and weaknesses. The best encoder for you will depend on your specific needs and priorities.\\n\\nAs this guide is focused on offline encoding, **SVT-AV1-PSY** combines aomenc's traditional perceptual strength with SVT-AV1's speed. Like rav1e, it is easy to use due to strong default settings that prevent cargo culting, and overall it can be considered the best of all three worlds. It is actively developed by a team of responsive community members, and it is a great choice for most users who want a balance between quality per bit, speed, and ease of use.\\n\\nThe \\\"best\\\" encoder often depends on your use case, content type, and target audience. It's always worth experimenting with different encoders and settings to find the optimal balance for your needs. Many advanced users even employ multiple encoders in their workflows, choosing the most appropriate tool for each specific task or content type.\\n\\n## Final Conclusion\\n\\nThe AV1 ecosystem has grown to the point where a single comprehensive guide cannot effectively cover the entire extent of the available tools and techniques for AV1 encoding across *every* use case. If you want more detail about a particular tool, where to acquire it, or how to compile an encoder, you can find that information throughout the various wiki entries linked on this page.\\n\\nReading can get you far, but it is natural to have questions. Please don't hesitate to connect with the team behind the Codec Wiki and many of these tools via our [AV1 for Dummies Discord server](https://discord.gg/bbQD5MjDr3). We're happy to help you with anything you need, and your questions and feedback help the wiki grow and improve. We hope you enjoy your journey into AV1 encoding, and we wish you the best of luck in your encoding endeavors!\"},{\"id\":\"svt-av1-second-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-second-deep-dive\",\"source\":\"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx\",\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"description\":\"SVT-AV1 2.1.0 just released, how does it compare to the previous version?\",\"date\":\"2024-05-19T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"inline\":true,\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":35.215,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\",\"socials\":{},\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"description\":\"SVT-AV1 2.1.0 just released, how does it compare to the previous version?\",\"slug\":\"svt-av1-second-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-2.1.0-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"AV1 for Dummies\",\"permalink\":\"/blog/av1-for-dummies\"},\"nextItem\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"permalink\":\"/blog/svt-av1-deep-dive\"}},\"content\":\"import { CarouselGenerator, TabbedCarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\n\\n\\nSVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips.\\n\\n\x3c!--truncate--\x3e\\n\\n## Feedback\\n\\nI unfortunately never got to update the previous blog post with the image comparisons, and some people expressed concerns that this testing may not be representative of live action content. For the former, I will have to ask for your patience again, because this blog post won't initially contain image comparisons either, but this time they are being actively worked on, along with a magnificent comparisons component and this page will get updated once that is done. As for the latter, please be reassured that this testing in its entirety is perfectly representative of any modern content people typically encode: the diversity of japanese animation is rich and the content specifically chosen for this benchmark is relatively complex. From 3DCG to extremely noisy clips, we are far from the easy-to-compress static scenes of some slice-of-life show.\\n\\nI have also decided to complement this benchmark of another psychovisually-driven metric (XPSNR) so that double-checking is made easier. Thus, each graph possesses a SSIMULACRA2 version and a XPSNR version. Don't hesitate to switch between one another!\\n\\n## Methodology\\n\\nThe resources available will range from ***graphs*** to ~~**image comparisons**~~ (WIP, for real this time). The ***former*** has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the **latter** are image samples from the files encoded during the tests that enable you to check quality for yourself, adding another layer of subjective interpretation to these comparisons.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with `x264 --qp 0` for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp *directly*, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2), XPSNR scores on the other hand are calculated using a [ffmpeg filter](https://github.com/fraunhoferhhi/xpsnr), and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and metrics scores. Bits per pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the closest we have to real efficiency.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v2.0.0 and v2.1.0 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/) using the provided `Build/linux/build.sh` script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i3 12100 with 16GB of 3200MHz CL14 DDR4 RAM in Arch Linux with kernel 6.7.7 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples\\n\\nThe samples are as follows:\\n- 11s `Blame!` clip which sports 3DCG action with lots of grain, effects and high-contrast elements.\\n- 13s `Blue Lock` clip which sports rapid camera movements, complex geometry and high-contrast elements.\\n- 5s `Spy x Family` first ending sequence with an extremely high amount of dynamic noise. New most complex source of this set.\\n- 12s `Jigokuraku (Hell's Paradise)` flashback clip with huge static grain in a very dark scenery and some action.\\n- 5s `The Garden of Sinners` clean but fast-paced 3DCG scene with explosions.\\n\\nThe resolution of every clip is 1080p, except for the first one which is 1920x804.\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 6` to `--crf 46`, by increments of 4.**\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> ~~13~~ 12)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 12`.**\\n> Yes, you heard that right. Preset 7 and 13 are no more in __v2.1.0__. This new update, like the previous one, mostly consisted of optimizing the presets trade-offs. The devs have made the choice to map `preset 7` to `preset 6` and `preset 13` to `preset 12` due to the lack of spacing between the new presets. We will discuss the implications of this further ahead.\\n\\n`--preset X` is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are: \\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\n\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n### Efficiency\\n\\n- First of all, here are the full efficiency graphs:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThis is all very cool, but visually bloated.\\n\\n- Now the same graphs but focusing on the \\\"high quality\\\" range (CRF6 -> 22):\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Same, but now focusing on the \\\"low quality\\\" range (CRF26 -> 46):\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- If we now focus on __presets 4__ and below, where it's more difficult to discern the differences between presets, we get this at \\\"high quality\\\":\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- And the following at \\\"low quality\\\":\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n### Speed\\n\\n- **Let's now see speed comparisons between all presets:**\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nOnce is not custom, __preset -1__ is so abysmally slow it makes the graph unusable.\\n\\n- Same, but without the placebo __preset -1__:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Lastly, here is what it looks like with a logarithmic scale:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n### Interpretation\\n\\nAs for interpreting the results, it would seem like **preset 2** and **preset 4** remain all-around very balanced presets, with **preset 3** being in a nice in-between spot, an improvement over v2.0.0's **preset 3** in a way. We will better understand the reasons for this when we'll compare the new version to the last, a bit after.\\n\\nThe quality gap between **preset 2** and **preset 1** is usually pretty narrow, however the speed penalty from going to **preset 1** is ~2x, when the penalty of going from **preset 3** to **preset 2** is closer to ~1.5x. As such, **preset 1** enters placebo territory, and considering the very little benefits of going any lower than it, compared to the huge performance loss of even lower presets, I advise you not to waste encoding resources on **preset 0** and **preset -1**. This applies especially at medium to high quality, however at extremely low quality like the CRF40 range, we can still see some small gains from these placebo presets.\\n\\nWhen we start talking about faster presets though, things are pretty different from previous versions: **presets 5 to 9** behave similarly on the graphs and seem to stand apart from their slower counterparts by just a bit. If you can bear the speed of **preset 4**, you should definitely be going for it, however if fast encoding is a necessity, for example in the case of realtime transcoding or streaming, **presets 5 through 9** will serve you right with great efficiency/speed trade-offs between one another. No preset in that range particularly stands out from the others, so simply pick one depending on your performance needs.\\n\\n**Presets 10 to 12** are pretty inefficient, and to be avoided if possible. They can still be of use in a convex-hull scenario, but in the case of realtime transcoding, you may be better off with a hardware encoder like the ones found in RTX 4000 or Arc GPUs, especially since SVT-AV1's target bitrate mode is even less efficient than CRF mode.\\n\\n### TLDR\\n\\nThe same conclusions as the previous blog post can be made: \\n**clear quality gains can be observed as we decrease presets, until __preset 2__, however the effectiveness of dropping presets is noticeably less and less important as quality is increased.**\\n\\nIn the next part, we will evaluate the differences in efficiency and speed of every presets when updating from SVT-AV1 2.0.0 to 2.1.0, which should enable an increase of nuance from the previous results alone.\\n\\n## SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:\\n\\nTwo months ago, I conducted a similar test to this one to compare the presets evolution between versions __1.8.0__ and __2.0.0__. The results were pretty unsatisfying: I noticed that **presets -1 to 8** in __v2.0.0__ performed like the old **presets 0 to 9** did in __v1.8.0__. We basically saw an efficiency regression at a given preset, and speedups did not follow suit as well as we would have anticipated. All in all, it wasn't all that bad, it suffice to say you could simply drop a preset from before and you were good to go again. What was more concerning however is that the release note claimed important speedups that did not impact efficiency and my testing proved otherwise. My theory is that due to the dev team testing methodology, which consist of mostly pretty low resolution clips and non-psychovisual metrics like PSNR, SSIM or bad psychovisual metrics like VMAF, it's very well possible they were tricked into thinking they introduced improvements as they tweaked the presets when in reality the metrics simply didn't notice the quality degradation. Such issue is an additional reason why the industry should adopt more competent metrics, ones that better correlate with the human vision, to improve encoders in more impactful ways and better avoid pointless regressions. \\n\\nSo the question for today's testing is: have the SVT-AV1 devs redeemed themselves and actually improved the presets trade-offs this time around? Let's find out!\\n\\n### `preset -1`: v2.0.0 vs v2.1.0\\n\\n- **Let's start off with a battle of the placebos, with the efficiency at \\\"high quality\\\":**\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- And the efficiency at \\\"low quality\\\":\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nYes, this is a bit underwhelming, but you can't just improve the best an encoder has to offer with just tweaking right?\\n\\n- Now, let's compare their respective speeds:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nLet's be grateful it became ever so slightly faster, I guess.\\n\\n### `preset 0`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nOverall, efficiency wise, this new **preset 0** places itself in-between old **preset -1** and **0**\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nInterestingly enough, its speed is much closer to the old **preset 0** than to the old **preset -1**. This means **preset 0** was genuinely improved over v2.0.0!\\n\\n### `preset 1`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nIn efficiency, this new **preset 1** is often equal to old **preset 0**, else in-between old **preset 0 and 1**.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nWe observe that the new preset is a bit closer to old **preset 1** speeds than it is to old **preset 0** speeds. Good news!\\n\\n### `preset 2`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nOh well, that's awkward.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nSpeed was left untouched too, meaning **preset 2** is unchanged in v2.1.0.\\n\\n### `preset 3`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe new **preset 3**'s efficiency is the same as the old one.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nHowever, the preset got slightly faster, so this is a speedup!\\n\\n### `preset 4`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nWe can observe that **preset 4** got slightly to moderately worse efficiency wise.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nFortunately, the consequence of that slight efficiency decrease is a big performance improvement!\\n\\n### `preset 5`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 5** seems to have gotten ever so slightly worse efficiency wise.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nYet it became slightly faster, this is overall a good trade-off.\\n\\n### `preset 6`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe new **preset 6** has a huge responsibility: being able to compensate in the absence of its **preset 7** sibling. It seems to performs in-between old **preset 6 and 7**, usually closer to old **7**.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 6** is now ever so slightly slower to old **7**, this is an interesting trade-off, overall a win over old **7**.\\n\\n### `preset 7`: v2.0.0 vs v2.1.0\\n\\nAgain, there is no preset 7. Actually, it's preset 6 that disappeared but I'm not remaking the graphs just for fun. If you select preset 6, you will be granted the following message: `Svt[warn]: Preset M6 is mapped to M7.`\\n\\n![always_has_been](/img/preset_7_meme.webp)\\n\\n### `preset 8`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nIn efficiency, this new **preset 8** is sometimes equal or slightly worse to the old **8**, and sometimes equal or slightly worse than old **7**...\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nOverall, the speed is pretty much unchanged from old **8**. It looks like a slight regression, that's pretty disappointing.\\n\\n### `preset 9`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe new **preset 9** is the same as ever, ever so slightly better in some scenario but nothing groundbreaking.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nIts speed remains the same, sometimes ever so slightly slower. Basically the preset is pretty much unchanged, which may as well be a relief, as the last usable preset of the encoder.\\n\\n### `preset 10`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 10** is slightly to moderately worse efficiency wise.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nIts speed is mostly the same, sometimes ever so slightly faster. It's a wash, avoid this preset at all costs!\\n\\n### `preset 11`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 11**'s efficiency is untouched.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 11**'s speed is unchanged as well.\\n\\n### `preset 12`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nJust as **preset 6**, **preset 12** is now mapped to **13**, and unsurprisingly, its efficiency is equal to old **13**.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe speeds seem to be in-between old 12 and 13, so potentially a slight speedup. Still, nothing to get excited at.\\n\\n### TLDR\\n\\nFrom these extensive comparisons, it appears that some presets have received genuine improvements in their respective efficiency/speed trade-off.\\nSome presets, like **-1**, **0**, **1** and **3**, received the most significant improvements, followed by **4**, **5** and **6** with overall beneficial new trade-offs. **Preset 12** got slightly faster too. On the other hand, **presets 8 and 10** seemed to have regressed slightly, and **presets 2 and 9** are perfectly unchanged from v2.0.0.\\n\\n## Conclusion\\n\\nSVT-AV1 2.1.0 introduced some welcomed improvements. **Presets 2 through 4** remain the king of optimal AV1 encoding, while **presets 5 through 9** stand as good options for the people that find **2-4** to be too slow for their liking.\\n\\nLet's be honest a second, not much as changed in SVT-AV1 since the first blog post. There was no need to redo all the parameter testing for the simple reason that their behavior remained the same, as did the conclusions drawn from them. I hope this article wasn't disappointing in a sense... Still, be reassured, this was just an appetizer, there will be more in the near future!\\n\\nBy the way, did you know that the **[SVT-AV1-PSY project](https://github.com/gianni-rosato/svt-av1-psy/)** was initiated a few months ago? Its defaults were tailored according to the testing done in the last blog post, allowing a free efficiency boost for anyone not keen to tweak their encoders. Furthermore, SVT-AV1-PSY introduced a sharpness parameter to control distortion, a quarter-step quantizer for more CRF precision, a new subjective SSIM tune, Dolby Vision support, frame luma bias, and some other knobs to improve the appeal and consistency of your encodes. It is actively maintained by a group of talented people, including the main dev of the aom-av1-lavish fork of aomenc. Some of the changes are being backported to mainline SVT-AV1 due to the increased interest of the mainline devs. Please check it out!\\n\\nHopefully, this comprehensive second deep dive should give you a helpful new starting point for choosing settings when encoding with the latest SVT-AV1(-PSY) 2.1.0.\\n\\n## Future\\n\\nMy plans for the future regarding the blog post include:\\n- polishing this blog post and aggrementing it of image comparisons.\\n- a follow-up article in the relatively near future about giving you encoding tips and explaining common AV1 encoding knowlegde, for instance showcasing why film grain synthesis is a game-changer or why chunked encoding can prove beneficial to your encoding pipeline.\\n- an article focused on observing the evolution of SVT-AV1 since the beginning of its development, as well as comparisons with current aomenc, rav1e and SVT-AV1-PSY, including a quick look at the current state of AVM (development ground for AV2) in comparison to VVC's state.\\n\\nThanks for reading!\\n\\n{}\"},{\"id\":\"svt-av1-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-deep-dive\",\"source\":\"@site/blog/2023-12-30-svt-av1-deep-dive.mdx\",\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"date\":\"2023-12-30T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"inline\":true,\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":22.78,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\",\"socials\":{},\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"slug\":\"svt-av1-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-1.8.0-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"permalink\":\"/blog/svt-av1-second-deep-dive\"},\"nextItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"}},\"content\":\"import { CarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\n\\n\\nThis blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.\\n\\nThe resources available will range from ***graphs*** to ~~**image comparisons**~~ (WIP). The ***former*** has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the **latter** are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with `x264 --qp 0` for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp *directly*, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2) and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the closest we have to real efficiency.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v1.8.0 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0) using the provided `Build/linux/build.sh` script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples\\n\\nThe samples are as follows:\\n- 11s `Blame!` clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set.\\n- 13s `Blue Lock` clip which sports rapid camera movements and rotations + high-contrast elements.\\n- 15s `Fate/Grand Order: Babylonia` relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data.\\n- 22s `Jigokuraku (Hell's Paradise)` flashback clip with huge static grain in a very dark scenery and some action.\\n- 14s `Kaguya-sama` opening sequence with lots of effects and fast change of scenery.\\nThe resolution of every clip is 1080p, except for the first one which is 1920x804.\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 8` to `--crf 43`.**\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> 13)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 13`.**\\n*Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why.*\\n\\n`--preset X` is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are: \\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n- First of all, here are the efficiency graphs:\\n\\n\\n\\nThis could be too much information.\\n\\n- Now the same graphs but focusing on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- Same again but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- Now for the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- Same but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- **Let's now see speed comparisons between all presets:**\\n\\n![speed_overall](https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp)\\n\\nAs we can see, preset -1 is so abysmally slow it makes the graph unusable\\n(BTW, notice the `1e6` in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)\\n\\n- Here is what it looks like with a logarithmic scale:\\n\\n\\n\\n- **Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)**\\n\\n\\n\\n- Here are speeds graphs for preset 1 to 6 with a linear scale:\\n\\n\\n\\nOne interpretation we can have is that **presets 2 to 4** have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but **preset 2** is **2x slower than preset 4**. The quality gap between **preset 2** and **preset 1** is even narrower but the speed penalty is also ~2x.\\n\\nThat makes it hard to recommend **preset 1**, while **preset 3** is in a strange middle ground between **2** and **4** where it makes little sense to choose it over those two: it's better to choose **preset 2** for the higher efficiency at 1.5x slower speeds, or **preset 4** for the 1.33 to 1.5x higher speeds. At least the option exists.\\n\\nA similar observation can be made between **preset 5** and **6**. They can be so close in scores in many samples (especially at HQ) while also being close in speeds that **preset 5** becomes rather obsolete most of the time.\\n\\n### TLDR\\n\\n**Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go.**\\n\\n- For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), __**preset 4**__ only loses at maximum **2** SSIMU2 **points** compared to __**preset -1**__ while being 50-60x faster. Though to be fair, the speed loss from __**preset 4**__ to __**preset 0**__ is \\\"only\\\" 5-10x for a maximum SSIMU2 difference close to **1.5 point**.\\n\\n- From CRF43 to CRF28, the difference between __**preset 4**__ and __**preset -1**__ can be as much as **5** SSIMU2 **points**, so lower presets become more attractive.\\n\\n## Tunes comparisons\\n\\n**In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default `--tune 1` (PSNR) to the other two tunes: `--tune 0` (VQ) and `--tune 2` (SSIM).**\\n\\nExcept for the tunes, `--preset 4` is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n- **Let's compare the efficiency of every tunes:**\\n\\n\\n\\n- Now let's focus on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- And the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- And here is the speed difference:\\n\\n\\n\\n- Graphs comparing the tunes individually between each others will be made available soon.\\n- The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that.\\n\\n### TLDR\\n\\n**SSIMU2 favors __tune 1 and 2__ above __tune 0__. At high quality, __tune 1 and 2__ are matched, while at low quality __tune 2__ takes the edge. __Tune 0__ is sometimes a match for the other two on certain clips and other times fare pretty badly.**\\n**For some reason, __tune 0__ is quite a bit faster now, compared to 1 and 2 which are basically the same.**\\n\\nKeep in mind that I have observed multiple times in the past that __tune 0__ kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay *tuned* for these subjective comparisons.\\n\\n## Parameters comparisons\\n\\n**In the following graphs, you may find comparisons between many SVT-AV1 parameters.**\\n*Additional graphs focusing on the high and low qualities will be made available later down the line*\\n\\n`--preset 4` is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n### `--tile-rows 1 --tile-columns 1` vs default `--tile-rows 0 --tile-columns 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __tiles__ here are both slightly harmful and slower.\\n\\n### `--aq-mode 0` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Except for the Jigokuraku clip, __aq-mode 0__ is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels.\\n\\n### `--aq-mode 1` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __aq-mode 1__ fares closer to __aq-mode 2__ than __aq-mode 0__ did, both in quality and speed, but is still overall inferior according to SSIMU2\\n\\n### `--enable-cdef 0` vs default `--enable-cdef 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF *can* be beneficial for the line-art.\\n\\n### `--enable-dg 0` vs default `--enable-dg 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Dynamic GoP control__ yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \\\"safe\\\" to keep the setting disabled at all times or not.\\n\\n### `--enable-dlf 0` vs default `--enable-dlf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Deblocking loop filter__ can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default.\\n\\n### `--fast-decode 1` vs default `--fast-decode 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __fast-decode 1__ is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though.\\n\\n### `--irefresh-type 1` vs default `--irefresh-type 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Finally something interesting to analyse!\\n- __irefresh-type 1__ is either a match or beneficial compared to __irefresh-type 2__ at high CRF levels.\\n- __irefresh-type 1__ either wins or lose to __irefresh-type 2__ at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set __irefresh-type__ to __1__ at \\\"high quality\\\" as it might be harmful depending on the content.\\n- __irefresh-type 1__ is always slower compared to __irefresh-type 2__, so I might argue it is more safe to leave __irefresh-type__ default at \\\"high quality\\\" than not.\\n- According to the content type of those clips, it appears that __irefresh-type 1__ may benefit *extremely grainy* content while default __irefresh-type 2__ is better suited for *cleanish* content. This needs to be confirmed with *moar* testing though.\\n\\n### `--lookahead 0` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n### `--lookahead 60` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n### `--lookahead 120` (max) vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __lookahead__ seems to behave strangely when set...\\n- __lookahead 0__ shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead.\\n- __lookahead 60__ is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23\\n- __lookahead 120__ is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences.\\n> Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide.\\n\\n### `--enable-overlays 1` vs default `--enable-overlays 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __overlays__ do not seem to either improve efficiency or performance.\\n\\n### `--enable-qm 1` vs default `--enable-qm 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Enabling __quantization matrices__ alone increase efficiency at \\\"high quality\\\" with no real speed impact.\\n\\n### `--enable-qm 1 --qm-min 0` vs `--enable-qm 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Setting __qm-min__ to __0__ on top of enabling __quantization matrices__ can be beneficial in some clips at no added compute time.\\n\\nI will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content.\\n\\n### `--enable-restoration 0` vs default `--enable-restoration 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the __loop restoration filter__ isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons.\\n\\n### `--scm 0` vs default `--scm 2` (content adaptive)\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `--scm 1` vs default `--scm 2` (content adaptive)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Interestingly enough, __screen content tools__ seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this.\\n\\n### `--enable-tf 0` vs default `--enable-tf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Disabled __temporal filtering__ *can* sometimes improve efficiency slightly at \\\"high quality\\\", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.\\n\\n### `--enable-tpl-la 0` vs default `--enable-tpl-la 1`\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `superres`:\\n\\nKinda lazy to make, share and comment so much graphs for something that can be told in two lines...\\n\\nAll superres variants are freaking useless as they:\\n- do not improve efficiency\\n- decrease encoding speeds\\n- decrease decoding speeds when either bitrate or quality normalized.\\n\\n### __Early TLDR on parameters results:__\\n\\n***For a previous test with SVT-AV1 1.7.0 I did all parameters tests with `--preset 6 --tune 2`, now I did them with `--preset 4 --tune 1`. Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line.***\\n\\n**Here is a quick run down of how each parameter affect encoding:**\\n- `--tile-rows --tile-columns` should never be used (except for decreasing decode complexity)\\n- `--aq-mode 2` is the most efficient / fastest\\n- `--enable-cdef 0` *might* improve performance at almost no efficiency loss *(needs more thorough testing)*\\n- `--enable-dg` and `--enable-dlf` barely do anything\\n- `--fast-decode 1` decreases efficiency, improves encoding times, and the decoding gains still need to be determined.\\n- `--irefresh-type` should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content\\n- `--lookahead` should be kept default\\n- `--enable-overlays 1` does not improve efficiency, slight speed regression as well\\n- `--enable-qm 1 --qm-min 0` should be set for increased efficiency especially at low CRF values at no perf cost\\n- `--enable-restoration` barely does anything but disabling yields better performance *(needs visual confirmation)*\\n- `--scm 1` screen content tools can improve efficiency with a big performance trade-off *(needs more thorough testing)*\\n- `--enable-tf 0` is a mixed bag efficiency wise but improves performance\\n- `superres & resize` please don't.\\n\\n## Conclusion\\n\\nThe extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking.\\n\\nThe default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength.\\n\\nFurther testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!\\n\\n{}\"},{\"id\":\"embedding-the-un-embeddable\",\"metadata\":{\"permalink\":\"/blog/embedding-the-un-embeddable\",\"source\":\"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx\",\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"date\":\"2023-10-29T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"discord\",\"permalink\":\"/blog/tags/discord\"}],\"readingTime\":8.92,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"socials\":{},\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"slug\":\"embedding-the-un-embeddable\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"video\",\"discord\"],\"image\":\"/img/discord-embed-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"permalink\":\"/blog/svt-av1-deep-dive\"},\"nextItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"![Feature image](/img/discord-embed-blog-image.webp)\\n**A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film \\\"Cosmos Laundromat\\\"**\\n\\n\\n## A Scenario\\n\\nWhile chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it.\\n\\n\x3c!--truncate--\x3e\\n\\nIt loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations.\\n\\n![stolen.shoes](/img/stolenshoes-puss.webp)\\n\\nThe truth is, there are *multiple* site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:\\n\\n- https://stolen.shoes\\n- https://discord.nfp.is\\n- https://embeds.video\\n- https://x266.mov/discord-embed\\n- https://autocompressor.net/av1\\n\\nThe big question is, **how do they work?** Let's get to dissecting.\\n\\n## But First, a Quick Disclosure\\n\\nThe Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately.\\n\\n## How it Works\\n\\nThe entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park).\\n\\nThe technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end.\\n\\n### The Website's End\\nIf you view each website's source, you will find this specific line in each one but they may have a different order:\\n\\n```html\\n\\n\\n\\n\\n\\n```\\n\\nThese are the `head` parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the `` and `` tags. Here's an example of a static HTML site serving one specific video:\\n```html\\n\\n\\n\\n \\n \\n some embed site\\n \\n \\n \\n \\n \\n\\n\\n

Hi

\\n

Just your friendly neighborhood video embed site

\\n \\n\\n```\\n\\n< br />\\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms).\\n\\n### Discord's End\\n\\nTraditionally, Discord's media embedder will impose it's own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link \\\"tricks\\\" Discord by showing a \\\"false face\\\" first.\\n\\n\\n\\n## Strengths & Limitations\\n\\nAfter a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below.\\n\\n#### Strengths\\n\\n- You can embed non-web compatible codecs such as [HEVC](https://wiki.x266.mov/docs/video/HEVC) in [MP4/MOV](https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v), but the user must be using a compatible browser. [Thorium](https://thorium.rocks) or Safari version 13 or greater will work for HEVC playback.\\n- There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them.\\n\\n#### Limitations\\n\\n- You can only use [hotlinks](https://simple.wikipedia.org/wiki/Hotlinking), which means direct linking to the video itself ending in the appropriate file extension such as `.mp4`. Cloud services like Google Drive or OneDrive will not work for storage.\\n- You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but **only discord.nfp.is can do this**, as it **proxies cdn.discordapp.com** itself.\\n- You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord.\\n\\n\\n\\n## Differences between Sites\\n\\nAs mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality.\\n\\nHere are the sites, each with one noteworthy special benefit:\\n\\n- https://stolen.shoes - Recognition, as it is the OG.\\n- https://discord.nfp.is - You can use Discord CDN as video source.\\n- https://embeds.video - Immediately input video source into the URL (`https://embeds.video/https://example.com/v/video.mp4`)\\n- https://x266.mov/discord-embed - Attractive domain, simple layout.\\n- https://autocompressor.net/av1 - Lots of info dump, pretty advanced features.\\n\\nThat concludes the technical overview! Next, let's cover the history of this exploit.\\n\\n## The Lore\\n\\n### Dwayne\\n\\nIn around April of 2022, a Reddit user going by the name of u/CreativeGamer03 [posted a video on r/discordapp](https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh) of a link where a GIF of Dwayne \\\"The Rock\\\" Johnson plays caption with \\\"Is this a GIF or is it a video?\\\" When played, a low-quality music video of Rick Astley's \\\"Never Gonna Give You Up\\\" plays.\\n\\nThe link used is now unfortunately [removed](https://archuser.de/the-rock).\\n\\n### Discovery\\nOn 23rd June 2022, a Discord user *Clybius* on the AV1 Community server asked people for [VP9](https://wiki.x266.mov/docs/video/VP9) or [H.264](https://wiki.x266.mov/docs/video/AVC) videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked.\\n\\nHe tried shortly afterward with [AV1](https://wiki.x266.mov/docs/video/AV1). Eureka, it also worked:\\n\\n![AV1](/img/clybius-av1.webp)\\n\\nClybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll.\\n\\n![Dwayne](/img/clybius-dwayne.webp)\\n\\n### The Experiments & Interactive Site\\n\\nAfter the discovery of AV1 embedding, experimentation brought about the discovery that *any* video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the [Containers](https://wiki.x266.mov/docs/introduction/terminology#container) section on the [Terminology](https://wiki.x266.mov/docs/introduction/terminology) page.\\n\\nThis applies to HEVC, ProRes, [xHE-AAC](https://wiki.x266.mov/docs/audio/AAC#xhe-aac), and other bizarre codecs that are rarely seen on the Web.\\n\\nWhile experimentating, Clybius converted one their idle domains `stolen.shoes` into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding.\\n\\n### Virality\\n\\nIt's not long before people outside of the AV1 Community discovered `stolen.shoes`, and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time.\\n\\n- The first instance featured the DreamWorks sequel of \\\"Puss in Boots (2011)\\\", \\\"Puss in Boots: The Last Wish (2022)\\\". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used `stolen.shoes`.\\n\\n![puss](/img/stolenshoes-puss.webp)\\n\\n- The second instance was when highly-anticipated animated film \\\"The Super Mario Bros. Movie (2023)\\\" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used `stolen.shoes` as the embed site.\\n\\n![mario](/img/stolenshoes-mario.webp)\\n\\n- The third instance is very recent as of the day this was posted. A streaming-service sourced \\\"Five Nights at Freddy's (2023)\\\" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining [hundreds of upvotes within the r/discordapp subreddit](https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/). The copy seems to be a compressed 720p encode. This example used `discord.nfp.is`.\\n\\n![fnaf](/img/discordnfpis-fnaf.webp)\\n\\nNote the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution: \\n- Top Gun Maverick (2022)\\n- The SpongeBob trilogy (2005/2015/2020)\\n- Spider-Man: Across the Spider-Verse (2023)\\n\\n\\n## Closing\\n\\nThe ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies.\\n\\nWhile this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms.\\n\\nIt is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform.\\n\\nThank you for reading this blog post, I hope you learned something!\"},{\"id\":\"av1-encoding-for-dummies\",\"metadata\":{\"permalink\":\"/blog/av1-encoding-for-dummies\",\"source\":\"@site/blog/2023-09-03-av1-for-dummies.mdx\",\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"date\":\"2023-09-03T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":16.09,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"socials\":{},\"key\":null,\"page\":null},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"socials\":{},\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"slug\":\"av1-encoding-for-dummies\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"video\",\"compression\"],\"image\":\"/img/compare-guide.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"},\"nextItem\":{\"title\":\"Reducing Image Load Online\",\"permalink\":\"/blog/site-optimization\"}},\"content\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way. Yes, you using standalone ``libaom``, ``libsvtav1``, and ``librav1e`` from FFmpeg or even piping ``yuv4mpeg`` into **mainline** aomenc are all unoptimal.\\n\\n\x3c!--truncate--\x3e\\n\\n:::danger Outdated Information\\nWhile a lot of the information presented in this guide is still relevant and correct, the AV1 ecosystem has changed dramatically since this guide's inception which has demanded a rewrite. Please see the [AV1 for Dummies](https://wiki.x266.mov/blog/av1-for-dummies) blog post for more information.\\n:::\\n\\n![Compare](/img/compare-guide.webp)\\n\\nIn this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1), unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is **RAM consumption**, encoding 2160p (4K) with [aomenc](https://wiki.x266.mov/docs/encoders/aomenc) with 4 workers could take upwards of **16GB** of RAM! So do keep this in mind.\\n\\n## Installing the Tools\\n\\nGiven all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this.\\n\\n**Jump to**: [Windows](#microsoft-windows) | [macOS](#macos) | [Linux](#linux)\\n\\n## Microsoft Windows\\n\\n### The GUI Way\\n1. Install [NMKODER](https://github.com/n00mkrad/nmkoder) which is a GUI front-end to av1an with all dependencies installed.\\n2. You're done, you can skip to the encoding part\\n\\n:::danger Almost abandonware\\nSince Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal.\\n:::\\n\\n### The WSL2 Way\\n\\n*(Recommended)*\\n\\nIf you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good.\\n\\nThe easiest way to encode with WSL2 is to use [rAV1ator CLI](https://wiki.x266.mov/docs/utilities/rav1ator-cli), an interactive TUI for [Av1an](https://wiki.x266.mov/docs/utilities/av1an). An ArchWSL2 installation tutorial is provided [here](https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows).\\n\\n### The Automated Way\\n\\nThere is now a batch script for automating the install process, which can be found [here](https://github.com/Hishiro64/av1an-win-script). The instructions are in the README file.\\n\\n:::caution\\nThe script will download outdated version encoders and tools such as `aom-av1-psy` and MKVToolNix v76.0, if you are fine with these you can proceed.\\n:::\\n\\n### The Manual Way\\n\\n1. Install **Python 3.10.x, this will change so consult from the** [Vapoursynth website](http://www.vapoursynth.com/doc/installation.html) **if you're reading this from the future** from [here](https://www.python.org/downloads/windows/) and select \\\"Windows Installer 64-bit\\\". Upon installation check the tick for adding Python to PATH like so\\n![Python PATH](/img/python-path.webp))\\n\\n2. Download and install Vapoursynth from [here](https://github.com/vapoursynth/vapoursynth/releases) and select \\\"VapourSynth64-RXX.exe\\\"\\n3. Open the terminal and type ``vsrepo.py install lsmas ffms2`` to install some plugins for Av1an to work.\\n4. Download MKVToolNix from [here](https://mkvtoolnix.download/downloads.html#windows), select \\\"mkvtoolnix-64bit-XX.X.X-setup.exe\\\", and install **(Also available on winget!)**\\n5. Download Av1an from [here](https://github.com/master-of-zen/Av1an/releases) (SELECT LATEST AND CLICK THE \\\"ASSETS\\\" DROPDOWN)\\n6. Download **shared libraries** FFmpeg from [gyan.dev](https://www.gyan.dev/ffmpeg/builds)\\n7. Download a pre-built fork of Aomenc ([aom-av1-lavish](https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging)) which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows [here](https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28) *(Current as of Sept 6, 2023)*\\n:::info\\nIf you opt to compile aomenc yourself, you can view the instructions on how to do that [here](https://wiki.x266.mov/docs/encoders/aomenc/#installation).\\n:::\\n8. Move Av1an, FFmpeg **(Including the FFmpeg DLLs)**, and aomenc to somewhere preferable, eg ``C:\\\\Encoding``.\\n9. Add the folder **AND MKVTOOLNIX INSTALLATION FOLDER** to the [Windows PATH environment](https://www.maketecheasier.com/what-is-the-windows-path/).\\n\\n\\n## macOS\\n\\nmacOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend.\\n\\n**Homebrew + Macports for Av1an + rav1e:**\\n*Note that some commands may have to be run with `sudo`, which I won't explicitly include for security reasons.*\\n\\nInstalling the Homebrew package manager is a well documented process at this point:\\n```bash\\n/bin/bash -c \\\"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\\\"\\n```\\n\\nAs is installing MacPorts. Install the relevent `.pkg` for your macOS version from the MacPorts Project website:\\n[www.macports.org/install.php](https://www.macports.org/install.php)\\n\\nNow, you can run the following commands:\\n```bash\\nbrew update && brew upgrade\\nbrew install rav1e aom mkvtoolnix ffmpeg\\n# Usually you must run MacPorts commands for package installations as root\\nport upgrade outdated\\nport install av1an\\n```\\n\\nThis is the easiest way to get everything set up & working to produce AV1 video with `rav1e` or mainline `aomenc` & Av1an. You can check that things are installed by running the following commands & parsing their output:\\n```bash\\n% av1an --version\\nav1an 0.4.1-unstable (rev e10880d) (Release)\\n\\n* Compiler\\n rustc 1.70.0 (LLVM 16.0)\\n\\n* Target Triple\\n aarch64-apple-darwin\\n\\n* Date Info\\n Commit Date: 2023-06-25\\n\\n* VapourSynth Plugins\\n systems.innocent.lsmas : Not found\\n com.vapoursynth.ffms2 : Not found\\n```\\n```bash\\n% rav1e --version | grep \\\"release\\\" -C 1\\nrav1e 0.6.6 () (release)\\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\\n```\\n```bash\\n% aomenc --help | grep \\\"AOMedia\\\" -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice `systems.innocent.lsmas : Not found` in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through `-m hybrid`. This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:\\n\\n```bash\\nav1an -i \\\"input\\\" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v \\\" --tiles 8 -s 4 --quantizer 80 --no-scene-detection\\\" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o \\\"output.mkv\\\"\\n```\\n\\n**Building From Source**\\n\\nIf you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:\\n\\n- macOS sometimes doesn't have a `/usr/local/bin` by default. You can fix this by doing `mkdir /usr/local/bin`.\\n- Homebrew installs *everything* in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from `/opt/homebrew/lib` to `/usr/local/lib`. Finding them is a matter of `ls | grep \\\"keyword\\\"` & copying what looks reasonable to be associated with the tool you're using.\\n- Building most things from source will have instructions for \\\\*nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example.\\n```bash\\nbrew install git rust nasm\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\ncd .. && cd target/release\\ncp av1an /usr/local/bin\\n```\\n\\n**More Difficult: Building aom-av1-lavish from Source**\\n\\nIf you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:\\n```bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish\\n```\\nNow, you need to make some manual changes to the source code until Clybius merges [this commit](https://github.com/Clybius/aom-av1-lavish/pull/1/files).\\n- Add the line `#include \\\"aq_variance.h\\\"` at line 19 in `av1/encoder/encodeframe_utils.c`\\n- Comment out line 2546 in `av1/encoder/speed_features.c`. This line is `const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };` & becomes `// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };`.\\n\\nNow you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the `aom-av1-lavish` directory:\\n```bash\\nmkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\" -DCMAKE_LD_FLAGS=\\\"-flto -O3 -march=native\\\"\\nmake -j$(nproc)\\n# This may need to be run as root:\\nmake install\\n```\\n\\nNow you can run `aomenc --help | grep \\\"AOMedia\\\" -C 3` to see if lavish installed. If you're getting the same output as above, you may need to copy the `aomenc` executable to `/opt/local/bin`, `/usr/local/bin`, & `/opt/homebrew/bin` if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:\\n```bash\\n% aomenc --help | grep AOMedia -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice how it says `AOMedia Project AV1 Encoder Psy` instead of `AOMedia Project AV1 Encoder`. You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below.\\n\\n## Linux\\n\\n:::info\\nYet again, try using Arch. It's way easier.\\n:::\\n\\n### The GUI Way\\n\\n- Install [Aviator](https://github.com/gianni-rosato/aviator) ([SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1) + [FFmpeg](https://wiki.x266.mov/docs/utilities/FFmpeg)) or [rAV1ator](https://giannirosato.com/blog/post/aviator-1/) basically same thing but [Av1an](https://wiki.x266.mov/docs/utilities/av1an.mdx) + [rav1e](https://wiki.x266.mov/docs/encoders/rav1e). Both are only available as [Flatpaks](https://beta.flathub.org/apps/net.natesales.Aviator). Keep in mind Aviator ships with **SVT-AV1** and rAV1ator with **rav1e** instead of aomenc/AOM-AV1, which I will not be covering here.\\n\\n### The TUI Way\\n\\n*(Recommended)*\\n\\n- Install [rav1ator-cli](https://wiki.x266.mov/docs/utilities/rav1ator-cli), a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See [this page](https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation) for more info. Can be easily used on any distro.\\n\\n### The Compiling Route\\n\\n#### Ubuntu\\n\\nThe guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via `rustup` first, as apt version of Rust is severely outdated, then you can continue.\\n\\nInstall dependencies:\\n```bash\\nsudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\\n```\\n\\nInstall l-smash:\\n```bash\\ngit clone https://github.com/l-smash/l-smash.git\\ncd l-smash\\n./configure --enable-shared --extra-cflags=\\\"-march=native\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall zimg:\\n```bash\\ngit clone --recursive https://github.com/sekrit-twc/zimg.git\\ncd zimg\\n./autogen.sh\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall ImageMagick:\\n```bash\\ngit clone https://github.com/ImageMagick/ImageMagick\\ncd ImageMagick\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall Vapoursynth R63:\\n```bash\\nwget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\\nunzip R63.zip\\ncd vapoursynth-R63\\n./autogen.sh\\n./configure CFLAGS=\\\"-march=native\\\" CXXFLAGS=\\\"-march=native\\\" --libdir=/usr/lib\\nmake -j$(nproc)\\nsudo make install\\nsudo mkdir /usr/lib/vapoursynth\\nsudo ldconfig\\n```\\nThe plugin directory will be located in `/usr/lib/vapoursynth`.\\n\\n\\nInstall L-SMASH-Works Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args=\\\"-march=native\\\" -Dcpp_args=\\\"-march=native\\\"\\nninja -j$(nproc)\\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\\n```\\n\\n:::danger\\nL-SMASH-Works doesn't work on **aarch64**, it is recommended to use other plugins instead.\\n:::\\n\\nInstall FFMS2 Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/FFMS/ffms2\\ncd ffms2\\n./autogen.sh\\n./configure CFLAGS=\\\"-O3 -march=native\\\" CXXFLAGS=\\\"-O3 -march=native\\\"\\nmake -j$(nproc)\\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\\n```\\n\\nInstall Av1an:\\n```bash\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\nsudo cp target/release/av1an /usr/local/bin\\n```\\n\\nWhen there's no errors, proceed to compiling `aom-av1-lavish`.\\n\\n### Arch\\n\\nInstall dependencies:\\n```bash\\nsudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\\n```\\n\\nyou're done, proceed.\\n\\n#### Compiling aom-av1-lavish\\n``` bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\n## Encoding\\n\\nThe moment you've all been waiting for, let's just get into it. Here's an example *recommended* parameter as of now (09/03/23) [MM/DD/YY]:\\n```bash\\nav1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a \\\" -an \\\" -f \\\" -an \\\" -v \\\" --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 \\\" -o \\\"output.mkv\\\"\\n```\\n\\n:::info Parameter Meta\\nIt is strongly recommended to join the [AV1 Discord server](https://discord.gg/vpREHAvYvh) to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general.\\n:::\\nNow let's dissect it one-by-one\\n\\n**Av1an parameters:**\\n\\n- ``-i`` Input.\\n\\n- ``-x 300`` Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability.\\n\\n- ``-w 4`` Specifies the amount of \\\"workers\\\" or amount of encoders working on the video.\\n\\n- ``--verbose`` Sets logging to verbose.\\n\\n- ``--resume`` Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \\\"resumed\\\" without the parameter in place.\\n\\n- ``-e aom`` Specifies we're using aomenc encoder which should be the default option.\\n\\n- ``-c mkvmerge`` Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method.\\n\\n- ``-m lsmash`` Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0).\\n\\n- ``-f \\\" -an \\\"`` ``-f`` Stands for ffmpeg parameters, ``-an`` is to remove all audio since its better to encode and merge it separately. To crop use ``-f \\\" -an -vf crop=1920:800 \\\"`` for example to crop the video to 1920x800.\\n\\n- ``-v \\\" \\\"`` Is where you put the encoder's parameters in.\\n\\n- ``-a \\\" -an \\\"`` FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: `-a \\\" -c:a libopus -b:a 128k \\\"`.\\n\\n- ``--photon-noise=10`` AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films.\\n\\n- ``--set-thread-affinity=2`` Pins the thread to the encoder, aligns with ``--threads=2`` in the encoder parameter so set them accordingly.\\n\\n\\n**aomenc parameters:**\\n- ``--bit-depth=10`` We're using 10bit because it makes the video smaller and reduces [banding](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring).\\n\\n- ``--cpu-used=4`` This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish).\\n\\n- ``--end-usage=q --cq-level=24`` This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24.\\n\\n- `--threads=2` Sets the amount of threads the encoder can use, aligns with `--set-thread-affinity` in Av1an.\\n\\n- ``--tile-columns=0 --tile-rows=0`` This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):\\n\\n \\n \\\"Tiling\\\"\\n\\n\\n:::note Tile usage\\nDo NOT use tiles for 1080p and below, use 1 ``tile-columns`` at 1440p (2K), 2 ``tile-columns`` and 1 ``tile-rows`` for 2160p (4K)\\n:::\\n\\n- ``--lag-in-frames=64`` Similar to x264/x265 `rc-lookahead`. Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful.\\n\\n- ``--aq-mode`` adaptive quantization mode, 0 is better most of the time\\n\\n- ``--tune-content=psy --tune=ssim`` As the name suggests they are tunes that affect the video output, for the better, and for the worst\\n\\n:::info Tunes to use\\nSet ``tune-content`` to ``animation`` if you're encoding above ``cq-level=30`` A.K.A lower quality, despite it's name\\nSet ``tune-content`` to ``psy`` for everything else, **do not use if you encode above ``cq-level=30``**\\nFor ``tune``, this is a bit tricky. For now, the meta seems to be ``ssim``, but back then it was ``lavish`` which is considered THE best tune because it's based on [butteraugli](https://github.com/google/butteraugli). Now it's fallen behind because its more blurry than ``ssim``, and before that it was ``butteraugli``, and then ``ipq_vmaf_psy``, and finally just ``ipq``.\\nIf you use any of the VMAF tunes, **you need to specify ``--vmaf-model-path=`` to where you put it**.\\n:::\\n\\n- ``--enable-keyframe-filtering=1`` We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it.\\n\\n- ``--sb-size=dynamic`` Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it.\\n\\n- ``--deltaq-mode`` set to 0 because its just better.\\n\\n- ``--arnr-strength=1`` Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess.\\n\\n- ``--disable-kf --enable-fwd-kf=0`` We're disabling keyframes cause **Av1an already did scene detection, so we wont have to.**. And it speeds things up.\\n\\n- ``--kf-max-dist=9999`` Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default\\n\\n- ``--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost.\\n\\n- ``--enable-dnl-denoising=0`` Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well.\\n\\n\\n:::info Concatenation Error on Linux\\nRun ``ulimit -n 200000``, resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ``mkvmerge @../options.json``\\n:::\\n\\n\\n## Merging Everything\\n\\nOnce you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into `mp4`, just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental.\\n\\n\\n## Tips & Tricks\\n\\n- `--denoise-noise-level=10` Alternative to `photon-noise`, slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns.\\n\\n- `--arnr-maxframes` to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates.\\n\\n- `--butteraugli-resize-factor=2` if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and `--butteraugli-intensity-target=250` to match the content light level.\\n\\n\\n## Final Thoughts\\n\\nEncoding has always been about experimentation for the best, there is really no \\\"One size fits all\\\" for encoding content, as they differ from scene complexity, how it's captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!\\n\\n> **Guide originally hosted on https://rentry.co/AV1, rewrite and migration by Simulping.**\"},{\"id\":\"site-optimization\",\"metadata\":{\"permalink\":\"/blog/site-optimization\",\"source\":\"@site/blog/2023-07-21-site-optimization.mdx\",\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"date\":\"2023-07-21T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"image\",\"permalink\":\"/blog/tags/image\"},{\"inline\":true,\"label\":\"web\",\"permalink\":\"/blog/tags/web\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":9.25,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"socials\":{},\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"slug\":\"site-optimization\",\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"image\",\"web\",\"compression\"],\"image\":\"/img/_DSC8466-smaller.jpg\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.\\n\\n\x3c!--truncate--\x3e\\n\\n:::caution\\nThese instructions are for *photographic* images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.\\n:::\\n\\n:::danger\\nMany images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:\\n- [Thorium](https://thorium.rocks/) | *Linux, [macOS](https://github.com/Alex313031/Thorium-Special/releases), [Windows](https://github.com/Alex313031/thorium/releases/), [Android](https://github.com/Alex313031/Thorium-Special/releases)*\\n- [Waterfox](https://www.waterfox.net/) | *[Linux](https://flathub.org/apps/net.waterfox.waterfox), [macOS](https://www.waterfox.net/download/), [Windows](https://www.waterfox.net/download/)*\\n- [Mercury](https://thorium.rocks/mercury) | *[Linux](https://github.com/Alex313031/Mercury/releases), [Windows](https://github.com/Alex313031/Mercury/releases)*\\n:::\\n\\n## Fire & Forget\\n\\nFirst, we'll illustrate what *not* to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:\\n\\n*exported straight from Darktable at JPEG q90, with no scaling*\\n\\n![bloated_jpeg](/img/_DSC8466.jpg)\\n\\n**2.2 MB**\\n\\n## Massive Improvement\\n\\nThe easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway.\\n\\n![box-size-mac](/img/box-size-mac.avif)\\n*Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here.*\\n\\nThe width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with `cjpegli`, looks like this:\\n\\n![smaller_jpeg](/img/_DSC8466-smaller.jpg)\\n\\nObviously, there's lost fidelity compared to the original, but considering this is *so much smaller*, it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of `cjpegli`, although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size.\\n\\n2.2 MB -> **233 kB**\\n\\n### Lazy Loading\\n\\nA bonus tip is to add the `loading=\\\"lazy\\\"` attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:\\n\\n```html\\n\\n \\\"alt\\n \\n```\\n\\n## New Codecs\\n\\nIf you desire further improvement, it may be time to consider using a newer codec like [AVIF](https://wiki.x266.mov/docs/images/AVIF) or [JPEG-XL](https://wiki.x266.mov/docs/images/JXL). These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider [WebP](/docs/images/WebP) or [HEIC](/docs/images/HEIC), since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering *lossy* compression for *photographic* images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now.\\n\\n### Fallbacks\\n\\nAVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:\\n\\n```html\\n\\n \\n \\n \\n \\\"alt\\n \\n```\\n\\nHere is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most.\\n\\n### Compression Efficacy\\n\\nLet's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with `cjpegli` (which scores ~`83.01` with the [SSIMULACRA2](/docs/metrics/SSIMULACRA2) visual fidelity metric).\\n\\n![smaller_jxl](/img/_DSC8466-smaller.jxl)\\n\\n**137.0 kB** *JPEG-XL image, encoded with `cjxl lossless.png out.jxl -d 1.49 -e 9`. Score: ~`83.04`* *3.06s user time*\\n\\n![smaller_avif](/img/_DSC8466-smaller.avif)\\n\\n**124.8 kB** *AVIF image, encoded with `avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif`. Score: ~`83.03`* *7.54s user time*\\n\\nJXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the `ssimulacra2` program decodes JPEG & JXL. Either way, the scores are fairly close.\\n\\n![smaller_jxl_jpeg-recomp](/img/_DSC8466-smaller-recomp.jxl)\\n\\n**189.4 kB** *JPEG-XL image from JPEG, encoded with `cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11`. Score: ~`84.92` (???)* *0.67s user time*\\n\\nThe final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with `cjpegli` encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine).\\n\\n![smaller_jpeg_xyb](/img/_DSC8466-smaller-xyb.jpg)\\n\\n**208.3 kB** *XYB JPEG, encoded with `cjpegli lossless.png out.jpg --xyb -d 1.155`. Score: ~`83.04`* *0.10s user time*\\n\\nIn this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode.\\n\\n## Responsive Images\\n\\nDisplaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the [Responsive Image Linter](https://ausi.github.io/respimagelint/) that can help us figure out which image sizes we should be using.\\n\\n![responsive_image_linter](/img/responsive_image_linter.avif)\\n\\nIn our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:\\n\\n```html\\n\\n \\n \\n \\\"alt\\n\\n```\\n\\nIt is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:\\n\\n- `srcset` = the images available to your browser to serve, & their respective widths\\n- `sizes` = the conditions given to the browser explaining under what conditions should it serve which image\\n- `(min-width: XXXpx) YYYpx` = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels \\\\* display scaling.\\n- `calc(100vw - 24px)` = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have `(min-width: 997px) calc(75vw - 257px)`. This means given the viewport is at least 997px wide, calculate 0.75 \\\\* the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified.\\n\\n\\n \\n \\n \\\"alt\\n\\n\\nThat's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their [Reduce Your Page's Image Load](https://autocompressor.net/blog/reduce-image-load) blog post when writing this entry. I have [confirmed](https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI) with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0.\"}]}}")}}]); \ No newline at end of file diff --git a/assets/js/f81c1134.c4783553.js b/assets/js/f81c1134.c4783553.js deleted file mode 100644 index 21ae67060..000000000 --- a/assets/js/f81c1134.c4783553.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8130],{7735:e=>{e.exports=JSON.parse("{\"archive\":{\"blogPosts\":[{\"id\":\"codec-wiki-one-year-later\",\"metadata\":{\"permalink\":\"/blog/codec-wiki-one-year-later\",\"source\":\"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx\",\"title\":\"Codec Wiki: One Year Later\",\"description\":\"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.\",\"date\":\"2024-07-20T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"anniversary\",\"permalink\":\"/blog/tags/anniversary\"},{\"inline\":true,\"label\":\"history\",\"permalink\":\"/blog/tags/history\"}],\"readingTime\":3.785,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Codec Wiki: One Year Later\",\"description\":\"Codec's Wiki turbulent one-year journey since it's inception to everyone's go-to site for encoding documentation.\",\"slug\":\"codec-wiki-one-year-later\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"anniversary\",\"history\"],\"hide_table_of_contents\":false},\"unlisted\":false,\"nextItem\":{\"title\":\"AV1 for Dummies\",\"permalink\":\"/blog/av1-for-dummies\"}},\"content\":\"Around a month ago, Codec Wiki celebrates it's very first anniversary as it officially hits one year old (Wow, that's a very long time!).\\r\\n\\r\\n\x3c!--truncate--\x3e\\r\\n\\r\\nFirst and foremost, I apologize for this delayed celebration post, I have been very busy for the past month, y'know, real life things. Second of all, I would like to say **THANK YOU** for everyone who helped build this wiki from the ground up and writing down the entries, you know who you are!\\r\\n\\r\\n## Stats\\r\\n\\r\\nThanks to everyone's efforts, over the course of 12 months Codec Wiki has grown into the (almost) go-to documentation and guide for newcomers just starting out in the quirky and wild world of multimedia encoding. So here are some pretty graphs to look at our progress so far!\\r\\n\\r\\n### Plausible\\r\\n\\r\\nAs you may know, we run our own Plausible Analytics instance. Which is a self-hosted, open source, and privacy-respecting analytics. Currently hosted in Singapore and available for everyone to view [here](https://analytics.x266.mov/wiki.x266.mov).\\r\\n\\r\\n\\r\\n \\r\\n \\\"Plausible\\r\\n\\r\\n\\r\\n7.7K unique total visitors for a whole year may not be much but it's a great start!\\r\\n\\r\\nLet's not forget those who use uBlock Origin or similar to block the analytics script. So the visitor count could be two or three times more!\\r\\n\\r\\n\\r\\n### Google Search Console\\r\\n\\r\\nFor those who are unfamiliar, Google Search Console is used for viewing well.. Google search data for your website. This data is unfortunately private and only the owner and those invited can see the data, no setting available for public view. Probably for the better.\\r\\n\\r\\n\\r\\n \\r\\n \\\"Google\\r\\n\\r\\n



\\r\\n\\r\\nAnd for our top 10 search queries in the last 28 days:\\r\\n\\r\\n\\r\\n \\r\\n \\\"Search\\r\\n\\r\\n\\r\\n \\r\\n \\\"Search\\r\\n\\r\\n



\\r\\n\\r\\nWith pretty much zero competition in this niche of a market, it skyrocketed Codec Wiki to the top of search results for everything multimedia related \ud83d\ude05.\\r\\n\\r\\n\\r\\n## A Brief History\\r\\n\\r\\nAround a year ago, I started work on an unofficial \\\"wiki\\\" for all things encoding, it initially started as a half-serious joke because I was annoyed there were no good documentation available\\r\\nanywhere on the internet on the real application and usage of encoders such as \\\"Should I use tune SSIM in x encoder?\\\". With the search results you'll be presented with being one or more of these:\\r\\n\\r\\n- Doesn't exist.\\r\\n- Mentioned in the FFmpeg mailing list but nothing else.\\r\\n- PDF research papers on IEEE and similar.\\r\\n- Outdated information on Doom9 or Multimedia Wiki.\\r\\n- \\\"The documentation are in the code blocks\\\".\\r\\n- Link rot.\\r\\n- Abandoned, or mostly focused on other topics.\\r\\n- Focused on a specific type of storytelling medium.\\r\\n- Actual good explanation in an old forgotten site (rare).\\r\\n\\r\\nSome or maybe even most of these results still appear up to this day.\\r\\n\\r\\n\\r\\nFrustrated with how scarce information is available on the open internet and combined with the fact that most, if not all of them only exist in non-search-engine-reachable private chat communities such as Discord where you'll have to join and scroll around older conversations.\\r\\n\\r\\nProne to data erasure as Discord can nuke these servers for whatever reason they please and years of \\\"documentation\\\" is lost in an instant. It is simply not a good platform for a plethora of valuable information.\\r\\n\\r\\n**That's why I took initiative.**\\r\\n\\r\\n\\r\\n## Bumps in the Road\\r\\n\\r\\nThere were also generally a lot of distrust and pushbacks when this project first began, particularly from those who are more experienced with encoding. Which is understandable because everyone who attempted before burned out and never finished it.\\r\\n\\r\\nBut Codec Wiki stood the test of time with constant updates through active collaboration of everyone involved, nowadays those voices have mostly subsided or even joined the project themselves. And I am grateful for that.\\r\\n\\r\\n\\r\\n## Closing Statement\\r\\n\\r\\nOnce again, **THANK YOU VERY MUCH** for those who are involved in this project and making the once pipe dream of a one-stop-shop user-friendly documentation for encoding into something that's possible.\\r\\n\\r\\nLet's continue documenting the most crucial yet invisible driving force of internet traffic, pages by pages.\\r\\n\\r\\nTogether we are strong, divided we burn out.\\r\\n\\r\\n\\r\\n

\\r\\n> \\\"There are times when a critic truly risks something, and that is the discovery and defense of the *new*. **The world is often unkind to new talent, new creations. The new needs friends**.\\\"\\r\\n>\\r\\n> \u2014 Anton Ego\"},{\"id\":\"av1-for-dummies\",\"metadata\":{\"permalink\":\"/blog/av1-for-dummies\",\"source\":\"@site/blog/2024-06-24-av1-for-dummies-2.mdx\",\"title\":\"AV1 for Dummies\",\"description\":\"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.\",\"date\":\"2024-06-24T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":16.645,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"key\":null,\"page\":null},{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"AV1 for Dummies\",\"description\":\"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.\",\"slug\":\"av1-for-dummies\",\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"},{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"video\",\"compression\"],\"image\":\"/img/av1_for_dummies_guide.jpg\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Codec Wiki: One Year Later\",\"permalink\":\"/blog/codec-wiki-one-year-later\"},\"nextItem\":{\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"permalink\":\"/blog/svt-av1-second-deep-dive\"}},\"content\":\"AV1 for Dummies is a comprehensive, legible guide on how to get started with AV1 at any experience level. Whether you're on Windows using your first video encoding program, or a seasoned Linux user looking to optimize your encoding pipeline, this guide has you covered.\\n\\n\x3c!--truncate--\x3e\\n\\n![Compare](/img/av1_for_dummies_guide.avif)\\n\\n## Introduction\\n\\n[AV1](https://wiki.x266.mov/docs/video/AV1) is a royalty-free video codec developed by the Alliance for Open Media. It is designed to replace [VP9](https://wiki.x266.mov/docs/video/VP9) and presently competes with [H.266](https://wiki.x266.mov/docs/video/VVC). AV1 is known for its high compression efficiency, which the marketing will have you believe reduces file sizes by up to 50% compared to [H.264](https://wiki.x266.mov/docs/video/AVC) and up to 30% compared to [H.265](https://wiki.x266.mov/docs/video/HEVC) across the board. It is supported by several major browsers and is widely used across many streaming services and video platforms.\\n\\n### Why AV1?\\n\\nBefore we dive in, it is important to understand *why* you may want to use AV1 instead of other codecs. The reality is that AV1 is *not* better than H.264/5 in every single scenario; video encoding is a complicated field, and the best codec for you will depend on your specific needs. AV1 excels in:\\n- Low to medium-high fidelity encoding\\n- Higher resolution encoding\\n- Encoding content with very little grain or noise\\n- Slow, non-realtime contexts (e.g. offline encoding)\\n\\nThe enumeration above still consists of broad strokes, but the point is to understand that AV1 is not a silver bullet. It will not automatically make your videos smaller while preserving your desired quality. To make things more difficult, the [x264](https://wiki.x266.mov/docs/encoders/x264) & [x265](https://wiki.x266.mov/docs/encoders/x265) encoders are very mature, while AV1 encoding efforts designed to meet the extremely complicated needs of the human eye are still in their infancy.\\n\\nThis guide focuses almost entirely on tools great for offline, non-realtime encoding for various kinds of content. Streaming is an altogether different application of AV1, and is only covered sparsely here.\\n\\n### Do's & Don'ts\\n\\nDue to a lot of misunderstandings about codecs and compression, there are a lot of common misconceptions that are held regarding video encoding. We'll start by outlining some bad practices:\\n\\n- **Don't** encode the same video multiple times. This is a common mistake made by people new to video encoding. Every time you encode a video, you lose additional quality due to *generation loss*. This is because video codecs are lossy, and every time you encode a video, you lose more information. This is why it is important to keep the original video file if you frequently re-encode it.\\n- **Don't** blindly copy settings from others without understanding them. What works for one person's content and workflow may not work for yours. Even the default settings on many encoders are not optimal for most content.\\n- **Don't** assume that higher bitrate equates to better quality. Inefficient encoding can waste bits without improving visual quality, and efficient encoding can make lower bitrate video look drastically better than higher bitrate video using the same codec.\\n- **Don't** assume all encoders/presets/settings/implementations are created equal. Even given two encoding frameworks that use the same underlying encoder, you may achieve different results given encoder version mismatches or subtly different settings used under the hood.\\n- **Don't** use unnecessarily slow presets/speeds unless you have a specific need and ample time. While slower presets improve encoding efficiency most of the time, the quality gains reach a point of diminishing returns beyond a certain point. Use the slowest preset you can tolerate, not the slowest preset available.\\n- **Don't** blindly trust metric scores. It is unfortunate how trusted [VMAF](https://wiki.x266.mov/docs/metrics/VMAF) is considering how infrequently it correlates with visual fidelity in practice now that it has become so popular. Even the beloved [SSIMULACRA2](https://wiki.x266.mov/docs/metrics/SSIMULACRA2) is not a perfect one-to-one with the human eye.\\n\\nNow, let's move on to some **good** practices:\\n- Experiment with different settings and compare the results.\\n- Consider your content type when choosing encoding settings. Film, animation, and sports all have different characteristics that benefit from distinct approaches.\\n- Try to use CRF for offline encoding, as opposed to CBR or VBR. While the latter two are effective for precisely targeting a particular bitrate, CRF is more effective at targeting a specific quality level efficiently.\\n- Always use 10-bit color, even with an 8-bit source. AV1's internal workings are much more suited to 10-bit color, and you are almost always guaranteed quality improvements with zero compatibility penalty as 10-bit color is part of AV1's baseline profile.\\n- Consider using grain synthesis for grainy content, as AV1 can struggle with preserving film grain efficiently.\\n- Keep your encoding software up-to-date; the encoding world moves quickly.\\n\\n## Tools\\n\\nSince writing the last guide, there are now several versatile tools available for AV1 encoding. Below, we've assembled some tables of popular encoding tools and their features.\\n\\n### GUI\\n\\nHere's the key:\\n- **Encoder(s)**: The AV1 encoder(s) the software uses or is able to use. This is between [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1), [aomenc](https://wiki.x266.mov/docs/encoders/aomenc), [rav1e](https://wiki.x266.mov/docs/encoders/rav1e), [SVT-AV1-PSY](https://wiki.x266.mov/docs/encoders/SVT-AV1-PSY), and various aomenc forks. We'll get into this more later.\\n- **Ease of Use**: How intuitive the software is, especially for beginners.\\n- **Complexity**: How flexible the software can be for advanced users.\\n- **Efficiency**: How \\\"good\\\" the underlying encoder(s) are. This is more subjective, but tools with bad defaults, misleading options, or slow release cycles won't score well here.\\n\\n| Name | Platform(s) | Encoder(s) | Ease of Use | Complexity | Efficiency |\\n|---------|-------------|:----------:|:-----------:|:-----------:|------------|\\n| [Aviator](https://wiki.x266.mov/docs/utilities/Aviator) | Linux | SVT-AV1-PSY| \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cb\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf |\\n| [NMKODER](https://wiki.x266.mov/docs/utilities/nmkoder) | Windows | Any | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb |\\n| [Av1ation Station](https://github.com/Av1ation-Association/Av1ation-Creations/releases/) | Any | Any | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cf\u25cb |\\n| [StaxRip](https://github.com/staxrip/staxrip) | Windows | Any | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cf\u25cb |\\n| [NEAV1E](https://github.com/Alkl58/NotEnoughAV1Encodes) | Windows | Any | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb |\\n| [Handbrake](https://handbrake.fr/) | Any | SVT-AV1 | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb |\\n| [FastFlix](https://github.com/cdgriffith/FastFlix) | Any | Any | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb |\\n| [rAV1ator](https://wiki.x266.mov/docs/utilities/rav1ator) | Linux | rav1e | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cf\u25cb\u25cb | \u25cf\u25cb\u25cb\u25cb\u25cb |\\n| [Autocompressor](https://autocompressor.net/) | Web | SVT-AV1 | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cb\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cb\u25cb |\\n\\nOur top pics are:\\n- For beginners: **Aviator**. If you are on Linux and you want zero hassle whatsoever, Aviator is simple but highly effective. As a Flatpak application, it ships a bundled SVT-AV1-PSY binary that is up-to-date, compiled efficiently, and handled with extensively tested defaults. It is hard to go wrong with Aviator even as an advanced user, despite its simplicity.\\n- For advanced users: **Av1ation Station**. Av1ator Station is thoughtfully designed to be your one-stop shop for video encoding. Even though it is brand new, it has proven itself to be a capable and reliable solution for advanced video encoders that have a lot of settings to tweak and encodes to keep track of.\\n- For Windows users: **StaxRip**. StaxRip is a long-standing, well-maintained, and highly flexible video encoding tool that supports a plethora of encoders and formats. It comes bundled with SVT-AV1-PSY and is a great choice for Windows users who want a powerful and versatile tool for video encoding.\\n\\n### CLI\\n\\nIn the terminal, advanced encoders can explore a much greater degree of complexity than many GUIs allow. That being said, ease of use is still a consideration when managing complex command-line encoding workflows. Let's begin with the key:\\n- We're omitting the \\\"Platform(s)\\\" column here, as this section targets Linux users. As a Windows user, WSL has you covered - as a Mac user, you're likely to experience parity with Linux (most of the time).\\n\\n| Name | Framework(s) | Ease of Use | Complexity | Features | Scene Detection |\\n|------|--------------|:-----------:|:----------:|:--------:|:---------------:|\\n| SvtAv1EncApp | None | \u25cf\u25cb\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cb\u25cb\u25cb\u25cb | No |\\n| [FFmpeg](https://wiki.x266.mov/docs/utilities/ffmpeg) | Itself | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cf\u25cb | No |\\n| [Av1an](https://wiki.x266.mov/docs/utilities/av1an) | FFmpeg | \u25cf\u25cb\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cb\u25cb | Yes |\\n| [rAV1ator CLI](https://wiki.x266.mov/docs/utilities/rav1ator-cli) | Av1an | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cb | Yes |\\n| [alabamaEncoder](https://github.com/kingstefan26/alabamaEncoder) | FFmpeg | \u25cf\u25cf\u25cb\u25cb\u25cb | \u25cf\u25cf\u25cf\u25cf\u25cf | \u25cf\u25cf\u25cf\u25cf\u25cf | Yes |\\n\\nOur top picks are:\\n- For beginners: **rAV1ator CLI**. rAV1ator CLI essentially walks you through the process of writing Av1an commands. It can install binaries for you, save your previous commands, and detect scenes via Av1an. This makes it a great choice for beginners who want to learn the ropes of AV1 encoding without diving into the deep end headfirst. For advanced users, it makes rapidly writing, testing, & cataloging Av1an encoding commands much simpler.\\n- For advanced users: **alabamaEncoder**. alabamaEncoder is a powerful and flexible tool that allows you to encode video with FFmpeg and AV1. It is highly configurable and supports a mind-bending array of powerful features that would be hard to find elsewhere. While the tool is still new, it is already a great choice for advanced users who want to push the boundaries of what is possible to incorporate into an encoding workflow.\\n\\n### Conclusion\\n\\nIn conclusion, the best AV1 tool for you will depend on your needs and experience level. If you are a beginner, Aviator is a great choice for Linux users, while StaxRip is a good option for Windows users. For advanced users, Av1ation Station is a powerful and versatile tool that can handle numerous encoding tasks. If you prefer the command line, rAV1ator CLI is a great choice for beginners, while alabamaEncoder is a powerful tool for advanced users. No matter which tool you choose, it is hard to go wrong in the modern AV1 encoding landscape when it comes to your utility of choice.\\n\\n## Encoders\\n\\nThe world of AV1 encoding is diverse and complex, with several open-source encoders available, each bringing its own set of strengths, weaknesses, and unique features to the table. In this section, we'll dive deep into the characteristics of four major AV1 encoders:\\n1. SVT-AV1,\\n2. rav1e,\\n3. aomenc (libaom), and\\n4. SVT-AV1-PSY\\n\\nUnderstanding these encoders is crucial for making informed decisions about what best suits your specific encoding needs.\\n\\n### SVT-AV1\\n\\n[SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1) (Scalable Video Technology for AV1) is an AV1 encoder library and application developed by Intel, Netflix, and others. It has gained significant popularity in the encoding community due to its impressive balance of speed, quality, and scalability.\\n\\nLinks:\\n- Wiki page: [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1)\\n- Git repository: https://gitlab.com/AOMediaCodec/SVT-AV1\\n- Documentation: https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/README.md\\n\\n1. **Performance & Scalability**\\n - SVT-AV1 is renowned for its encoding speed, particularly at higher speed presets.\\n - It leverages parallel processing, making it exceptionally efficient on multi-core systems. Fun fact: SVT-AV1's parallel processing is lossless, so it doesn't compromise quality for speed.\\n\\n2. **Quality-to-Speed Ratio**\\n - SVT-AV1 strikes an impressive balance between encoding speed and output quality.\\n - At faster presets, it usually outperforms other encoders in quality per unit of encoding time.\\n - While it may not achieve the absolute highest *quality per bit* possible, its quality is generally considered impressive for its speed.\\n\\n3. **Flexibility**\\n - SVT-AV1 offers a wide range of encoding options and presets, allowing fine-tuned control over the encoding process.\\n - It provides 14 presets (0-13), with 0 being the slowest and highest quality, and 13 being the fastest but lowest quality.\\n - Advanced options allow users to adjust parameters like hierarchical levels, intra-refresh type, and tuning modes.\\n\\n4. **Continuous Development**\\n - SVT-AV1 receives frequent updates and optimizations, with new releases often coming alongside big changes.\\n - The open-source nature of the project encourages community contributions and rapid feature development.\\n\\nSVT-AV1 is an excellent choice for a wide range of encoding scenarios. It's particularly well-suited for:\\n- High-volume encoding operations where speed is crucial\\n- Live or near-live encoding of high-resolution content\\n- Scenarios where a balance between quality and encoding speed is required\\n- Users with multi-core systems who want to leverage their hardware efficiently\\n\\nSome downsides include:\\n- Higher memory usage compared to other encoders\\n- The developers assess quality via its performance on traditional legacy metrics, which harms its perceptual fidelity ceiling.\\n\\n### rav1e\\n\\n[rav1e](https://wiki.x266.mov/docs/encoders/rav1e) is an AV1 encoder written in Rust & Assembly. Developed by the open-source community alongside Xiph, it brings a unique approach to AV1 encoding with its focus on safety and correctness.\\n\\nLinks:\\n- Wiki page: [rav1e](https://wiki.x266.mov/docs/encoders/rav1e)\\n- Git repository: https://github.com/xiph/rav1e\\n- Documentation: https://github.com/xiph/rav1e/tree/master/doc#readme\\n\\n1. **Safety & Reliability**\\n - Being written in Rust, rav1e emphasizes memory safety and thread safety.\\n - This focus on safety translates to a more stable and reliable encoding process, with reduced risks of crashes or undefined behavior.\\n\\n2. **High Fidelity**\\n - At high fidelity targets - an area where AV1 usually lacks - rav1e is a strong contender compared to other encoders.\\n - It excels in preserving fine details and textures, making it a good choice for high-fidelity encoding.\\n\\n3. **Quality**\\n - While not typically matching aomenc or SVT-AV1 in pure compression efficiency, rav1e can produce high-quality output videos.\\n - It often achieves a good balance between quality and encoding time, especially at medium-speed settings.\\n\\n4. **Perceptually Driven**\\n - rav1e's development is driven by visual fidelity, without relying heavily on metrics.\\n - This focus on perceptual quality leads to a stronger foundation for future potential improvements in visual quality, as well as making the encoder very easy to use as it does not require excessive tweaking.\\n\\nrav1e is well-suited for:\\n- Projects where stability is paramount\\n- Users who prioritize a community-driven, open-source development approach\\n- Encoding tasks where a balance between quality and speed is needed, but the absolute fastest speeds are not required\\n\\nSome limitations of rav1e include:\\n- Lagging development compared to other encoders\\n- Slower encoding speeds compared to SVT-AV1 at similar quality & size\\n- Fewer advanced options compared to other encoders\\n\\n### aomenc (libaom)\\n\\n[aomenc](https://wiki.x266.mov/docs/encoders/aomenc), based on the libaom library, is the reference encoder for AV1. Developed by the Alliance for Open Media (AOM), it is the benchmark for AV1 encoding quality and compliance.\\n\\nLinks:\\n- Wiki page: [aomenc](https://wiki.x266.mov/docs/encoders/aomenc)\\n- Git repository: https://aomedia.googlesource.com/aom/\\n\\n1. **Encoding Quality**\\n - aomenc is widely regarded as the gold standard for AV1 encoding quality.\\n - It often achieves high compression efficiency among AV1 encoders, especially at slower speed settings.\\n - The encoder squeezes out nearly every last bit of efficiency from the AV1 codec, making it ideal for archival purposes or when quality per bit is critical.\\n\\n2. **Encoding Speed**\\n - aomenc is generally the slowest among major AV1 encoders.\\n - It offers 13 CPU speed levels (0-12), but even at its fastest settings, it's typically slower than other encoders at their slower settings.\\n - The slow speed is often considered a trade-off for its high compression efficiency.\\n\\n3. **Extensive Options**\\n - As the reference implementation, aomenc offers the most comprehensive encoding options.\\n - It provides fine-grained control over nearly every aspect of the AV1 encoding process.\\n - Advanced users can tweak many parameters to optimize for specific content types or encoding scenarios.\\n\\n4. **Flexibility**\\n - Being the reference encoder, aomenc produces highly standards-compliant AV1 bitstreams that take advantage of the full arsenal of AV1 features.\\n - It supports 4:2:0 and 4:4:4 chroma subsampling, 8- to 12-bit color depth, and various other advanced features that more specialized encoders like SVT-AV1 do not support.\\n\\naomenc is ideal for:\\n- Scenarios where achieving the highest possible quality is the primary goal\\n- Archival encoding where compression efficiency is crucial\\n- Research and development in video compression\\n- Encoding projects where encoding time is not a significant constraint\\n\\nSome drawbacks of aomenc include:\\n- Unresponsive development driven by legacy metrics, leading to slower adoption of new techniques and ignoring improvements communicated by people outside the Google development team\\n- Cripplingly difficult to use for beginners, with a culture of cargo-culting settings\\n- Slow encoding speeds compared to other AV1 encoders, which has less of an impact on the quality of the output than it used to compared to maturing encoders like SVT-AV1\\n\\n### SVT-AV1-PSY\\n\\n[SVT-AV1-PSY](https://wiki.x266.mov/docs/encoders/svt-av1-psy) is a community fork of the SVT-AV1 encoder focused on psychovisual optimizations to enhance perceived visual quality. It aims at closing the distance between SVT-AV1's high speeds and the perceptual quality of aomenc's slow brute force approach.\\n\\nLinks:\\n- Wiki page: [SVT-AV1-PSY](https://wiki.x266.mov/docs/encoders/svt-av1-psy)\\n- Git repository: https://github.com/gianni-rosato/svt-av1-psy\\n- Documentation: https://github.com/gianni-rosato/svt-av1-psy/blob/master/Docs/PSY-Development.md\\n\\n1. **Perceptual Optimizations**\\n - SVT-AV1-PSY introduces various psychovisual enhancements to improve the perceived quality of encoded video.\\n - These optimizations often result in output that looks better to the human eye, even if it might not always score as well in objective metrics.\\n\\n2. **Additional Features**\\n - Introduces new options like variance boost, which can help maintain detail in high-contrast scenes.\\n - Offers alternative curve options for more nuanced control over the encoding process.\\n - Extends the CRF (Constant Rate Factor) range to 70 (from 63 in mainline SVT-AV1), allowing for extremely low-bitrate encodes.\\n - Introduces additional tuning options, including a new \\\"SSIM with Subjective Quality Tuning\\\" mode that can improve perceived quality.\\n\\n3. **Visual Fidelity Focus**\\n - Aims to produce more visually pleasing results, sometimes at the expense of metric performance.\\n - Includes options like sharpness adjustment and adaptive film grain synthesis which can significantly impact the visual characteristics of the output.\\n - Features modified defaults driven by perceptual quality considerations.\\n\\n4. **Extended HDR Support**\\n - Includes built-in support for Dolby Vision & HDR10+ encoding.\\n - This makes it particularly useful for encoding HDR content without requiring additional post-processing steps or external tools.\\n\\n5. **Performance**\\n - Based on SVT-AV1, it retains the performance characteristics of its parent encoder.\\n - Adds super slow presets (-2 and -3) for research purposes and extremely high-quality encoding. These additional presets can be useful for creating reference encodes or applications where encoding time is not a concern.\\n\\nSVT-AV1-PSY is particularly well-suited for:\\n- Encoding scenarios where subjective visual quality is prioritized over pure metric performance\\n- HDR content encoding in Dolby Vision or HDR10+\\n- Users who want fine-grained control over psychovisual aspects of encoding\\n- Projects that require a balance between the speed of SVT-AV1 and enhanced visual quality\\n- Encoding challenging content with complex textures or high-contrast scenes\\n\\nSome drawbacks are:\\n- Everything that applies to SVT-AV1, including the lack of support for 4:4:4 chroma subsampling and 12-bit color depth that are useful in specific scenarios\\n\\n### Conclusion\\n\\nWhile SVT-AV1 is known for being fast, aomenc is renowned for its high-quality output, and rav1e is recognized for its safety and reliability, each encoder has strengths and weaknesses. The best encoder for you will depend on your specific needs and priorities.\\n\\nAs this guide is focused on offline encoding, **SVT-AV1-PSY** combines aomenc's traditional perceptual strength with SVT-AV1's speed. Like rav1e, it is easy to use due to strong default settings that prevent cargo culting, and overall it can be considered the best of all three worlds. It is actively developed by a team of responsive community members, and it is a great choice for most users who want a balance between quality per bit, speed, and ease of use.\\n\\nThe \\\"best\\\" encoder often depends on your use case, content type, and target audience. It's always worth experimenting with different encoders and settings to find the optimal balance for your needs. Many advanced users even employ multiple encoders in their workflows, choosing the most appropriate tool for each specific task or content type.\\n\\n## Final Conclusion\\n\\nThe AV1 ecosystem has grown to the point where a single comprehensive guide cannot effectively cover the entire extent of the available tools and techniques for AV1 encoding across *every* use case. If you want more detail about a particular tool, where to acquire it, or how to compile an encoder, you can find that information throughout the various wiki entries linked on this page.\\n\\nReading can get you far, but it is natural to have questions. Please don't hesitate to connect with the team behind the Codec Wiki and many of these tools via our [AV1 for Dummies Discord server](https://discord.gg/bbQD5MjDr3). We're happy to help you with anything you need, and your questions and feedback help the wiki grow and improve. We hope you enjoy your journey into AV1 encoding, and we wish you the best of luck in your encoding endeavors!\"},{\"id\":\"svt-av1-second-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-second-deep-dive\",\"source\":\"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx\",\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"description\":\"SVT-AV1 2.1.0 just released, how does it compare to the previous version?\",\"date\":\"2024-05-19T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"inline\":true,\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":35.215,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\",\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"description\":\"SVT-AV1 2.1.0 just released, how does it compare to the previous version?\",\"slug\":\"svt-av1-second-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-2.1.0-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"AV1 for Dummies\",\"permalink\":\"/blog/av1-for-dummies\"},\"nextItem\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"permalink\":\"/blog/svt-av1-deep-dive\"}},\"content\":\"import { CarouselGenerator, TabbedCarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\n\\n\\nSVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips.\\n\\n\x3c!--truncate--\x3e\\n\\n## Feedback\\n\\nI unfortunately never got to update the previous blog post with the image comparisons, and some people expressed concerns that this testing may not be representative of live action content. For the former, I will have to ask for your patience again, because this blog post won't initially contain image comparisons either, but this time they are being actively worked on, along with a magnificent comparisons component and this page will get updated once that is done. As for the latter, please be reassured that this testing in its entirety is perfectly representative of any modern content people typically encode: the diversity of japanese animation is rich and the content specifically chosen for this benchmark is relatively complex. From 3DCG to extremely noisy clips, we are far from the easy-to-compress static scenes of some slice-of-life show.\\n\\nI have also decided to complement this benchmark of another psychovisually-driven metric (XPSNR) so that double-checking is made easier. Thus, each graph possesses a SSIMULACRA2 version and a XPSNR version. Don't hesitate to switch between one another!\\n\\n## Methodology\\n\\nThe resources available will range from ***graphs*** to ~~**image comparisons**~~ (WIP, for real this time). The ***former*** has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the **latter** are image samples from the files encoded during the tests that enable you to check quality for yourself, adding another layer of subjective interpretation to these comparisons.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with `x264 --qp 0` for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp *directly*, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2), XPSNR scores on the other hand are calculated using a [ffmpeg filter](https://github.com/fraunhoferhhi/xpsnr), and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and metrics scores. Bits per pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the closest we have to real efficiency.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v2.0.0 and v2.1.0 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/) using the provided `Build/linux/build.sh` script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i3 12100 with 16GB of 3200MHz CL14 DDR4 RAM in Arch Linux with kernel 6.7.7 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples\\n\\nThe samples are as follows:\\n- 11s `Blame!` clip which sports 3DCG action with lots of grain, effects and high-contrast elements.\\n- 13s `Blue Lock` clip which sports rapid camera movements, complex geometry and high-contrast elements.\\n- 5s `Spy x Family` first ending sequence with an extremely high amount of dynamic noise. New most complex source of this set.\\n- 12s `Jigokuraku (Hell's Paradise)` flashback clip with huge static grain in a very dark scenery and some action.\\n- 5s `The Garden of Sinners` clean but fast-paced 3DCG scene with explosions.\\n\\nThe resolution of every clip is 1080p, except for the first one which is 1920x804.\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 6` to `--crf 46`, by increments of 4.**\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> ~~13~~ 12)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 12`.**\\n> Yes, you heard that right. Preset 7 and 13 are no more in __v2.1.0__. This new update, like the previous one, mostly consisted of optimizing the presets trade-offs. The devs have made the choice to map `preset 7` to `preset 6` and `preset 13` to `preset 12` due to the lack of spacing between the new presets. We will discuss the implications of this further ahead.\\n\\n`--preset X` is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are: \\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\n\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n### Efficiency\\n\\n- First of all, here are the full efficiency graphs:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThis is all very cool, but visually bloated.\\n\\n- Now the same graphs but focusing on the \\\"high quality\\\" range (CRF6 -> 22):\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Same, but now focusing on the \\\"low quality\\\" range (CRF26 -> 46):\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- If we now focus on __presets 4__ and below, where it's more difficult to discern the differences between presets, we get this at \\\"high quality\\\":\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- And the following at \\\"low quality\\\":\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n### Speed\\n\\n- **Let's now see speed comparisons between all presets:**\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nOnce is not custom, __preset -1__ is so abysmally slow it makes the graph unusable.\\n\\n- Same, but without the placebo __preset -1__:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Lastly, here is what it looks like with a logarithmic scale:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n### Interpretation\\n\\nAs for interpreting the results, it would seem like **preset 2** and **preset 4** remain all-around very balanced presets, with **preset 3** being in a nice in-between spot, an improvement over v2.0.0's **preset 3** in a way. We will better understand the reasons for this when we'll compare the new version to the last, a bit after.\\n\\nThe quality gap between **preset 2** and **preset 1** is usually pretty narrow, however the speed penalty from going to **preset 1** is ~2x, when the penalty of going from **preset 3** to **preset 2** is closer to ~1.5x. As such, **preset 1** enters placebo territory, and considering the very little benefits of going any lower than it, compared to the huge performance loss of even lower presets, I advise you not to waste encoding resources on **preset 0** and **preset -1**. This applies especially at medium to high quality, however at extremely low quality like the CRF40 range, we can still see some small gains from these placebo presets.\\n\\nWhen we start talking about faster presets though, things are pretty different from previous versions: **presets 5 to 9** behave similarly on the graphs and seem to stand apart from their slower counterparts by just a bit. If you can bear the speed of **preset 4**, you should definitely be going for it, however if fast encoding is a necessity, for example in the case of realtime transcoding or streaming, **presets 5 through 9** will serve you right with great efficiency/speed trade-offs between one another. No preset in that range particularly stands out from the others, so simply pick one depending on your performance needs.\\n\\n**Presets 10 to 12** are pretty inefficient, and to be avoided if possible. They can still be of use in a convex-hull scenario, but in the case of realtime transcoding, you may be better off with a hardware encoder like the ones found in RTX 4000 or Arc GPUs, especially since SVT-AV1's target bitrate mode is even less efficient than CRF mode.\\n\\n### TLDR\\n\\nThe same conclusions as the previous blog post can be made: \\n**clear quality gains can be observed as we decrease presets, until __preset 2__, however the effectiveness of dropping presets is noticeably less and less important as quality is increased.**\\n\\nIn the next part, we will evaluate the differences in efficiency and speed of every presets when updating from SVT-AV1 2.0.0 to 2.1.0, which should enable an increase of nuance from the previous results alone.\\n\\n## SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:\\n\\nTwo months ago, I conducted a similar test to this one to compare the presets evolution between versions __1.8.0__ and __2.0.0__. The results were pretty unsatisfying: I noticed that **presets -1 to 8** in __v2.0.0__ performed like the old **presets 0 to 9** did in __v1.8.0__. We basically saw an efficiency regression at a given preset, and speedups did not follow suit as well as we would have anticipated. All in all, it wasn't all that bad, it suffice to say you could simply drop a preset from before and you were good to go again. What was more concerning however is that the release note claimed important speedups that did not impact efficiency and my testing proved otherwise. My theory is that due to the dev team testing methodology, which consist of mostly pretty low resolution clips and non-psychovisual metrics like PSNR, SSIM or bad psychovisual metrics like VMAF, it's very well possible they were tricked into thinking they introduced improvements as they tweaked the presets when in reality the metrics simply didn't notice the quality degradation. Such issue is an additional reason why the industry should adopt more competent metrics, ones that better correlate with the human vision, to improve encoders in more impactful ways and better avoid pointless regressions. \\n\\nSo the question for today's testing is: have the SVT-AV1 devs redeemed themselves and actually improved the presets trade-offs this time around? Let's find out!\\n\\n### `preset -1`: v2.0.0 vs v2.1.0\\n\\n- **Let's start off with a battle of the placebos, with the efficiency at \\\"high quality\\\":**\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- And the efficiency at \\\"low quality\\\":\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nYes, this is a bit underwhelming, but you can't just improve the best an encoder has to offer with just tweaking right?\\n\\n- Now, let's compare their respective speeds:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nLet's be grateful it became ever so slightly faster, I guess.\\n\\n### `preset 0`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nOverall, efficiency wise, this new **preset 0** places itself in-between old **preset -1** and **0**\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nInterestingly enough, its speed is much closer to the old **preset 0** than to the old **preset -1**. This means **preset 0** was genuinely improved over v2.0.0!\\n\\n### `preset 1`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nIn efficiency, this new **preset 1** is often equal to old **preset 0**, else in-between old **preset 0 and 1**.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nWe observe that the new preset is a bit closer to old **preset 1** speeds than it is to old **preset 0** speeds. Good news!\\n\\n### `preset 2`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nOh well, that's awkward.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nSpeed was left untouched too, meaning **preset 2** is unchanged in v2.1.0.\\n\\n### `preset 3`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe new **preset 3**'s efficiency is the same as the old one.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nHowever, the preset got slightly faster, so this is a speedup!\\n\\n### `preset 4`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nWe can observe that **preset 4** got slightly to moderately worse efficiency wise.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nFortunately, the consequence of that slight efficiency decrease is a big performance improvement!\\n\\n### `preset 5`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 5** seems to have gotten ever so slightly worse efficiency wise.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nYet it became slightly faster, this is overall a good trade-off.\\n\\n### `preset 6`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe new **preset 6** has a huge responsibility: being able to compensate in the absence of its **preset 7** sibling. It seems to performs in-between old **preset 6 and 7**, usually closer to old **7**.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 6** is now ever so slightly slower to old **7**, this is an interesting trade-off, overall a win over old **7**.\\n\\n### `preset 7`: v2.0.0 vs v2.1.0\\n\\nAgain, there is no preset 7. Actually, it's preset 6 that disappeared but I'm not remaking the graphs just for fun. If you select preset 6, you will be granted the following message: `Svt[warn]: Preset M6 is mapped to M7.`\\n\\n![always_has_been](/img/preset_7_meme.webp)\\n\\n### `preset 8`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nIn efficiency, this new **preset 8** is sometimes equal or slightly worse to the old **8**, and sometimes equal or slightly worse than old **7**...\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nOverall, the speed is pretty much unchanged from old **8**. It looks like a slight regression, that's pretty disappointing.\\n\\n### `preset 9`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe new **preset 9** is the same as ever, ever so slightly better in some scenario but nothing groundbreaking.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nIts speed remains the same, sometimes ever so slightly slower. Basically the preset is pretty much unchanged, which may as well be a relief, as the last usable preset of the encoder.\\n\\n### `preset 10`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 10** is slightly to moderately worse efficiency wise.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nIts speed is mostly the same, sometimes ever so slightly faster. It's a wash, avoid this preset at all costs!\\n\\n### `preset 11`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 11**'s efficiency is untouched.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n**Preset 11**'s speed is unchanged as well.\\n\\n### `preset 12`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\n- Efficiency graphs, low quality:\\n\\n\\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nJust as **preset 6**, **preset 12** is now mapped to **13**, and unsurprisingly, its efficiency is equal to old **13**.\\n\\n- Speed graphs:\\n\\n\\n },\\n }}\\n pixelsAbove={0}\\n pixelsBelow={24}\\n/>\\n\\nThe speeds seem to be in-between old 12 and 13, so potentially a slight speedup. Still, nothing to get excited at.\\n\\n### TLDR\\n\\nFrom these extensive comparisons, it appears that some presets have received genuine improvements in their respective efficiency/speed trade-off.\\nSome presets, like **-1**, **0**, **1** and **3**, received the most significant improvements, followed by **4**, **5** and **6** with overall beneficial new trade-offs. **Preset 12** got slightly faster too. On the other hand, **presets 8 and 10** seemed to have regressed slightly, and **presets 2 and 9** are perfectly unchanged from v2.0.0.\\n\\n## Conclusion\\n\\nSVT-AV1 2.1.0 introduced some welcomed improvements. **Presets 2 through 4** remain the king of optimal AV1 encoding, while **presets 5 through 9** stand as good options for the people that find **2-4** to be too slow for their liking.\\n\\nLet's be honest a second, not much as changed in SVT-AV1 since the first blog post. There was no need to redo all the parameter testing for the simple reason that their behavior remained the same, as did the conclusions drawn from them. I hope this article wasn't disappointing in a sense... Still, be reassured, this was just an appetizer, there will be more in the near future!\\n\\nBy the way, did you know that the **[SVT-AV1-PSY project](https://github.com/gianni-rosato/svt-av1-psy/)** was initiated a few months ago? Its defaults were tailored according to the testing done in the last blog post, allowing a free efficiency boost for anyone not keen to tweak their encoders. Furthermore, SVT-AV1-PSY introduced a sharpness parameter to control distortion, a quarter-step quantizer for more CRF precision, a new subjective SSIM tune, Dolby Vision support, frame luma bias, and some other knobs to improve the appeal and consistency of your encodes. It is actively maintained by a group of talented people, including the main dev of the aom-av1-lavish fork of aomenc. Some of the changes are being backported to mainline SVT-AV1 due to the increased interest of the mainline devs. Please check it out!\\n\\nHopefully, this comprehensive second deep dive should give you a helpful new starting point for choosing settings when encoding with the latest SVT-AV1(-PSY) 2.1.0.\\n\\n## Future\\n\\nMy plans for the future regarding the blog post include:\\n- polishing this blog post and aggrementing it of image comparisons.\\n- a follow-up article in the relatively near future about giving you encoding tips and explaining common AV1 encoding knowlegde, for instance showcasing why film grain synthesis is a game-changer or why chunked encoding can prove beneficial to your encoding pipeline.\\n- an article focused on observing the evolution of SVT-AV1 since the beginning of its development, as well as comparisons with current aomenc, rav1e and SVT-AV1-PSY, including a quick look at the current state of AVM (development ground for AV2) in comparison to VVC's state.\\n\\nThanks for reading!\\n\\n{}\"},{\"id\":\"svt-av1-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-deep-dive\",\"source\":\"@site/blog/2023-12-30-svt-av1-deep-dive.mdx\",\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"date\":\"2023-12-30T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"inline\":true,\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":22.78,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\",\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"slug\":\"svt-av1-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-1.8.0-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"permalink\":\"/blog/svt-av1-second-deep-dive\"},\"nextItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"}},\"content\":\"import { CarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\n\\n\\nThis blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.\\n\\nThe resources available will range from ***graphs*** to ~~**image comparisons**~~ (WIP). The ***former*** has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the **latter** are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with `x264 --qp 0` for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp *directly*, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2) and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the closest we have to real efficiency.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v1.8.0 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0) using the provided `Build/linux/build.sh` script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples\\n\\nThe samples are as follows:\\n- 11s `Blame!` clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set.\\n- 13s `Blue Lock` clip which sports rapid camera movements and rotations + high-contrast elements.\\n- 15s `Fate/Grand Order: Babylonia` relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data.\\n- 22s `Jigokuraku (Hell's Paradise)` flashback clip with huge static grain in a very dark scenery and some action.\\n- 14s `Kaguya-sama` opening sequence with lots of effects and fast change of scenery.\\nThe resolution of every clip is 1080p, except for the first one which is 1920x804.\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 8` to `--crf 43`.**\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> 13)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 13`.**\\n*Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why.*\\n\\n`--preset X` is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are: \\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n- First of all, here are the efficiency graphs:\\n\\n\\n\\nThis could be too much information.\\n\\n- Now the same graphs but focusing on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- Same again but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- Now for the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- Same but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- **Let's now see speed comparisons between all presets:**\\n\\n![speed_overall](https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp)\\n\\nAs we can see, preset -1 is so abysmally slow it makes the graph unusable\\n(BTW, notice the `1e6` in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)\\n\\n- Here is what it looks like with a logarithmic scale:\\n\\n\\n\\n- **Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)**\\n\\n\\n\\n- Here are speeds graphs for preset 1 to 6 with a linear scale:\\n\\n\\n\\nOne interpretation we can have is that **presets 2 to 4** have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but **preset 2** is **2x slower than preset 4**. The quality gap between **preset 2** and **preset 1** is even narrower but the speed penalty is also ~2x.\\n\\nThat makes it hard to recommend **preset 1**, while **preset 3** is in a strange middle ground between **2** and **4** where it makes little sense to choose it over those two: it's better to choose **preset 2** for the higher efficiency at 1.5x slower speeds, or **preset 4** for the 1.33 to 1.5x higher speeds. At least the option exists.\\n\\nA similar observation can be made between **preset 5** and **6**. They can be so close in scores in many samples (especially at HQ) while also being close in speeds that **preset 5** becomes rather obsolete most of the time.\\n\\n### TLDR\\n\\n**Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go.**\\n\\n- For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), __**preset 4**__ only loses at maximum **2** SSIMU2 **points** compared to __**preset -1**__ while being 50-60x faster. Though to be fair, the speed loss from __**preset 4**__ to __**preset 0**__ is \\\"only\\\" 5-10x for a maximum SSIMU2 difference close to **1.5 point**.\\n\\n- From CRF43 to CRF28, the difference between __**preset 4**__ and __**preset -1**__ can be as much as **5** SSIMU2 **points**, so lower presets become more attractive.\\n\\n## Tunes comparisons\\n\\n**In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default `--tune 1` (PSNR) to the other two tunes: `--tune 0` (VQ) and `--tune 2` (SSIM).**\\n\\nExcept for the tunes, `--preset 4` is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n- **Let's compare the efficiency of every tunes:**\\n\\n\\n\\n- Now let's focus on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- And the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- And here is the speed difference:\\n\\n\\n\\n- Graphs comparing the tunes individually between each others will be made available soon.\\n- The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that.\\n\\n### TLDR\\n\\n**SSIMU2 favors __tune 1 and 2__ above __tune 0__. At high quality, __tune 1 and 2__ are matched, while at low quality __tune 2__ takes the edge. __Tune 0__ is sometimes a match for the other two on certain clips and other times fare pretty badly.**\\n**For some reason, __tune 0__ is quite a bit faster now, compared to 1 and 2 which are basically the same.**\\n\\nKeep in mind that I have observed multiple times in the past that __tune 0__ kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay *tuned* for these subjective comparisons.\\n\\n## Parameters comparisons\\n\\n**In the following graphs, you may find comparisons between many SVT-AV1 parameters.**\\n*Additional graphs focusing on the high and low qualities will be made available later down the line*\\n\\n`--preset 4` is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n### `--tile-rows 1 --tile-columns 1` vs default `--tile-rows 0 --tile-columns 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __tiles__ here are both slightly harmful and slower.\\n\\n### `--aq-mode 0` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Except for the Jigokuraku clip, __aq-mode 0__ is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels.\\n\\n### `--aq-mode 1` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __aq-mode 1__ fares closer to __aq-mode 2__ than __aq-mode 0__ did, both in quality and speed, but is still overall inferior according to SSIMU2\\n\\n### `--enable-cdef 0` vs default `--enable-cdef 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF *can* be beneficial for the line-art.\\n\\n### `--enable-dg 0` vs default `--enable-dg 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Dynamic GoP control__ yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \\\"safe\\\" to keep the setting disabled at all times or not.\\n\\n### `--enable-dlf 0` vs default `--enable-dlf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Deblocking loop filter__ can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default.\\n\\n### `--fast-decode 1` vs default `--fast-decode 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __fast-decode 1__ is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though.\\n\\n### `--irefresh-type 1` vs default `--irefresh-type 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Finally something interesting to analyse!\\n- __irefresh-type 1__ is either a match or beneficial compared to __irefresh-type 2__ at high CRF levels.\\n- __irefresh-type 1__ either wins or lose to __irefresh-type 2__ at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set __irefresh-type__ to __1__ at \\\"high quality\\\" as it might be harmful depending on the content.\\n- __irefresh-type 1__ is always slower compared to __irefresh-type 2__, so I might argue it is more safe to leave __irefresh-type__ default at \\\"high quality\\\" than not.\\n- According to the content type of those clips, it appears that __irefresh-type 1__ may benefit *extremely grainy* content while default __irefresh-type 2__ is better suited for *cleanish* content. This needs to be confirmed with *moar* testing though.\\n\\n### `--lookahead 0` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n### `--lookahead 60` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n### `--lookahead 120` (max) vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __lookahead__ seems to behave strangely when set...\\n- __lookahead 0__ shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead.\\n- __lookahead 60__ is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23\\n- __lookahead 120__ is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences.\\n> Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide.\\n\\n### `--enable-overlays 1` vs default `--enable-overlays 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __overlays__ do not seem to either improve efficiency or performance.\\n\\n### `--enable-qm 1` vs default `--enable-qm 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Enabling __quantization matrices__ alone increase efficiency at \\\"high quality\\\" with no real speed impact.\\n\\n### `--enable-qm 1 --qm-min 0` vs `--enable-qm 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Setting __qm-min__ to __0__ on top of enabling __quantization matrices__ can be beneficial in some clips at no added compute time.\\n\\nI will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content.\\n\\n### `--enable-restoration 0` vs default `--enable-restoration 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the __loop restoration filter__ isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons.\\n\\n### `--scm 0` vs default `--scm 2` (content adaptive)\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `--scm 1` vs default `--scm 2` (content adaptive)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Interestingly enough, __screen content tools__ seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this.\\n\\n### `--enable-tf 0` vs default `--enable-tf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Disabled __temporal filtering__ *can* sometimes improve efficiency slightly at \\\"high quality\\\", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.\\n\\n### `--enable-tpl-la 0` vs default `--enable-tpl-la 1`\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `superres`:\\n\\nKinda lazy to make, share and comment so much graphs for something that can be told in two lines...\\n\\nAll superres variants are freaking useless as they:\\n- do not improve efficiency\\n- decrease encoding speeds\\n- decrease decoding speeds when either bitrate or quality normalized.\\n\\n### __Early TLDR on parameters results:__\\n\\n***For a previous test with SVT-AV1 1.7.0 I did all parameters tests with `--preset 6 --tune 2`, now I did them with `--preset 4 --tune 1`. Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line.***\\n\\n**Here is a quick run down of how each parameter affect encoding:**\\n- `--tile-rows --tile-columns` should never be used (except for decreasing decode complexity)\\n- `--aq-mode 2` is the most efficient / fastest\\n- `--enable-cdef 0` *might* improve performance at almost no efficiency loss *(needs more thorough testing)*\\n- `--enable-dg` and `--enable-dlf` barely do anything\\n- `--fast-decode 1` decreases efficiency, improves encoding times, and the decoding gains still need to be determined.\\n- `--irefresh-type` should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content\\n- `--lookahead` should be kept default\\n- `--enable-overlays 1` does not improve efficiency, slight speed regression as well\\n- `--enable-qm 1 --qm-min 0` should be set for increased efficiency especially at low CRF values at no perf cost\\n- `--enable-restoration` barely does anything but disabling yields better performance *(needs visual confirmation)*\\n- `--scm 1` screen content tools can improve efficiency with a big performance trade-off *(needs more thorough testing)*\\n- `--enable-tf 0` is a mixed bag efficiency wise but improves performance\\n- `superres & resize` please don't.\\n\\n## Conclusion\\n\\nThe extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking.\\n\\nThe default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength.\\n\\nFurther testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!\\n\\n{}\"},{\"id\":\"embedding-the-un-embeddable\",\"metadata\":{\"permalink\":\"/blog/embedding-the-un-embeddable\",\"source\":\"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx\",\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"date\":\"2023-10-29T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"discord\",\"permalink\":\"/blog/tags/discord\"}],\"readingTime\":8.92,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"slug\":\"embedding-the-un-embeddable\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"video\",\"discord\"],\"image\":\"/img/discord-embed-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"permalink\":\"/blog/svt-av1-deep-dive\"},\"nextItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"![Feature image](/img/discord-embed-blog-image.webp)\\n**A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film \\\"Cosmos Laundromat\\\"**\\n\\n\\n## A Scenario\\n\\nWhile chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it.\\n\\n\x3c!--truncate--\x3e\\n\\nIt loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations.\\n\\n![stolen.shoes](/img/stolenshoes-puss.webp)\\n\\nThe truth is, there are *multiple* site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:\\n\\n- https://stolen.shoes\\n- https://discord.nfp.is\\n- https://embeds.video\\n- https://x266.mov/discord-embed\\n- https://autocompressor.net/av1\\n\\nThe big question is, **how do they work?** Let's get to dissecting.\\n\\n## But First, a Quick Disclosure\\n\\nThe Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately.\\n\\n## How it Works\\n\\nThe entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park).\\n\\nThe technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end.\\n\\n### The Website's End\\nIf you view each website's source, you will find this specific line in each one but they may have a different order:\\n\\n```html\\n\\n\\n\\n\\n\\n```\\n\\nThese are the `head` parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the `` and `` tags. Here's an example of a static HTML site serving one specific video:\\n```html\\n\\n\\n\\n \\n \\n some embed site\\n \\n \\n \\n \\n \\n\\n\\n

Hi

\\n

Just your friendly neighborhood video embed site

\\n \\n\\n```\\n\\n< br />\\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms).\\n\\n### Discord's End\\n\\nTraditionally, Discord's media embedder will impose it's own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link \\\"tricks\\\" Discord by showing a \\\"false face\\\" first.\\n\\n\\n\\n## Strengths & Limitations\\n\\nAfter a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below.\\n\\n#### Strengths\\n\\n- You can embed non-web compatible codecs such as [HEVC](https://wiki.x266.mov/docs/video/HEVC) in [MP4/MOV](https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v), but the user must be using a compatible browser. [Thorium](https://thorium.rocks) or Safari version 13 or greater will work for HEVC playback.\\n- There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them.\\n\\n#### Limitations\\n\\n- You can only use [hotlinks](https://simple.wikipedia.org/wiki/Hotlinking), which means direct linking to the video itself ending in the appropriate file extension such as `.mp4`. Cloud services like Google Drive or OneDrive will not work for storage.\\n- You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but **only discord.nfp.is can do this**, as it **proxies cdn.discordapp.com** itself.\\n- You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord.\\n\\n\\n\\n## Differences between Sites\\n\\nAs mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality.\\n\\nHere are the sites, each with one noteworthy special benefit:\\n\\n- https://stolen.shoes - Recognition, as it is the OG.\\n- https://discord.nfp.is - You can use Discord CDN as video source.\\n- https://embeds.video - Immediately input video source into the URL (`https://embeds.video/https://example.com/v/video.mp4`)\\n- https://x266.mov/discord-embed - Attractive domain, simple layout.\\n- https://autocompressor.net/av1 - Lots of info dump, pretty advanced features.\\n\\nThat concludes the technical overview! Next, let's cover the history of this exploit.\\n\\n## The Lore\\n\\n### Dwayne\\n\\nIn around April of 2022, a Reddit user going by the name of u/CreativeGamer03 [posted a video on r/discordapp](https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh) of a link where a GIF of Dwayne \\\"The Rock\\\" Johnson plays caption with \\\"Is this a GIF or is it a video?\\\" When played, a low-quality music video of Rick Astley's \\\"Never Gonna Give You Up\\\" plays.\\n\\nThe link used is now unfortunately [removed](https://archuser.de/the-rock).\\n\\n### Discovery\\nOn 23rd June 2022, a Discord user *Clybius* on the AV1 Community server asked people for [VP9](https://wiki.x266.mov/docs/video/VP9) or [H.264](https://wiki.x266.mov/docs/video/AVC) videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked.\\n\\nHe tried shortly afterward with [AV1](https://wiki.x266.mov/docs/video/AV1). Eureka, it also worked:\\n\\n![AV1](/img/clybius-av1.webp)\\n\\nClybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll.\\n\\n![Dwayne](/img/clybius-dwayne.webp)\\n\\n### The Experiments & Interactive Site\\n\\nAfter the discovery of AV1 embedding, experimentation brought about the discovery that *any* video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the [Containers](https://wiki.x266.mov/docs/introduction/terminology#container) section on the [Terminology](https://wiki.x266.mov/docs/introduction/terminology) page.\\n\\nThis applies to HEVC, ProRes, [xHE-AAC](https://wiki.x266.mov/docs/audio/AAC#xhe-aac), and other bizarre codecs that are rarely seen on the Web.\\n\\nWhile experimentating, Clybius converted one their idle domains `stolen.shoes` into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding.\\n\\n### Virality\\n\\nIt's not long before people outside of the AV1 Community discovered `stolen.shoes`, and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time.\\n\\n- The first instance featured the DreamWorks sequel of \\\"Puss in Boots (2011)\\\", \\\"Puss in Boots: The Last Wish (2022)\\\". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used `stolen.shoes`.\\n\\n![puss](/img/stolenshoes-puss.webp)\\n\\n- The second instance was when highly-anticipated animated film \\\"The Super Mario Bros. Movie (2023)\\\" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used `stolen.shoes` as the embed site.\\n\\n![mario](/img/stolenshoes-mario.webp)\\n\\n- The third instance is very recent as of the day this was posted. A streaming-service sourced \\\"Five Nights at Freddy's (2023)\\\" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining [hundreds of upvotes within the r/discordapp subreddit](https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/). The copy seems to be a compressed 720p encode. This example used `discord.nfp.is`.\\n\\n![fnaf](/img/discordnfpis-fnaf.webp)\\n\\nNote the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution: \\n- Top Gun Maverick (2022)\\n- The SpongeBob trilogy (2005/2015/2020)\\n- Spider-Man: Across the Spider-Verse (2023)\\n\\n\\n## Closing\\n\\nThe ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies.\\n\\nWhile this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms.\\n\\nIt is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform.\\n\\nThank you for reading this blog post, I hope you learned something!\"},{\"id\":\"av1-encoding-for-dummies\",\"metadata\":{\"permalink\":\"/blog/av1-encoding-for-dummies\",\"source\":\"@site/blog/2023-09-03-av1-for-dummies.mdx\",\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"date\":\"2023-09-03T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":16.09,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"key\":null,\"page\":null},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"slug\":\"av1-encoding-for-dummies\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"video\",\"compression\"],\"image\":\"/img/compare-guide.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"},\"nextItem\":{\"title\":\"Reducing Image Load Online\",\"permalink\":\"/blog/site-optimization\"}},\"content\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way. Yes, you using standalone ``libaom``, ``libsvtav1``, and ``librav1e`` from FFmpeg or even piping ``yuv4mpeg`` into **mainline** aomenc are all unoptimal.\\n\\n\x3c!--truncate--\x3e\\n\\n:::danger Outdated Information\\nWhile a lot of the information presented in this guide is still relevant and correct, the AV1 ecosystem has changed dramatically since this guide's inception which has demanded a rewrite. Please see the [AV1 for Dummies](https://wiki.x266.mov/blog/av1-for-dummies) blog post for more information.\\n:::\\n\\n![Compare](/img/compare-guide.webp)\\n\\nIn this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1), unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is **RAM consumption**, encoding 2160p (4K) with [aomenc](https://wiki.x266.mov/docs/encoders/aomenc) with 4 workers could take upwards of **16GB** of RAM! So do keep this in mind.\\n\\n## Installing the Tools\\n\\nGiven all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this.\\n\\n**Jump to**: [Windows](#microsoft-windows) | [macOS](#macos) | [Linux](#linux)\\n\\n## Microsoft Windows\\n\\n### The GUI Way\\n1. Install [NMKODER](https://github.com/n00mkrad/nmkoder) which is a GUI front-end to av1an with all dependencies installed.\\n2. You're done, you can skip to the encoding part\\n\\n:::danger Almost abandonware\\nSince Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal.\\n:::\\n\\n### The WSL2 Way\\n\\n*(Recommended)*\\n\\nIf you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good.\\n\\nThe easiest way to encode with WSL2 is to use [rAV1ator CLI](https://wiki.x266.mov/docs/utilities/rav1ator-cli), an interactive TUI for [Av1an](https://wiki.x266.mov/docs/utilities/av1an). An ArchWSL2 installation tutorial is provided [here](https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows).\\n\\n### The Automated Way\\n\\nThere is now a batch script for automating the install process, which can be found [here](https://github.com/Hishiro64/av1an-win-script). The instructions are in the README file.\\n\\n:::caution\\nThe script will download outdated version encoders and tools such as `aom-av1-psy` and MKVToolNix v76.0, if you are fine with these you can proceed.\\n:::\\n\\n### The Manual Way\\n\\n1. Install **Python 3.10.x, this will change so consult from the** [Vapoursynth website](http://www.vapoursynth.com/doc/installation.html) **if you're reading this from the future** from [here](https://www.python.org/downloads/windows/) and select \\\"Windows Installer 64-bit\\\". Upon installation check the tick for adding Python to PATH like so\\n![Python PATH](/img/python-path.webp))\\n\\n2. Download and install Vapoursynth from [here](https://github.com/vapoursynth/vapoursynth/releases) and select \\\"VapourSynth64-RXX.exe\\\"\\n3. Open the terminal and type ``vsrepo.py install lsmas ffms2`` to install some plugins for Av1an to work.\\n4. Download MKVToolNix from [here](https://mkvtoolnix.download/downloads.html#windows), select \\\"mkvtoolnix-64bit-XX.X.X-setup.exe\\\", and install **(Also available on winget!)**\\n5. Download Av1an from [here](https://github.com/master-of-zen/Av1an/releases) (SELECT LATEST AND CLICK THE \\\"ASSETS\\\" DROPDOWN)\\n6. Download **shared libraries** FFmpeg from [gyan.dev](https://www.gyan.dev/ffmpeg/builds)\\n7. Download a pre-built fork of Aomenc ([aom-av1-lavish](https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging)) which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows [here](https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28) *(Current as of Sept 6, 2023)*\\n:::info\\nIf you opt to compile aomenc yourself, you can view the instructions on how to do that [here](https://wiki.x266.mov/docs/encoders/aomenc/#installation).\\n:::\\n8. Move Av1an, FFmpeg **(Including the FFmpeg DLLs)**, and aomenc to somewhere preferable, eg ``C:\\\\Encoding``.\\n9. Add the folder **AND MKVTOOLNIX INSTALLATION FOLDER** to the [Windows PATH environment](https://www.maketecheasier.com/what-is-the-windows-path/).\\n\\n\\n## macOS\\n\\nmacOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend.\\n\\n**Homebrew + Macports for Av1an + rav1e:**\\n*Note that some commands may have to be run with `sudo`, which I won't explicitly include for security reasons.*\\n\\nInstalling the Homebrew package manager is a well documented process at this point:\\n```bash\\n/bin/bash -c \\\"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\\\"\\n```\\n\\nAs is installing MacPorts. Install the relevent `.pkg` for your macOS version from the MacPorts Project website:\\n[www.macports.org/install.php](https://www.macports.org/install.php)\\n\\nNow, you can run the following commands:\\n```bash\\nbrew update && brew upgrade\\nbrew install rav1e aom mkvtoolnix ffmpeg\\n# Usually you must run MacPorts commands for package installations as root\\nport upgrade outdated\\nport install av1an\\n```\\n\\nThis is the easiest way to get everything set up & working to produce AV1 video with `rav1e` or mainline `aomenc` & Av1an. You can check that things are installed by running the following commands & parsing their output:\\n```bash\\n% av1an --version\\nav1an 0.4.1-unstable (rev e10880d) (Release)\\n\\n* Compiler\\n rustc 1.70.0 (LLVM 16.0)\\n\\n* Target Triple\\n aarch64-apple-darwin\\n\\n* Date Info\\n Commit Date: 2023-06-25\\n\\n* VapourSynth Plugins\\n systems.innocent.lsmas : Not found\\n com.vapoursynth.ffms2 : Not found\\n```\\n```bash\\n% rav1e --version | grep \\\"release\\\" -C 1\\nrav1e 0.6.6 () (release)\\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\\n```\\n```bash\\n% aomenc --help | grep \\\"AOMedia\\\" -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice `systems.innocent.lsmas : Not found` in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through `-m hybrid`. This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:\\n\\n```bash\\nav1an -i \\\"input\\\" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v \\\" --tiles 8 -s 4 --quantizer 80 --no-scene-detection\\\" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o \\\"output.mkv\\\"\\n```\\n\\n**Building From Source**\\n\\nIf you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:\\n\\n- macOS sometimes doesn't have a `/usr/local/bin` by default. You can fix this by doing `mkdir /usr/local/bin`.\\n- Homebrew installs *everything* in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from `/opt/homebrew/lib` to `/usr/local/lib`. Finding them is a matter of `ls | grep \\\"keyword\\\"` & copying what looks reasonable to be associated with the tool you're using.\\n- Building most things from source will have instructions for \\\\*nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example.\\n```bash\\nbrew install git rust nasm\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\ncd .. && cd target/release\\ncp av1an /usr/local/bin\\n```\\n\\n**More Difficult: Building aom-av1-lavish from Source**\\n\\nIf you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:\\n```bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish\\n```\\nNow, you need to make some manual changes to the source code until Clybius merges [this commit](https://github.com/Clybius/aom-av1-lavish/pull/1/files).\\n- Add the line `#include \\\"aq_variance.h\\\"` at line 19 in `av1/encoder/encodeframe_utils.c`\\n- Comment out line 2546 in `av1/encoder/speed_features.c`. This line is `const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };` & becomes `// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };`.\\n\\nNow you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the `aom-av1-lavish` directory:\\n```bash\\nmkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\" -DCMAKE_LD_FLAGS=\\\"-flto -O3 -march=native\\\"\\nmake -j$(nproc)\\n# This may need to be run as root:\\nmake install\\n```\\n\\nNow you can run `aomenc --help | grep \\\"AOMedia\\\" -C 3` to see if lavish installed. If you're getting the same output as above, you may need to copy the `aomenc` executable to `/opt/local/bin`, `/usr/local/bin`, & `/opt/homebrew/bin` if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:\\n```bash\\n% aomenc --help | grep AOMedia -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice how it says `AOMedia Project AV1 Encoder Psy` instead of `AOMedia Project AV1 Encoder`. You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below.\\n\\n## Linux\\n\\n:::info\\nYet again, try using Arch. It's way easier.\\n:::\\n\\n### The GUI Way\\n\\n- Install [Aviator](https://github.com/gianni-rosato/aviator) ([SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1) + [FFmpeg](https://wiki.x266.mov/docs/utilities/FFmpeg)) or [rAV1ator](https://giannirosato.com/blog/post/aviator-1/) basically same thing but [Av1an](https://wiki.x266.mov/docs/utilities/av1an.mdx) + [rav1e](https://wiki.x266.mov/docs/encoders/rav1e). Both are only available as [Flatpaks](https://beta.flathub.org/apps/net.natesales.Aviator). Keep in mind Aviator ships with **SVT-AV1** and rAV1ator with **rav1e** instead of aomenc/AOM-AV1, which I will not be covering here.\\n\\n### The TUI Way\\n\\n*(Recommended)*\\n\\n- Install [rav1ator-cli](https://wiki.x266.mov/docs/utilities/rav1ator-cli), a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See [this page](https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation) for more info. Can be easily used on any distro.\\n\\n### The Compiling Route\\n\\n#### Ubuntu\\n\\nThe guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via `rustup` first, as apt version of Rust is severely outdated, then you can continue.\\n\\nInstall dependencies:\\n```bash\\nsudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\\n```\\n\\nInstall l-smash:\\n```bash\\ngit clone https://github.com/l-smash/l-smash.git\\ncd l-smash\\n./configure --enable-shared --extra-cflags=\\\"-march=native\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall zimg:\\n```bash\\ngit clone --recursive https://github.com/sekrit-twc/zimg.git\\ncd zimg\\n./autogen.sh\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall ImageMagick:\\n```bash\\ngit clone https://github.com/ImageMagick/ImageMagick\\ncd ImageMagick\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall Vapoursynth R63:\\n```bash\\nwget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\\nunzip R63.zip\\ncd vapoursynth-R63\\n./autogen.sh\\n./configure CFLAGS=\\\"-march=native\\\" CXXFLAGS=\\\"-march=native\\\" --libdir=/usr/lib\\nmake -j$(nproc)\\nsudo make install\\nsudo mkdir /usr/lib/vapoursynth\\nsudo ldconfig\\n```\\nThe plugin directory will be located in `/usr/lib/vapoursynth`.\\n\\n\\nInstall L-SMASH-Works Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args=\\\"-march=native\\\" -Dcpp_args=\\\"-march=native\\\"\\nninja -j$(nproc)\\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\\n```\\n\\n:::danger\\nL-SMASH-Works doesn't work on **aarch64**, it is recommended to use other plugins instead.\\n:::\\n\\nInstall FFMS2 Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/FFMS/ffms2\\ncd ffms2\\n./autogen.sh\\n./configure CFLAGS=\\\"-O3 -march=native\\\" CXXFLAGS=\\\"-O3 -march=native\\\"\\nmake -j$(nproc)\\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\\n```\\n\\nInstall Av1an:\\n```bash\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\nsudo cp target/release/av1an /usr/local/bin\\n```\\n\\nWhen there's no errors, proceed to compiling `aom-av1-lavish`.\\n\\n### Arch\\n\\nInstall dependencies:\\n```bash\\nsudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\\n```\\n\\nyou're done, proceed.\\n\\n#### Compiling aom-av1-lavish\\n``` bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\n## Encoding\\n\\nThe moment you've all been waiting for, let's just get into it. Here's an example *recommended* parameter as of now (09/03/23) [MM/DD/YY]:\\n```bash\\nav1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a \\\" -an \\\" -f \\\" -an \\\" -v \\\" --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 \\\" -o \\\"output.mkv\\\"\\n```\\n\\n:::info Parameter Meta\\nIt is strongly recommended to join the [AV1 Discord server](https://discord.gg/vpREHAvYvh) to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general.\\n:::\\nNow let's dissect it one-by-one\\n\\n**Av1an parameters:**\\n\\n- ``-i`` Input.\\n\\n- ``-x 300`` Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability.\\n\\n- ``-w 4`` Specifies the amount of \\\"workers\\\" or amount of encoders working on the video.\\n\\n- ``--verbose`` Sets logging to verbose.\\n\\n- ``--resume`` Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \\\"resumed\\\" without the parameter in place.\\n\\n- ``-e aom`` Specifies we're using aomenc encoder which should be the default option.\\n\\n- ``-c mkvmerge`` Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method.\\n\\n- ``-m lsmash`` Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0).\\n\\n- ``-f \\\" -an \\\"`` ``-f`` Stands for ffmpeg parameters, ``-an`` is to remove all audio since its better to encode and merge it separately. To crop use ``-f \\\" -an -vf crop=1920:800 \\\"`` for example to crop the video to 1920x800.\\n\\n- ``-v \\\" \\\"`` Is where you put the encoder's parameters in.\\n\\n- ``-a \\\" -an \\\"`` FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: `-a \\\" -c:a libopus -b:a 128k \\\"`.\\n\\n- ``--photon-noise=10`` AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films.\\n\\n- ``--set-thread-affinity=2`` Pins the thread to the encoder, aligns with ``--threads=2`` in the encoder parameter so set them accordingly.\\n\\n\\n**aomenc parameters:**\\n- ``--bit-depth=10`` We're using 10bit because it makes the video smaller and reduces [banding](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring).\\n\\n- ``--cpu-used=4`` This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish).\\n\\n- ``--end-usage=q --cq-level=24`` This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24.\\n\\n- `--threads=2` Sets the amount of threads the encoder can use, aligns with `--set-thread-affinity` in Av1an.\\n\\n- ``--tile-columns=0 --tile-rows=0`` This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):\\n\\n \\n \\\"Tiling\\\"\\n\\n\\n:::note Tile usage\\nDo NOT use tiles for 1080p and below, use 1 ``tile-columns`` at 1440p (2K), 2 ``tile-columns`` and 1 ``tile-rows`` for 2160p (4K)\\n:::\\n\\n- ``--lag-in-frames=64`` Similar to x264/x265 `rc-lookahead`. Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful.\\n\\n- ``--aq-mode`` adaptive quantization mode, 0 is better most of the time\\n\\n- ``--tune-content=psy --tune=ssim`` As the name suggests they are tunes that affect the video output, for the better, and for the worst\\n\\n:::info Tunes to use\\nSet ``tune-content`` to ``animation`` if you're encoding above ``cq-level=30`` A.K.A lower quality, despite it's name\\nSet ``tune-content`` to ``psy`` for everything else, **do not use if you encode above ``cq-level=30``**\\nFor ``tune``, this is a bit tricky. For now, the meta seems to be ``ssim``, but back then it was ``lavish`` which is considered THE best tune because it's based on [butteraugli](https://github.com/google/butteraugli). Now it's fallen behind because its more blurry than ``ssim``, and before that it was ``butteraugli``, and then ``ipq_vmaf_psy``, and finally just ``ipq``.\\nIf you use any of the VMAF tunes, **you need to specify ``--vmaf-model-path=`` to where you put it**.\\n:::\\n\\n- ``--enable-keyframe-filtering=1`` We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it.\\n\\n- ``--sb-size=dynamic`` Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it.\\n\\n- ``--deltaq-mode`` set to 0 because its just better.\\n\\n- ``--arnr-strength=1`` Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess.\\n\\n- ``--disable-kf --enable-fwd-kf=0`` We're disabling keyframes cause **Av1an already did scene detection, so we wont have to.**. And it speeds things up.\\n\\n- ``--kf-max-dist=9999`` Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default\\n\\n- ``--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost.\\n\\n- ``--enable-dnl-denoising=0`` Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well.\\n\\n\\n:::info Concatenation Error on Linux\\nRun ``ulimit -n 200000``, resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ``mkvmerge @../options.json``\\n:::\\n\\n\\n## Merging Everything\\n\\nOnce you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into `mp4`, just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental.\\n\\n\\n## Tips & Tricks\\n\\n- `--denoise-noise-level=10` Alternative to `photon-noise`, slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns.\\n\\n- `--arnr-maxframes` to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates.\\n\\n- `--butteraugli-resize-factor=2` if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and `--butteraugli-intensity-target=250` to match the content light level.\\n\\n\\n## Final Thoughts\\n\\nEncoding has always been about experimentation for the best, there is really no \\\"One size fits all\\\" for encoding content, as they differ from scene complexity, how it's captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!\\n\\n> **Guide originally hosted on https://rentry.co/AV1, rewrite and migration by Simulping.**\"},{\"id\":\"site-optimization\",\"metadata\":{\"permalink\":\"/blog/site-optimization\",\"source\":\"@site/blog/2023-07-21-site-optimization.mdx\",\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"date\":\"2023-07-21T00:00:00.000Z\",\"tags\":[{\"inline\":true,\"label\":\"image\",\"permalink\":\"/blog/tags/image\"},{\"inline\":true,\"label\":\"web\",\"permalink\":\"/blog/tags/web\"},{\"inline\":true,\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":9.25,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"key\":null,\"page\":null}],\"frontMatter\":{\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"slug\":\"site-optimization\",\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"image\",\"web\",\"compression\"],\"image\":\"/img/_DSC8466-smaller.jpg\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.\\n\\n\x3c!--truncate--\x3e\\n\\n:::caution\\nThese instructions are for *photographic* images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.\\n:::\\n\\n:::danger\\nMany images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:\\n- [Thorium](https://thorium.rocks/) | *Linux, [macOS](https://github.com/Alex313031/Thorium-Special/releases), [Windows](https://github.com/Alex313031/thorium/releases/), [Android](https://github.com/Alex313031/Thorium-Special/releases)*\\n- [Waterfox](https://www.waterfox.net/) | *[Linux](https://flathub.org/apps/net.waterfox.waterfox), [macOS](https://www.waterfox.net/download/), [Windows](https://www.waterfox.net/download/)*\\n- [Mercury](https://thorium.rocks/mercury) | *[Linux](https://github.com/Alex313031/Mercury/releases), [Windows](https://github.com/Alex313031/Mercury/releases)*\\n:::\\n\\n## Fire & Forget\\n\\nFirst, we'll illustrate what *not* to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:\\n\\n*exported straight from Darktable at JPEG q90, with no scaling*\\n\\n![bloated_jpeg](/img/_DSC8466.jpg)\\n\\n**2.2 MB**\\n\\n## Massive Improvement\\n\\nThe easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway.\\n\\n![box-size-mac](/img/box-size-mac.avif)\\n*Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here.*\\n\\nThe width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with `cjpegli`, looks like this:\\n\\n![smaller_jpeg](/img/_DSC8466-smaller.jpg)\\n\\nObviously, there's lost fidelity compared to the original, but considering this is *so much smaller*, it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of `cjpegli`, although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size.\\n\\n2.2 MB -> **233 kB**\\n\\n### Lazy Loading\\n\\nA bonus tip is to add the `loading=\\\"lazy\\\"` attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:\\n\\n```html\\n\\n \\\"alt\\n \\n```\\n\\n## New Codecs\\n\\nIf you desire further improvement, it may be time to consider using a newer codec like [AVIF](https://wiki.x266.mov/docs/images/AVIF) or [JPEG-XL](https://wiki.x266.mov/docs/images/JXL). These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider [WebP](/docs/images/WebP) or [HEIC](/docs/images/HEIC), since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering *lossy* compression for *photographic* images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now.\\n\\n### Fallbacks\\n\\nAVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:\\n\\n```html\\n\\n \\n \\n \\n \\\"alt\\n \\n```\\n\\nHere is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most.\\n\\n### Compression Efficacy\\n\\nLet's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with `cjpegli` (which scores ~`83.01` with the [SSIMULACRA2](/docs/metrics/SSIMULACRA2) visual fidelity metric).\\n\\n![smaller_jxl](/img/_DSC8466-smaller.jxl)\\n\\n**137.0 kB** *JPEG-XL image, encoded with `cjxl lossless.png out.jxl -d 1.49 -e 9`. Score: ~`83.04`* *3.06s user time*\\n\\n![smaller_avif](/img/_DSC8466-smaller.avif)\\n\\n**124.8 kB** *AVIF image, encoded with `avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif`. Score: ~`83.03`* *7.54s user time*\\n\\nJXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the `ssimulacra2` program decodes JPEG & JXL. Either way, the scores are fairly close.\\n\\n![smaller_jxl_jpeg-recomp](/img/_DSC8466-smaller-recomp.jxl)\\n\\n**189.4 kB** *JPEG-XL image from JPEG, encoded with `cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11`. Score: ~`84.92` (???)* *0.67s user time*\\n\\nThe final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with `cjpegli` encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine).\\n\\n![smaller_jpeg_xyb](/img/_DSC8466-smaller-xyb.jpg)\\n\\n**208.3 kB** *XYB JPEG, encoded with `cjpegli lossless.png out.jpg --xyb -d 1.155`. Score: ~`83.04`* *0.10s user time*\\n\\nIn this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode.\\n\\n## Responsive Images\\n\\nDisplaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the [Responsive Image Linter](https://ausi.github.io/respimagelint/) that can help us figure out which image sizes we should be using.\\n\\n![responsive_image_linter](/img/responsive_image_linter.avif)\\n\\nIn our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:\\n\\n```html\\n\\n \\n \\n \\\"alt\\n\\n```\\n\\nIt is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:\\n\\n- `srcset` = the images available to your browser to serve, & their respective widths\\n- `sizes` = the conditions given to the browser explaining under what conditions should it serve which image\\n- `(min-width: XXXpx) YYYpx` = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels \\\\* display scaling.\\n- `calc(100vw - 24px)` = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have `(min-width: 997px) calc(75vw - 257px)`. This means given the viewport is at least 997px wide, calculate 0.75 \\\\* the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified.\\n\\n\\n \\n \\n \\\"alt\\n\\n\\nThat's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their [Reduce Your Page's Image Load](https://autocompressor.net/blog/reduce-image-load) blog post when writing this entry. I have [confirmed](https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI) with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0.\"}]}}")}}]); \ No newline at end of file diff --git a/assets/js/f9208490.ac89ffd0.js b/assets/js/f9208490.ac89ffd0.js new file mode 100644 index 000000000..7de59e9f9 --- /dev/null +++ b/assets/js/f9208490.ac89ffd0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3229],{2264:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"utilities/hdr10plus_tool","title":"hdr10plus_tool","description":"hdr10plus_tool is a command line tool written in Rust for working with HDR10+ in HEVC files. It was previously named hdr10plus_parser.","source":"@site/docs/utilities/hdr10plus_tool.mdx","sourceDirName":"utilities","slug":"/utilities/hdr10plus_tool","permalink":"/docs/utilities/hdr10plus_tool","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/hdr10plus_tool.mdx","tags":[],"version":"current","sidebarPosition":11,"frontMatter":{"title":"hdr10plus_tool","sidebar_position":11},"sidebar":"tutorialSidebar","previous":{"title":"eac3to","permalink":"/docs/utilities/eac3to"},"next":{"title":"MP4Box","permalink":"/docs/utilities/mp4box"}}');var a=n(4848),l=n(8453),s=n(1470),o=n(9365);const i={title:"hdr10plus_tool",sidebar_position:11},u="hdr10plus_tool",c={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Extracting",id:"extracting",level:3},{value:"Injecting",id:"injecting",level:3},{value:"Removing HDR10+ Metadata",id:"removing-hdr10-metadata",level:3}];function h(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,l.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"hdr10plus_tool",children:"hdr10plus_tool"})}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"hdr10plus_tool"})," is a command line tool written in Rust for working with HDR10+ in HEVC files. It was previously named ",(0,a.jsx)(t.em,{children:"hdr10plus_parser"}),"."]}),"\n",(0,a.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsxs)(s.A,{children:[(0,a.jsxs)(o.A,{value:"unixlike",label:"Linux & macOS",children:[(0,a.jsxs)(t.p,{children:["You can download official pre-built binaries for Linux & macOS from ",(0,a.jsx)(t.a,{href:"https://github.com/quietvoid/hdr10plus_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,a.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})})]}),(0,a.jsxs)(o.A,{value:"windows",label:"Windows",children:[(0,a.jsxs)(t.p,{children:["You can download official pre-built binaries for Windows from ",(0,a.jsx)(t.a,{href:"https://github.com/quietvoid/hdr10plus_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,a.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-pwsh",children:"git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})})]})]}),"\n",(0,a.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",metastring:'title="General usage"',children:"hdr10plus_tool [OPTIONS] \n"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",metastring:'title="Get more options for a subcommand"',children:"hdr10plus_tool --help\n"})}),"\n",(0,a.jsx)(t.h3,{id:"extracting",children:"Extracting"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",metastring:'title="Extract using FFmpeg pipe (Recommended)"',children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool extract -o metadata.json -\n"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",metastring:'title="Extract from raw bitstream"',children:"hdr10plus_tool extract video.hevc -o metadata.json\n"})}),"\n",(0,a.jsx)(t.h3,{id:"injecting",children:"Injecting"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",metastring:'title="Inject to raw bitstream"',children:"hdr10plus_tool inject -i video.hevc -j metadata.json -o injected_output.hevc\n"})}),"\n",(0,a.jsx)(t.h3,{id:"removing-hdr10-metadata",children:"Removing HDR10+ Metadata"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",metastring:'title="Remove using FFmpeg pipe (Recommended)"',children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool remove -\n"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",metastring:'title="Remove from raw bitstream"',children:"hdr10plus_tool remove video.hevc -o hdr10plus_removed_output.hevc\n"})})]})}function p(e={}){const{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>s});n(6540);var r=n(4164);const a={tabItem:"tabItem_Ymn6"};var l=n(4848);function s(e){let{children:t,hidden:n,className:s}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(6540),a=n(4164),l=n(3104),s=n(6347),o=n(205),i=n(7485),u=n(1682),c=n(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}(n);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,i.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=h(e),[s,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,d]=m({queryString:n,groupId:a}),[b,f]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),v=(()=>{const e=u??b;return p({value:e,tabValues:l})?e:null})();(0,o.A)((()=>{v&&i(v)}),[v]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),f(e)}),[d,f,l]),tabValues:l}}var f=n(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=n(4848);function x(e){let{className:t,block:n,selectedValue:r,selectValue:s,tabValues:o}=e;const i=[],{blockElementScrollPositionUntilNextRender:u}=(0,l.a_)(),c=e=>{const t=e.currentTarget,n=i.indexOf(t),a=o[n].value;a!==r&&(u(t),s(a))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=i.indexOf(e.currentTarget)+1;t=i[n]??i[0];break}case"ArrowLeft":{const n=i.indexOf(e.currentTarget)-1;t=i[n]??i[i.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>i.push(e),onKeyDown:d,onClick:c,...l,className:(0,a.A)("tabs__item",v.tabItem,l?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:l}=e;const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===l));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==l})))})}function _(e){const t=b(e);return(0,g.jsxs)("div",{className:(0,a.A)("tabs-container",v.tabList),children:[(0,g.jsx)(x,{...t,...e}),(0,g.jsx)(j,{...t,...e})]})}function w(e){const t=(0,f.A)();return(0,g.jsx)(_,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>o});var r=n(6540);const a={},l=r.createContext(a);function s(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f9208490.f2bf03d7.js b/assets/js/f9208490.f2bf03d7.js deleted file mode 100644 index 1b554965e..000000000 --- a/assets/js/f9208490.f2bf03d7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3229],{6450:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var r=n(4848),a=n(8453),l=n(1470),s=n(9365);const i={title:"hdr10plus_tool",sidebar_position:11},o="hdr10plus_tool",u={id:"utilities/hdr10plus_tool",title:"hdr10plus_tool",description:"hdr10plus_tool is a command line tool written in Rust for working with HDR10+ in HEVC files. It was previously named hdr10plus_parser.",source:"@site/docs/utilities/hdr10plus_tool.mdx",sourceDirName:"utilities",slug:"/utilities/hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/hdr10plus_tool.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"hdr10plus_tool",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"eac3to",permalink:"/docs/utilities/eac3to"},next:{title:"MP4Box",permalink:"/docs/utilities/mp4box"}},c={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Extracting",id:"extracting",level:3},{value:"Injecting",id:"injecting",level:3},{value:"Removing HDR10+ Metadata",id:"removing-hdr10-metadata",level:3}];function h(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"hdr10plus_tool",children:"hdr10plus_tool"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"hdr10plus_tool"})," is a command line tool written in Rust for working with HDR10+ in HEVC files. It was previously named ",(0,r.jsx)(t.em,{children:"hdr10plus_parser"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsxs)(s.A,{value:"unixlike",label:"Linux & macOS",children:[(0,r.jsxs)(t.p,{children:["You can download official pre-built binaries for Linux & macOS from ",(0,r.jsx)(t.a,{href:"https://github.com/quietvoid/hdr10plus_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,r.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})})]}),(0,r.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,r.jsxs)(t.p,{children:["You can download official pre-built binaries for Windows from ",(0,r.jsx)(t.a,{href:"https://github.com/quietvoid/hdr10plus_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,r.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-pwsh",children:"git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="General usage"',children:"hdr10plus_tool [OPTIONS] \n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Get more options for a subcommand"',children:"hdr10plus_tool --help\n"})}),"\n",(0,r.jsx)(t.h3,{id:"extracting",children:"Extracting"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Extract using FFmpeg pipe (Recommended)"',children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool extract -o metadata.json -\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Extract from raw bitstream"',children:"hdr10plus_tool extract video.hevc -o metadata.json\n"})}),"\n",(0,r.jsx)(t.h3,{id:"injecting",children:"Injecting"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Inject to raw bitstream"',children:"hdr10plus_tool inject -i video.hevc -j metadata.json -o injected_output.hevc\n"})}),"\n",(0,r.jsx)(t.h3,{id:"removing-hdr10-metadata",children:"Removing HDR10+ Metadata"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Remove using FFmpeg pipe (Recommended)"',children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool remove -\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Remove from raw bitstream"',children:"hdr10plus_tool remove video.hevc -o hdr10plus_removed_output.hevc\n"})})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>s});n(6540);var r=n(4164);const a={tabItem:"tabItem_Ymn6"};var l=n(4848);function s(e){let{children:t,hidden:n,className:s}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(6540),a=n(4164),l=n(3104),s=n(6347),i=n(205),o=n(7485),u=n(1682),c=n(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}(n);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=h(e),[s,o]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,d]=m({queryString:n,groupId:a}),[b,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),f=(()=>{const e=u??b;return p({value:e,tabValues:l})?e:null})();(0,i.A)((()=>{f&&o(f)}),[f]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),v(e)}),[d,v,l]),tabValues:l}}var v=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=n(4848);function x(e){let{className:t,block:n,selectedValue:r,selectValue:s,tabValues:i}=e;const o=[],{blockElementScrollPositionUntilNextRender:u}=(0,l.a_)(),c=e=>{const t=e.currentTarget,n=o.indexOf(t),a=i[n].value;a!==r&&(u(t),s(a))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=o.indexOf(e.currentTarget)+1;t=o[n]??o[0];break}case"ArrowLeft":{const n=o.indexOf(e.currentTarget)-1;t=o[n]??o[o.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},t),children:i.map((e=>{let{value:t,label:n,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>o.push(e),onKeyDown:d,onClick:c,...l,className:(0,a.A)("tabs__item",f.tabItem,l?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:l}=e;const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===l));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==l})))})}function _(e){const t=b(e);return(0,g.jsxs)("div",{className:(0,a.A)("tabs-container",f.tabList),children:[(0,g.jsx)(x,{...t,...e}),(0,g.jsx)(j,{...t,...e})]})}function w(e){const t=(0,v.A)();return(0,g.jsx)(_,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var r=n(6540);const a={},l=r.createContext(a);function s(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb02bab9.573df022.js b/assets/js/fb02bab9.573df022.js new file mode 100644 index 000000000..011199855 --- /dev/null +++ b/assets/js/fb02bab9.573df022.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5885],{7803:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"filtering/stabilizing","title":"Stabilizing","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","source":"@site/docs/filtering/stabilizing.mdx","sourceDirName":"filtering","slug":"/filtering/stabilizing","permalink":"/docs/filtering/stabilizing","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/stabilizing.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"Stabilizing","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"Decombing","permalink":"/docs/filtering/decombing"},"next":{"title":"Denoise","permalink":"/docs/filtering/denoise"}}');var n=t(4848),r=t(8453);const o={title:"Stabilizing",sidebar_position:7},a="Stabilizing",l={},d=[{value:"Overview",id:"overview",level:2},{value:"Usage",id:"usage",level:2},{value:"vidstabdetect Parameters",id:"vidstabdetect-parameters",level:3},{value:"vidstabtransform Parameters",id:"vidstabtransform-parameters",level:3},{value:"Notes",id:"notes",level:2}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"stabilizing",children:"Stabilizing"})}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsx)(i.h2,{id:"overview",children:"Overview"}),"\n",(0,n.jsxs)(i.p,{children:["Stabilizing is the process of reducing unwanted camera movement and shakes in video clips using ",(0,n.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),". This improves overall encoding efficiency by minimizing unpredictable global movement, such as that from handheld cameras. The recommended method for stabilizing videos with FFmpeg is to use the VidStab library, which requires a build of FFmpeg compiled with ",(0,n.jsx)(i.code,{children:"--enable-libvidstab"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"VidStab offers two filters within FFmpeg:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-shell",children:"ffmpeg -hide_banner -filters | grep vidstab\n ... vidstabdetect V->V Extract relative transformations, pass 1 of 2 for stabilization (see vidstabtransform for pass 2).\n ... vidstabtransform V->V Transform the frames, pass 2 of 2 for stabilization (see vidstabdetect for pass 1).\n"})}),"\n",(0,n.jsxs)(i.p,{children:["The ",(0,n.jsx)(i.code,{children:"vidstabdetect"})," filter is used in the first pass to generate a video transformations file (",(0,n.jsx)(i.code,{children:".trf"}),"), while ",(0,n.jsx)(i.code,{children:"vidstabtransform"})," is employed in the second pass to apply those transformations."]}),"\n",(0,n.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(i.p,{children:"To stabilize a video using default parameters, follow these two steps:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf vidstabdetect -f null -\nffmpeg -i input.mp4 -vf vidstabtransform output.mp4\n"})}),"\n",(0,n.jsxs)(i.p,{children:["After running the first command, a ",(0,n.jsx)(i.code,{children:"transforms.trf"})," file will be created in the directory where you executed FFmpeg. Once the stabilization process is complete, you can safely delete this file. The resulting ",(0,n.jsx)(i.code,{children:"output.mp4"})," video will have reduced shakiness."]}),"\n",(0,n.jsx)(i.p,{children:"For stabilizing high-framerate videos with strong camera movement:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf vidstabdetect=shakiness=8:result=a.trf -f null -\nffmpeg -i input.mp4 -vf vidstabtransform=smoothing=30:zoom=-5:input=a.trf output.mp4\n"})}),"\n",(0,n.jsx)(i.admonition,{type:"tip",children:(0,n.jsxs)(i.p,{children:["Remember to set appropriate video/audio codec parameters in the command before ",(0,n.jsx)(i.code,{children:"output.mp4"}),". You must not use ",(0,n.jsx)(i.code,{children:"-c:v copy"}),", as the video will undergo transformations."]})}),"\n",(0,n.jsx)(i.h3,{id:"vidstabdetect-parameters",children:"vidstabdetect Parameters"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"result"})," - Sets the output ",(0,n.jsx)(i.code,{children:".trf"})," file location"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"shakiness"})," - Adjusts movement reduction, with ",(0,n.jsx)(i.code,{children:"1"})," being the least and ",(0,n.jsx)(i.code,{children:"10"})," the most reduction (highest stabilization). Default is ",(0,n.jsx)(i.code,{children:"5"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"accuracy"})," - Controls movement reduction accuracy. Lower values use less CPU but may be less accurate. FFmpeg's minimum allowed value is ",(0,n.jsx)(i.code,{children:"3"}),". Processing speed was approximately ",(0,n.jsx)(i.code,{children:"21 fps"})," at ",(0,n.jsx)(i.code,{children:"3"})," and ",(0,n.jsx)(i.code,{children:"14 fps"})," at ",(0,n.jsx)(i.code,{children:"15"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["For a complete list of parameters, refer to the ",(0,n.jsx)(i.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#vidstabdetect-1",children:"vidstabdetect documentation"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:"vidstabtransform-parameters",children:"vidstabtransform Parameters"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"input"})," - Specifies the input ",(0,n.jsx)(i.code,{children:".trf"})," file created by ",(0,n.jsx)(i.code,{children:"vidstabdetect"})]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"smoothing"})," - Determines the number of frames considered for future and past movement estimation. Default is ",(0,n.jsx)(i.code,{children:"10"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"zoom"})," - Adjusts the zoom percentage, with ",(0,n.jsx)(i.code,{children:"0%"})," being the default. Negative values create a zoom-out effect."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"interpol"})," - Sets the type of interpolation used:","\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"no"})," - No interpolation"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"linear"})," - Only horizontal"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"bilinear"})," - Faster but may result in blurry output (default)"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"bicubic"})," - Slower"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["See the ",(0,n.jsx)(i.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#vidstabtransform-1",children:"vidstabtransform documentation"})," for more details."]}),"\n",(0,n.jsx)(i.h2,{id:"notes",children:"Notes"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Stabilization is a lossy process that can reduce video quality due to zoom and interpolation effects."}),"\n",(0,n.jsx)(i.li,{children:"Some users may notice overall wobbliness in stabilized videos, especially at higher stabilization levels. This is an inherent characteristic of this filter."}),"\n",(0,n.jsx)(i.li,{children:"Depending on your use case, consider employing two-pass encoding along with these stabilization steps."}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>a});var s=t(6540);const n={},r=s.createContext(n);function o(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb02bab9.88092581.js b/assets/js/fb02bab9.88092581.js deleted file mode 100644 index c9a99eec6..000000000 --- a/assets/js/fb02bab9.88092581.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5885],{5190:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),n=t(8453);const r={title:"Stabilizing",sidebar_position:7},o="Stabilizing",a={id:"filtering/stabilizing",title:"Stabilizing",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/stabilizing.mdx",sourceDirName:"filtering",slug:"/filtering/stabilizing",permalink:"/docs/filtering/stabilizing",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/stabilizing.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"Stabilizing",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Decombing",permalink:"/docs/filtering/decombing"},next:{title:"Denoise",permalink:"/docs/filtering/denoise"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Usage",id:"usage",level:2},{value:"vidstabdetect Parameters",id:"vidstabdetect-parameters",level:3},{value:"vidstabtransform Parameters",id:"vidstabtransform-parameters",level:3},{value:"Notes",id:"notes",level:2}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"stabilizing",children:"Stabilizing"})}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsx)(i.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsxs)(i.p,{children:["Stabilizing is the process of reducing unwanted camera movement and shakes in video clips using ",(0,s.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),". This improves overall encoding efficiency by minimizing unpredictable global movement, such as that from handheld cameras. The recommended method for stabilizing videos with FFmpeg is to use the VidStab library, which requires a build of FFmpeg compiled with ",(0,s.jsx)(i.code,{children:"--enable-libvidstab"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"VidStab offers two filters within FFmpeg:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-shell",children:"ffmpeg -hide_banner -filters | grep vidstab\n ... vidstabdetect V->V Extract relative transformations, pass 1 of 2 for stabilization (see vidstabtransform for pass 2).\n ... vidstabtransform V->V Transform the frames, pass 2 of 2 for stabilization (see vidstabdetect for pass 1).\n"})}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"vidstabdetect"})," filter is used in the first pass to generate a video transformations file (",(0,s.jsx)(i.code,{children:".trf"}),"), while ",(0,s.jsx)(i.code,{children:"vidstabtransform"})," is employed in the second pass to apply those transformations."]}),"\n",(0,s.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(i.p,{children:"To stabilize a video using default parameters, follow these two steps:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf vidstabdetect -f null -\nffmpeg -i input.mp4 -vf vidstabtransform output.mp4\n"})}),"\n",(0,s.jsxs)(i.p,{children:["After running the first command, a ",(0,s.jsx)(i.code,{children:"transforms.trf"})," file will be created in the directory where you executed FFmpeg. Once the stabilization process is complete, you can safely delete this file. The resulting ",(0,s.jsx)(i.code,{children:"output.mp4"})," video will have reduced shakiness."]}),"\n",(0,s.jsx)(i.p,{children:"For stabilizing high-framerate videos with strong camera movement:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf vidstabdetect=shakiness=8:result=a.trf -f null -\nffmpeg -i input.mp4 -vf vidstabtransform=smoothing=30:zoom=-5:input=a.trf output.mp4\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"tip",children:(0,s.jsxs)(i.p,{children:["Remember to set appropriate video/audio codec parameters in the command before ",(0,s.jsx)(i.code,{children:"output.mp4"}),". You must not use ",(0,s.jsx)(i.code,{children:"-c:v copy"}),", as the video will undergo transformations."]})}),"\n",(0,s.jsx)(i.h3,{id:"vidstabdetect-parameters",children:"vidstabdetect Parameters"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"result"})," - Sets the output ",(0,s.jsx)(i.code,{children:".trf"})," file location"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"shakiness"})," - Adjusts movement reduction, with ",(0,s.jsx)(i.code,{children:"1"})," being the least and ",(0,s.jsx)(i.code,{children:"10"})," the most reduction (highest stabilization). Default is ",(0,s.jsx)(i.code,{children:"5"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"accuracy"})," - Controls movement reduction accuracy. Lower values use less CPU but may be less accurate. FFmpeg's minimum allowed value is ",(0,s.jsx)(i.code,{children:"3"}),". Processing speed was approximately ",(0,s.jsx)(i.code,{children:"21 fps"})," at ",(0,s.jsx)(i.code,{children:"3"})," and ",(0,s.jsx)(i.code,{children:"14 fps"})," at ",(0,s.jsx)(i.code,{children:"15"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["For a complete list of parameters, refer to the ",(0,s.jsx)(i.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#vidstabdetect-1",children:"vidstabdetect documentation"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"vidstabtransform-parameters",children:"vidstabtransform Parameters"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"input"})," - Specifies the input ",(0,s.jsx)(i.code,{children:".trf"})," file created by ",(0,s.jsx)(i.code,{children:"vidstabdetect"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"smoothing"})," - Determines the number of frames considered for future and past movement estimation. Default is ",(0,s.jsx)(i.code,{children:"10"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"zoom"})," - Adjusts the zoom percentage, with ",(0,s.jsx)(i.code,{children:"0%"})," being the default. Negative values create a zoom-out effect."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"interpol"})," - Sets the type of interpolation used:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"no"})," - No interpolation"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"linear"})," - Only horizontal"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"bilinear"})," - Faster but may result in blurry output (default)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"bicubic"})," - Slower"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["See the ",(0,s.jsx)(i.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#vidstabtransform-1",children:"vidstabtransform documentation"})," for more details."]}),"\n",(0,s.jsx)(i.h2,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Stabilization is a lossy process that can reduce video quality due to zoom and interpolation effects."}),"\n",(0,s.jsx)(i.li,{children:"Some users may notice overall wobbliness in stabilized videos, especially at higher stabilization levels. This is an inherent characteristic of this filter."}),"\n",(0,s.jsx)(i.li,{children:"Depending on your use case, consider employing two-pass encoding along with these stabilization steps."}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>a});var s=t(6540);const n={},r=s.createContext(n);function o(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fda0af90.0cdab8f6.js b/assets/js/fda0af90.0cdab8f6.js new file mode 100644 index 000000000..b8c9af810 --- /dev/null +++ b/assets/js/fda0af90.0cdab8f6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5376],{4616:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"colorimetry/primaries","title":"Color Primaries","description":"This section details the first of three settings that are important","source":"@site/docs/colorimetry/primaries.mdx","sourceDirName":"colorimetry","slug":"/colorimetry/primaries","permalink":"/docs/colorimetry/primaries","draft":false,"unlisted":false,"editUrl":"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/primaries.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Color Primaries","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Color Range","permalink":"/docs/colorimetry/range"},"next":{"title":"Transfer Characteristics","permalink":"/docs/colorimetry/transfer"}}');var t=n(4848),r=n(8453);const l={title:"Color Primaries",sidebar_position:4},a="Color Primaries",o={},d=[{value:"1: BT.709",id:"1-bt709",level:3},{value:"2: Unspecified",id:"2-unspecified",level:3},{value:"4: BT.470M",id:"4-bt470m",level:3},{value:"5: BT.470BG",id:"5-bt470bg",level:3},{value:"6: SMPTE 170M",id:"6-smpte-170m",level:3},{value:"7: SMPTE 240M",id:"7-smpte-240m",level:3},{value:"8: Film",id:"8-film",level:3},{value:"9: BT.2020",id:"9-bt2020",level:3},{value:"10: SMPTE 428",id:"10-smpte-428",level:3},{value:"11: DCI-P3",id:"11-dci-p3",level:3},{value:"12: Display-P3",id:"12-display-p3",level:3},{value:"22: EBU Tech 3213",id:"22-ebu-tech-3213",level:3}];function c(e){const i={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"color-primaries",children:"Color Primaries"})}),"\n",(0,t.jsx)(i.p,{children:"This section details the first of three settings that are important\nfor retaining accurate color when encoding videos, those settings\nbeing primaries, color matrix, and transfer characteristics."}),"\n",(0,t.jsxs)(i.p,{children:["Color primaries are used to indicate the correct coordinates for the\nred, blue, and green colors. There are historical reasons for\n",(0,t.jsx)(i.a,{href:"https://xkcd.com/927/",children:"why so many standards exist"}),", and this guide\nwill not go in depth into history lessons, but will explain what\nprimaries are available and when to use each one."]}),"\n",(0,t.jsxs)(i.p,{children:["Note that for primaries, matrices, and transfer, you can view the values\nthat are set on a video using a tool like ",(0,t.jsx)(i.a,{href:"https://mediaarea.net/en/MediaInfo",children:"MediaInfo"}),".\nIf there are no values set, the player will need to guess which values\nto use. A safe default assumption for most modern videos is BT.709,\nalthough this may vary depending on source and resolution for the video.\nIt is strongly recommended to set the correct values when encoding."]}),"\n",(0,t.jsx)(i.p,{children:"Each setting has at least one name and exactly one integer value\nrepresenting it--most encoder softwares will accept one or more of the names,\nbut some tooling such as Vapoursynth and MKVToolnix accepts the integer values\ninstead. The integer values are defined within universal specifications,\nand as such they will be the same across all encoding and playback tools."}),"\n",(0,t.jsx)(i.h3,{id:"1-bt709",children:"1: BT.709"}),"\n",(0,t.jsx)(i.p,{children:"BT.709 is the standard used for modern high-definition video, and is a safe default assumption."}),"\n",(0,t.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.709-6"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.1361-0 conventional colour gamut\nsystem and extended colour gamut system (historical)"}),"\n",(0,t.jsx)(i.li,{children:"IEC 61966-2-1 sRGB or sYCC"}),"\n",(0,t.jsx)(i.li,{children:"IEC 61966-2-4"}),"\n",(0,t.jsx)(i.li,{children:"Society of Motion Picture and Television Engineers\n(SMPTE) RP 177 (1993) Annex B"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"2-unspecified",children:"2: Unspecified"}),"\n",(0,t.jsx)(i.p,{children:"This value indicates that no color primary is set for the video, and the player must decide which value to use."}),"\n",(0,t.jsx)(i.p,{children:"mpv will use the following heuristics in this case:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'if matrix == "BT.2020" {\n "BT.2020"\n} else if matrix == "BT.709" {\n "BT.709"\n} else if width >= 1280 || height > 576 {\n "BT.709"\n} else if height == 576 {\n "BT.470BG"\n} else if height == 480 || height == 488 {\n "SMPTE 170M"\n} else {\n "BT.709"\n}\n'})}),"\n",(0,t.jsx)(i.h3,{id:"4-bt470m",children:"4: BT.470M"}),"\n",(0,t.jsx)(i.p,{children:"BT.470M is a standard that was used in analog television systems in the United States."}),"\n",(0,t.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.470-6 System M (historical)"}),"\n",(0,t.jsx)(i.li,{children:"United States National Television System Committee\n1953 Recommendation for transmission standards for\ncolor television"}),"\n",(0,t.jsx)(i.li,{children:"United States Federal Communications Commission\n(2003) Title 47 Code of Federal Regulations 73.682 (a) (20)"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"5-bt470bg",children:"5: BT.470BG"}),"\n",(0,t.jsx)(i.p,{children:"BT.470BG is a standard that was used for European (PAL) television systems and DVDs."}),"\n",(0,t.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.470-6 System B, G (historical)"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.601-7 625"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.1358-0 625 (historical)"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 625 PAL and 625 SECAM"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"6-smpte-170m",children:"6: SMPTE 170M"}),"\n",(0,t.jsx)(i.p,{children:"SMPTE 170M is a standard that was used for NTSC television systems and DVDs."}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.601-7 525"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.1358-1 525 or 625 (historical)"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 NTSC"}),"\n",(0,t.jsx)(i.li,{children:"SMPTE ST 170 (2004)"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"7-smpte-240m",children:"7: SMPTE 240M"}),"\n",(0,t.jsx)(i.p,{children:"SMPTE 240M was an interim standard used during the early days of HDTV (1988-1998). Its primaries are equivalent to SMPTE 170M."}),"\n",(0,t.jsx)(i.h3,{id:"8-film",children:"8: Film"}),"\n",(0,t.jsx)(i.p,{children:"This represents generic film using Illuminant C."}),"\n",(0,t.jsx)(i.h3,{id:"9-bt2020",children:"9: BT.2020"}),"\n",(0,t.jsx)(i.p,{children:"BT.2020 is a standard used for ultra-high-definition video, i.e. 4K and higher. It may be used with or without HDR, as HDR is defined by the transfer characteristics."}),"\n",(0,t.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.2020-2"}),"\n",(0,t.jsx)(i.li,{children:"Rec. ITU-R BT.2100-2"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"10-smpte-428",children:"10: SMPTE 428"}),"\n",(0,t.jsx)(i.p,{children:"SMPTE 428 is used for D-Cinema Distribution Masters, aka DCDM."}),"\n",(0,t.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"SMPTE ST 428-1 (2019)"}),"\n",(0,t.jsx)(i.li,{children:"(CIE 1931 XYZ as in ISO 11664-1)"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"11-dci-p3",children:"11: DCI-P3"}),"\n",(0,t.jsx)(i.p,{children:"DCI-P3 is a wide-gamut colorspace used alongside RGB. It is used internally by most HDR monitors on the market."}),"\n",(0,t.jsx)(i.h3,{id:"12-display-p3",children:"12: Display-P3"}),"\n",(0,t.jsx)(i.p,{children:"Display-P3 is a variant of DCI-P3 developed by Apple because they wanted to be different."}),"\n",(0,t.jsx)(i.h3,{id:"22-ebu-tech-3213",children:"22: EBU Tech 3213"}),"\n",(0,t.jsx)(i.p,{children:"Nobody really knows what this is."})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>l,x:()=>a});var s=n(6540);const t={},r=s.createContext(t);function l(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fda0af90.cf56670d.js b/assets/js/fda0af90.cf56670d.js deleted file mode 100644 index b285b6950..000000000 --- a/assets/js/fda0af90.cf56670d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5376],{7615:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=n(4848),t=n(8453);const r={title:"Color Primaries",sidebar_position:4},l="Color Primaries",a={id:"colorimetry/primaries",title:"Color Primaries",description:"This section details the first of three settings that are important",source:"@site/docs/colorimetry/primaries.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/primaries",permalink:"/docs/colorimetry/primaries",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/primaries.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Color Primaries",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Color Range",permalink:"/docs/colorimetry/range"},next:{title:"Transfer Characteristics",permalink:"/docs/colorimetry/transfer"}},o={},d=[{value:"1: BT.709",id:"1-bt709",level:3},{value:"2: Unspecified",id:"2-unspecified",level:3},{value:"4: BT.470M",id:"4-bt470m",level:3},{value:"5: BT.470BG",id:"5-bt470bg",level:3},{value:"6: SMPTE 170M",id:"6-smpte-170m",level:3},{value:"7: SMPTE 240M",id:"7-smpte-240m",level:3},{value:"8: Film",id:"8-film",level:3},{value:"9: BT.2020",id:"9-bt2020",level:3},{value:"10: SMPTE 428",id:"10-smpte-428",level:3},{value:"11: DCI-P3",id:"11-dci-p3",level:3},{value:"12: Display-P3",id:"12-display-p3",level:3},{value:"22: EBU Tech 3213",id:"22-ebu-tech-3213",level:3}];function c(e){const i={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"color-primaries",children:"Color Primaries"})}),"\n",(0,s.jsx)(i.p,{children:"This section details the first of three settings that are important\nfor retaining accurate color when encoding videos, those settings\nbeing primaries, color matrix, and transfer characteristics."}),"\n",(0,s.jsxs)(i.p,{children:["Color primaries are used to indicate the correct coordinates for the\nred, blue, and green colors. There are historical reasons for\n",(0,s.jsx)(i.a,{href:"https://xkcd.com/927/",children:"why so many standards exist"}),", and this guide\nwill not go in depth into history lessons, but will explain what\nprimaries are available and when to use each one."]}),"\n",(0,s.jsxs)(i.p,{children:["Note that for primaries, matrices, and transfer, you can view the values\nthat are set on a video using a tool like ",(0,s.jsx)(i.a,{href:"https://mediaarea.net/en/MediaInfo",children:"MediaInfo"}),".\nIf there are no values set, the player will need to guess which values\nto use. A safe default assumption for most modern videos is BT.709,\nalthough this may vary depending on source and resolution for the video.\nIt is strongly recommended to set the correct values when encoding."]}),"\n",(0,s.jsx)(i.p,{children:"Each setting has at least one name and exactly one integer value\nrepresenting it--most encoder softwares will accept one or more of the names,\nbut some tooling such as Vapoursynth and MKVToolnix accepts the integer values\ninstead. The integer values are defined within universal specifications,\nand as such they will be the same across all encoding and playback tools."}),"\n",(0,s.jsx)(i.h3,{id:"1-bt709",children:"1: BT.709"}),"\n",(0,s.jsx)(i.p,{children:"BT.709 is the standard used for modern high-definition video, and is a safe default assumption."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.709-6"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1361-0 conventional colour gamut\nsystem and extended colour gamut system (historical)"}),"\n",(0,s.jsx)(i.li,{children:"IEC 61966-2-1 sRGB or sYCC"}),"\n",(0,s.jsx)(i.li,{children:"IEC 61966-2-4"}),"\n",(0,s.jsx)(i.li,{children:"Society of Motion Picture and Television Engineers\n(SMPTE) RP 177 (1993) Annex B"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"2-unspecified",children:"2: Unspecified"}),"\n",(0,s.jsx)(i.p,{children:"This value indicates that no color primary is set for the video, and the player must decide which value to use."}),"\n",(0,s.jsx)(i.p,{children:"mpv will use the following heuristics in this case:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'if matrix == "BT.2020" {\n "BT.2020"\n} else if matrix == "BT.709" {\n "BT.709"\n} else if width >= 1280 || height > 576 {\n "BT.709"\n} else if height == 576 {\n "BT.470BG"\n} else if height == 480 || height == 488 {\n "SMPTE 170M"\n} else {\n "BT.709"\n}\n'})}),"\n",(0,s.jsx)(i.h3,{id:"4-bt470m",children:"4: BT.470M"}),"\n",(0,s.jsx)(i.p,{children:"BT.470M is a standard that was used in analog television systems in the United States."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.470-6 System M (historical)"}),"\n",(0,s.jsx)(i.li,{children:"United States National Television System Committee\n1953 Recommendation for transmission standards for\ncolor television"}),"\n",(0,s.jsx)(i.li,{children:"United States Federal Communications Commission\n(2003) Title 47 Code of Federal Regulations 73.682 (a) (20)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"5-bt470bg",children:"5: BT.470BG"}),"\n",(0,s.jsx)(i.p,{children:"BT.470BG is a standard that was used for European (PAL) television systems and DVDs."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.470-6 System B, G (historical)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.601-7 625"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1358-0 625 (historical)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 625 PAL and 625 SECAM"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"6-smpte-170m",children:"6: SMPTE 170M"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 170M is a standard that was used for NTSC television systems and DVDs."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.601-7 525"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1358-1 525 or 625 (historical)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 NTSC"}),"\n",(0,s.jsx)(i.li,{children:"SMPTE ST 170 (2004)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"7-smpte-240m",children:"7: SMPTE 240M"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 240M was an interim standard used during the early days of HDTV (1988-1998). Its primaries are equivalent to SMPTE 170M."}),"\n",(0,s.jsx)(i.h3,{id:"8-film",children:"8: Film"}),"\n",(0,s.jsx)(i.p,{children:"This represents generic film using Illuminant C."}),"\n",(0,s.jsx)(i.h3,{id:"9-bt2020",children:"9: BT.2020"}),"\n",(0,s.jsx)(i.p,{children:"BT.2020 is a standard used for ultra-high-definition video, i.e. 4K and higher. It may be used with or without HDR, as HDR is defined by the transfer characteristics."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.2020-2"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.2100-2"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"10-smpte-428",children:"10: SMPTE 428"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 428 is used for D-Cinema Distribution Masters, aka DCDM."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"SMPTE ST 428-1 (2019)"}),"\n",(0,s.jsx)(i.li,{children:"(CIE 1931 XYZ as in ISO 11664-1)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"11-dci-p3",children:"11: DCI-P3"}),"\n",(0,s.jsx)(i.p,{children:"DCI-P3 is a wide-gamut colorspace used alongside RGB. It is used internally by most HDR monitors on the market."}),"\n",(0,s.jsx)(i.h3,{id:"12-display-p3",children:"12: Display-P3"}),"\n",(0,s.jsx)(i.p,{children:"Display-P3 is a variant of DCI-P3 developed by Apple because they wanted to be different."}),"\n",(0,s.jsx)(i.h3,{id:"22-ebu-tech-3213",children:"22: EBU Tech 3213"}),"\n",(0,s.jsx)(i.p,{children:"Nobody really knows what this is."})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>l,x:()=>a});var s=n(6540);const t={},r=s.createContext(t);function l(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.0d7a5f66.js b/assets/js/main.0d7a5f66.js deleted file mode 100644 index dccd1f010..000000000 --- a/assets/js/main.0d7a5f66.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.0d7a5f66.js.LICENSE.txt */ -(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8792],{5391:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"0058b4c6":[()=>n.e(849).then(n.t.bind(n,6164,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",6164],"0092d9fd":[()=>n.e(9057).then(n.bind(n,3372)),"@site/docs/audio/FLAC.mdx",3372],"015d9d66":[()=>n.e(4598).then(n.bind(n,1854)),"@site/docs/metrics/PSNR.mdx",1854],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,9158)),"@theme/BlogTagsListPage",9158],"03af419f":[()=>Promise.all([n.e(1869),n.e(9305)]).then(n.bind(n,1865)),"@site/docs/encoders/VVenC.mdx",1865],"03e95fdf":[()=>n.e(3485).then(n.bind(n,1789)),"@site/docs/video/VP8.mdx",1789],"04dda763":[()=>n.e(6778).then(n.bind(n,3763)),"@site/blog/2024-06-24-av1-for-dummies-2.mdx",3763],"059e36ab":[()=>n.e(6838).then(n.bind(n,6587)),"@site/docs/video/utvideo.mdx",6587],"06ed4e86":[()=>n.e(8161).then(n.bind(n,3514)),"@site/docs/audio/Dolby.mdx",3514],"09a8bfdb":[()=>n.e(5579).then(n.bind(n,4070)),"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",4070],"09bc817a":[()=>n.e(1554).then(n.bind(n,5811)),"@site/docs/audio/Opus.mdx",5811],"0b185270":[()=>n.e(3482).then(n.bind(n,455)),"@site/docs/FAQ.mdx",455],"0c06159a":[()=>n.e(8258).then(n.bind(n,1339)),"@site/docs/data/tar.mdx",1339],"0e7f53a8":[()=>n.e(9954).then(n.bind(n,929)),"@site/docs/images/PNG.mdx",929],"112763a5":[()=>n.e(1779).then(n.bind(n,5836)),"@site/docs/terms-of-use.mdx",5836],"12b076f3":[()=>n.e(7222).then(n.bind(n,9905)),"@site/docs/data/zstd.mdx",9905],"12df3b9e":[()=>n.e(9993).then(n.bind(n,1793)),"@site/docs/images/QOI.mdx",1793],"138e0e15":[()=>n.e(4921).then(n.t.bind(n,1597,19)),"@generated/@easyops-cn/docusaurus-search-local/default/__plugin.json",1597],17896441:[()=>Promise.all([n.e(1869),n.e(8498),n.e(8401)]).then(n.bind(n,575)),"@theme/DocItem",575],"1817a557":[()=>n.e(6738).then(n.bind(n,6118)),"@site/docs/introduction/lossless.mdx",6118],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,1283)),"@theme/SearchPage",1283],"1b67d0f3":[()=>n.e(842).then(n.bind(n,4476)),"@site/docs/data/gzip.mdx",4476],"1ca2b1db":[()=>n.e(7855).then(n.bind(n,9073)),"@site/docs/encoders_hw/mediacodec.mdx",9073],"1e5c3f00":[()=>n.e(9486).then(n.bind(n,3585)),"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx",3585],"1ec3ce74":[()=>Promise.all([n.e(1869),n.e(2142)]).then(n.bind(n,5780)),"@site/docs/encoders/rav1e.mdx",5780],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(8498),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"1fabe0bd":[()=>n.e(5562).then(n.bind(n,3315)),"@site/docs/colorimetry/intro.mdx",3315],"20d769d8":[()=>n.e(3121).then(n.bind(n,7114)),"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx?truncated=true",7114],"229f7513":[()=>n.e(7146).then(n.bind(n,4153)),"@site/docs/subtitles/webvtt.mdx",4153],"28bd9d7a":[()=>n.e(888).then(n.bind(n,1849)),"@site/docs/utilities/FFMetrics.mdx",1849],"299beccc":[()=>n.e(5479).then(n.bind(n,1531)),"@site/docs/data/7z.mdx",1531],"2d25ac87":[()=>n.e(5949).then(n.bind(n,822)),"@site/docs/utilities/autocompressor.mdx",822],"2e23a845":[()=>Promise.all([n.e(1869),n.e(5147)]).then(n.bind(n,2914)),"@site/docs/encoders/SVT-AV1-PSY.mdx",2914],"2fcb10cd":[()=>n.e(8158).then(n.bind(n,1162)),"@site/docs/audio/intro.mdx",1162],"318608aa":[()=>Promise.all([n.e(1869),n.e(6003)]).then(n.bind(n,3187)),"@site/docs/encoders/vpxenc.mdx",3187],32987299:[()=>n.e(7754).then(n.bind(n,5029)),"@site/docs/filtering/vapoursynth.mdx",5029],"345ef4f9":[()=>n.e(6509).then(n.bind(n,5389)),"@site/docs/utilities/MKVToolNix.mdx",5389],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"37c719d6":[()=>Promise.all([n.e(6256),n.e(1227)]).then(n.bind(n,1800)),"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx",1800],"3a2db09e":[()=>n.e(8121).then(n.t.bind(n,8070,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",8070],"3d6cf458":[()=>n.e(2614).then(n.bind(n,6396)),"@site/docs/video/VC-1.mdx",6396],"43624f55":[()=>n.e(7844).then(n.bind(n,3676)),"@site/docs/filtering/ivtc.mdx",3676],"44e37655":[()=>Promise.all([n.e(1869),n.e(5958)]).then(n.bind(n,6147)),"@site/docs/metrics/SSIMULACRA2.mdx",6147],"45f4020c":[()=>n.e(4897).then(n.bind(n,9493)),"@site/docs/encoders_hw/videotoolbox.mdx",9493],"467a109f":[()=>n.e(7431).then(n.t.bind(n,891,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-benchmarks-180.json",891],"48b7ca01":[()=>Promise.all([n.e(6256),n.e(1347)]).then(n.bind(n,9350)),"@site/blog/2023-12-30-svt-av1-deep-dive.mdx?truncated=true",9350],"49b64d14":[()=>Promise.all([n.e(1869),n.e(5993)]).then(n.bind(n,4493)),"@site/docs/encoders/SVT-AV1.mdx",4493],"4c678320":[()=>n.e(9664).then(n.bind(n,2051)),"@site/src/pages/markdown-page.mdx",2051],"4d877b09":[()=>n.e(2150).then(n.bind(n,8493)),"@site/docs/encoders_hw/qsv.mdx",8493],"522a92e3":[()=>n.e(5220).then(n.bind(n,2191)),"@site/docs/encoders_hw/nvenc.mdx",2191],"54a9c2bb":[()=>n.e(561).then(n.bind(n,3633)),"@site/docs/utilities/YUView.mdx",3633],56786013:[()=>n.e(8741).then(n.bind(n,3588)),"@site/docs/images/JPEG.mdx",3588],"59e6fde5":[()=>n.e(9724).then(n.bind(n,357)),"@site/blog/2024-06-24-av1-for-dummies-2.mdx?truncated=true",357],"5b209502":[()=>n.e(4176).then(n.bind(n,4296)),"@site/docs/filtering/deinterlace.mdx",4296],"5d1a7e8b":[()=>n.e(5936).then(n.bind(n,63)),"@site/docs/video-players.mdx",63],"5db6705b":[()=>n.e(1624).then(n.bind(n,9828)),"@site/docs/utilities/nmkoder.mdx",9828],"5e069031":[()=>n.e(5968).then(n.bind(n,9483)),"@site/docs/introduction/prologue.mdx",9483],"5e1194df":[()=>n.e(4822).then(n.bind(n,5160)),"@site/docs/data/zpaq.mdx",5160],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5ec46d54":[()=>n.e(1481).then(n.bind(n,2886)),"@site/docs/video/ECM.mdx",2886],"5f74c797":[()=>Promise.all([n.e(1869),n.e(5745)]).then(n.bind(n,6185)),"@site/docs/utilities/av1an.mdx",6185],"632d0ef1":[()=>n.e(106).then(n.bind(n,1598)),"@site/docs/encoders/VTM.mdx",1598],"6549b2b5":[()=>n.e(4846).then(n.bind(n,2417)),"@site/blog/2023-07-21-site-optimization.mdx",2417],"65524f4d":[()=>n.e(6891).then(n.bind(n,2030)),"@site/docs/filtering/antialiasing.mdx",2030],66935117:[()=>n.e(2017).then(n.t.bind(n,5585,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-anniversary-322.json",5585],"6875c492":[()=>Promise.all([n.e(1869),n.e(8498),n.e(8793),n.e(4813)]).then(n.bind(n,1086)),"@theme/BlogTagsPostsPage",1086],"68dcf780":[()=>n.e(1315).then(n.bind(n,1538)),"@site/docs/filtering/decombing.mdx",1538],"6bf0f114":[()=>n.e(881).then(n.bind(n,779)),"@site/docs/data/zip.mdx",779],"6c179ac5":[()=>n.e(4072).then(n.bind(n,9964)),"@site/docs/video/Theora.mdx",9964],"6d85920a":[()=>n.e(7800).then(n.bind(n,3911)),"@site/docs/introduction/terminology.mdx",3911],70006292:[()=>n.e(9987).then(n.bind(n,1359)),"@site/docs/encoders/x266.mdx",1359],"70de1c07":[()=>Promise.all([n.e(6256),n.e(544)]).then(n.bind(n,850)),"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",850],"7385c97b":[()=>n.e(8415).then(n.bind(n,5322)),"@site/docs/images/AVIF.mdx",5322],"75936cdf":[()=>n.e(7564).then(n.bind(n,9613)),"@site/docs/filtering/graining.mdx",9613],"76096a15":[()=>n.e(8924).then(n.bind(n,8560)),"@site/docs/subtitles/SRT.mdx",8560],"7d09a242":[()=>Promise.all([n.e(1869),n.e(6692)]).then(n.bind(n,1586)),"@site/docs/encoders/aomenc.mdx",1586],"7eff0f1a":[()=>n.e(2515).then(n.bind(n,7199)),"@site/docs/video/AVC.mdx",7199],"7f76a12e":[()=>n.e(1502).then(n.bind(n,2225)),"@site/blog/2023-09-03-av1-for-dummies.mdx",2225],"7fa695a7":[()=>n.e(1363).then(n.bind(n,6046)),"@site/docs/images/GIF.mdx",6046],80447496:[()=>n.e(7715).then(n.bind(n,6520)),"@site/docs/video/VVC.mdx",6520],"80bfa96b":[()=>n.e(2901).then(n.bind(n,9340)),"@site/docs/resources.mdx",9340],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],81739261:[()=>n.e(4794).then(n.bind(n,2358)),"@site/docs/video/prores.mdx",2358],"83732ada":[()=>n.e(6840).then(n.bind(n,3387)),"@site/docs/video/HEVC.mdx",3387],"841b1305":[()=>Promise.all([n.e(1869),n.e(9939)]).then(n.bind(n,7026)),"@site/docs/encoders/uavs3e.mdx",7026],"842a7beb":[()=>n.e(6866).then(n.bind(n,7216)),"@site/docs/utilities/rAV1ator.mdx",7216],"84e198a2":[()=>n.e(6711).then(n.bind(n,2955)),"@site/docs/utilities/eac3to.mdx",2955],"86ba2311":[()=>n.e(8141).then(n.bind(n,4632)),"@site/docs/video/VP9.mdx",4632],"8a894f7b":[()=>n.e(538).then(n.bind(n,8245)),"@site/docs/introduction/video-artifacts.mdx",8245],"8aacd032":[()=>n.e(2897).then(n.bind(n,6669)),"@site/docs/video/AV1.mdx",6669],"8bdabb45":[()=>n.e(7957).then(n.bind(n,5575)),"@site/docs/encoders/AVM.mdx",5575],"8eb2df80":[()=>Promise.all([n.e(1869),n.e(7796)]).then(n.bind(n,5101)),"@site/docs/utilities/rav1ator-cli.mdx",5101],"8ee2fdd1":[()=>Promise.all([n.e(1869),n.e(8420)]).then(n.bind(n,4335)),"@site/docs/encoders/aom-av1-lavish.mdx",4335],"8f6f5e4c":[()=>n.e(8760).then(n.bind(n,4216)),"@site/docs/colorimetry/format.mdx",4216],"904009dc":[()=>n.e(822).then(n.t.bind(n,8235,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-web-377.json",8235],"9060e84a":[()=>n.e(8320).then(n.bind(n,4e3)),"@site/docs/encoders/HM.mdx",4e3],"90aedb84":[()=>n.e(1691).then(n.bind(n,8872)),"@site/docs/introduction/psychovisual.mdx",8872],"915a111c":[()=>n.e(5889).then(n.bind(n,1389)),"@site/docs/filtering/dehalo.mdx",1389],"92fa5ef1":[()=>n.e(4044).then(n.t.bind(n,9232,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-history-b17.json",9232],"939f23de":[()=>n.e(2590).then(n.bind(n,631)),"@site/docs/filtering/basics.mdx",631],"94782d2d":[()=>n.e(4597).then(n.bind(n,2774)),"@site/docs/colorimetry/range.mdx",2774],"95e9a4c5":[()=>n.e(3672).then(n.bind(n,7426)),"@site/docs/utilities/Discord.mdx",7426],"998d107e":[()=>n.e(274).then(n.bind(n,7672)),"@site/docs/video/FFV1.mdx",7672],"99c26446":[()=>n.e(8026).then(n.bind(n,1455)),"@site/docs/metrics/butteraugli.mdx",1455],"9ba56b79":[()=>n.e(1288).then(n.bind(n,5495)),"@site/docs/encoders_hw/amf.mdx",5495],"9c171e5c":[()=>n.e(8773).then(n.bind(n,3061)),"@site/docs/metrics/SSIM.mdx",3061],"9cae5962":[()=>Promise.all([n.e(1869),n.e(71)]).then(n.bind(n,5650)),"@site/docs/images/JXL.mdx",5650],"9e4087bc":[()=>n.e(2711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],"9efd8a4a":[()=>n.e(5415).then(n.bind(n,1076)),"@site/docs/images/WebP.mdx",1076],"9f640ee8":[()=>n.e(6810).then(n.bind(n,5864)),"@site/docs/encoders/Aurora1.mdx",5864],"9f709603":[()=>n.e(5341).then(n.bind(n,3414)),"@site/docs/filtering/deband.mdx",3414],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(8498),n.e(8793),n.e(7643)]).then(n.bind(n,5124)),"@theme/BlogListPage",5124],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a8f610c9:[()=>n.e(8599).then(n.bind(n,5860)),"@site/docs/data/brotli.mdx",5860],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1377)),"@theme/DocRoot",1377],aaf3ff15:[()=>n.e(3170).then(n.t.bind(n,5890,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-compression-44b.json",5890],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],acf4709b:[()=>n.e(7225).then(n.bind(n,1918)),"@site/docs/subtitles/SSA.mdx",1918],afe5e22f:[()=>n.e(8117).then(n.bind(n,1624)),"@site/docs/encoders/x265.mdx",1624],b0535000:[()=>n.e(7238).then(n.bind(n,851)),"@site/blog/2023-07-21-site-optimization.mdx?truncated=true",851],b261517a:[()=>Promise.all([n.e(6256),n.e(1454)]).then(n.bind(n,3012)),"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx?truncated=true",3012],b4030b4d:[()=>Promise.all([n.e(1869),n.e(3408)]).then(n.bind(n,6856)),"@site/docs/utilities/Aviator.mdx",6856],b4bbde8e:[()=>n.e(7989).then(n.bind(n,965)),"@site/docs/audio/AAC.mdx",965],b59b8cf7:[()=>n.e(1271).then(n.bind(n,5423)),"@site/docs/audio/Vorbis.mdx",5423],b8af02bf:[()=>n.e(3222).then(n.bind(n,1158)),"@site/docs/images/JPEG2000.mdx",1158],bb17976f:[()=>Promise.all([n.e(1869),n.e(8943)]).then(n.bind(n,2591)),"@site/docs/encoders/aom-psy101.mdx",2591],bc32b9c5:[()=>n.e(786).then(n.bind(n,8450)),"@site/docs/metrics/XPSNR.mdx",8450],bd173b27:[()=>n.e(1651).then(n.bind(n,4646)),"@site/docs/data/xz.mdx",4646],be236901:[()=>n.e(6795).then(n.bind(n,7090)),"@site/docs/contribution-guide.mdx",7090],bf9d09b6:[()=>Promise.all([n.e(1869),n.e(8270)]).then(n.bind(n,6491)),"@site/docs/encoders/SVT-HEVC.mdx",6491],c15d9823:[()=>n.e(8146).then(n.t.bind(n,9328,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",9328],c19fbcae:[()=>n.e(4501).then(n.bind(n,5341)),"@site/docs/audio/ALAC.mdx",5341],c224274c:[()=>n.e(3356).then(n.bind(n,4736)),"@site/docs/video/AVS3.mdx",4736],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,1459)),"@site/src/pages/index.js",1459],c7deb2e0:[()=>n.e(9551).then(n.bind(n,9009)),"@site/docs/audio/WavPack.mdx",9009],c92fe796:[()=>n.e(3034).then(n.bind(n,3083)),"@site/docs/utilities/ffmpeg.mdx",3083],c943a24a:[()=>n.e(5512).then(n.bind(n,556)),"@site/docs/introduction/high-dynamic-range.mdx",556],ccc49370:[()=>Promise.all([n.e(1869),n.e(8498),n.e(8793),n.e(3249)]).then(n.bind(n,3858)),"@theme/BlogPostPage",3858],cce09ffa:[()=>n.e(5556).then(n.bind(n,1939)),"@site/blog/2023-09-03-av1-for-dummies.mdx?truncated=true",1939],cd6cf5b7:[()=>n.e(5365).then(n.bind(n,9576)),"@site/docs/encoders/SVT-VP9.mdx",9576],ce98a713:[()=>n.e(6168).then(n.bind(n,4705)),"@site/docs/filtering/denoise.mdx",4705],cf7588c6:[()=>n.e(5971).then(n.bind(n,2493)),"@site/docs/encoders/x264.mdx",2493],d1becb09:[()=>n.e(8843).then(n.bind(n,5224)),"@site/docs/privacy-policy.mdx",5224],d337df6f:[()=>n.e(6496).then(n.bind(n,8051)),"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx?truncated=true",8051],d5ab79da:[()=>n.e(8382).then(n.bind(n,2082)),"@site/docs/audio/MP3.mdx",2082],d5f89569:[()=>Promise.all([n.e(1869),n.e(1401)]).then(n.bind(n,7235)),"@site/docs/encoders/Kvazaar.mdx",7235],d6535278:[()=>Promise.all([n.e(1869),n.e(6977)]).then(n.bind(n,9963)),"@site/docs/metrics/VMAF.mdx",9963],d96727fd:[()=>n.e(1500).then(n.bind(n,8566)),"@site/docs/colorimetry/matrix.mdx",8566],ddce1156:[()=>n.e(1408).then(n.bind(n,5856)),"@site/docs/utilities/mp4box.mdx",5856],e157395a:[()=>n.e(7967).then(n.bind(n,8935)),"@site/docs/images/HEIC.mdx",8935],e1a437f7:[()=>n.e(9381).then(n.bind(n,801)),"@site/docs/data/bzip2.mdx",801],e1c48702:[()=>n.e(6377).then(n.bind(n,1356)),"@site/docs/introduction/lossy.mdx",1356],e23fa6d4:[()=>n.e(4704).then(n.t.bind(n,1696,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-image-83d.json",1696],e33da66d:[()=>n.e(2361).then(n.t.bind(n,9109,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-video-28b.json",9109],e3409e91:[()=>n.e(6231).then(n.t.bind(n,210,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-discord-cfa.json",210],e3b00369:[()=>n.e(921).then(n.bind(n,1364)),"@site/docs/utilities/av1an-command-gen.mdx",1364],e641ee58:[()=>n.e(5738).then(n.bind(n,3493)),"@site/docs/audio/Speex.mdx",3493],edaea366:[()=>n.e(7978).then(n.bind(n,4992)),"@site/docs/colorimetry/transfer.mdx",4992],ee513c31:[()=>Promise.all([n.e(1869),n.e(1137)]).then(n.bind(n,7155)),"@site/docs/utilities/dovi_tool.mdx",7155],ee8c27e3:[()=>n.e(9819).then(n.bind(n,3835)),"@site/docs/encoders/uvg266.mdx",3835],f4fea690:[()=>n.e(4924).then(n.bind(n,278)),"@site/docs/encoders/JM.mdx",278],f81c1134:[()=>n.e(8130).then(n.t.bind(n,7735,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",7735],f9208490:[()=>Promise.all([n.e(1869),n.e(3229)]).then(n.bind(n,6450)),"@site/docs/utilities/hdr10plus_tool.mdx",6450],fb02bab9:[()=>n.e(5885).then(n.bind(n,5190)),"@site/docs/filtering/stabilizing.mdx",5190],fda0af90:[()=>n.e(5376).then(n.bind(n,7615)),"@site/docs/colorimetry/primaries.mdx",7615]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(6921),u=n(3102);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],h=(0,c.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const p=[{path:"/blog",component:d("/blog","116"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/av1-encoding-for-dummies",component:d("/blog/av1-encoding-for-dummies","7e6"),exact:!0},{path:"/blog/av1-for-dummies",component:d("/blog/av1-for-dummies","36a"),exact:!0},{path:"/blog/codec-wiki-one-year-later",component:d("/blog/codec-wiki-one-year-later","053"),exact:!0},{path:"/blog/embedding-the-un-embeddable",component:d("/blog/embedding-the-un-embeddable","ddb"),exact:!0},{path:"/blog/site-optimization",component:d("/blog/site-optimization","79f"),exact:!0},{path:"/blog/svt-av1-deep-dive",component:d("/blog/svt-av1-deep-dive","32d"),exact:!0},{path:"/blog/svt-av1-second-deep-dive",component:d("/blog/svt-av1-second-deep-dive","ca6"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/anniversary",component:d("/blog/tags/anniversary","00b"),exact:!0},{path:"/blog/tags/benchmarks",component:d("/blog/tags/benchmarks","ae5"),exact:!0},{path:"/blog/tags/compression",component:d("/blog/tags/compression","5f1"),exact:!0},{path:"/blog/tags/discord",component:d("/blog/tags/discord","2ab"),exact:!0},{path:"/blog/tags/history",component:d("/blog/tags/history","f7a"),exact:!0},{path:"/blog/tags/image",component:d("/blog/tags/image","2b9"),exact:!0},{path:"/blog/tags/video",component:d("/blog/tags/video","d7a"),exact:!0},{path:"/blog/tags/web",component:d("/blog/tags/web","e61"),exact:!0},{path:"/markdown-page",component:d("/markdown-page","53a"),exact:!0},{path:"/search",component:d("/search","822"),exact:!0},{path:"/docs",component:d("/docs","171"),routes:[{path:"/docs",component:d("/docs","fda"),routes:[{path:"/docs",component:d("/docs","2b2"),routes:[{path:"/docs/audio/AAC",component:d("/docs/audio/AAC","cc0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/ALAC",component:d("/docs/audio/ALAC","88f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Dolby",component:d("/docs/audio/Dolby","be7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/FLAC",component:d("/docs/audio/FLAC","68a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/intro",component:d("/docs/audio/intro","c71"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/MP3",component:d("/docs/audio/MP3","8b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Opus",component:d("/docs/audio/Opus","ede"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Speex",component:d("/docs/audio/Speex","efd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Vorbis",component:d("/docs/audio/Vorbis","e65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/WavPack",component:d("/docs/audio/WavPack","faf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/format",component:d("/docs/colorimetry/format","f03"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/intro",component:d("/docs/colorimetry/intro","dc6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/matrix",component:d("/docs/colorimetry/matrix","56d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/primaries",component:d("/docs/colorimetry/primaries","0ce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/range",component:d("/docs/colorimetry/range","be1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/transfer",component:d("/docs/colorimetry/transfer","0ec"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/contribution-guide",component:d("/docs/contribution-guide","a83"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/7z",component:d("/docs/data/7z","663"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/brotli",component:d("/docs/data/brotli","f1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/bzip2",component:d("/docs/data/bzip2","aea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/gzip",component:d("/docs/data/gzip","644"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/tar",component:d("/docs/data/tar","548"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/xz",component:d("/docs/data/xz","a88"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zip",component:d("/docs/data/zip","2e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zpaq",component:d("/docs/data/zpaq","407"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zstd",component:d("/docs/data/zstd","78a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/amf",component:d("/docs/encoders_hw/amf","504"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/mediacodec",component:d("/docs/encoders_hw/mediacodec","e64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/nvenc",component:d("/docs/encoders_hw/nvenc","851"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/qsv",component:d("/docs/encoders_hw/qsv","ce1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/videotoolbox",component:d("/docs/encoders_hw/videotoolbox","426"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/aom-av1-lavish",component:d("/docs/encoders/aom-av1-lavish","14a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/aom-psy101",component:d("/docs/encoders/aom-psy101","274"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/aomenc",component:d("/docs/encoders/aomenc","3c9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Aurora1",component:d("/docs/encoders/Aurora1","96b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/AVM",component:d("/docs/encoders/AVM","1b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/HM",component:d("/docs/encoders/HM","09e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/JM",component:d("/docs/encoders/JM","26a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Kvazaar",component:d("/docs/encoders/Kvazaar","723"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/rav1e",component:d("/docs/encoders/rav1e","8de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-AV1",component:d("/docs/encoders/SVT-AV1","c47"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-AV1-PSY",component:d("/docs/encoders/SVT-AV1-PSY","673"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-HEVC",component:d("/docs/encoders/SVT-HEVC","d5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-VP9",component:d("/docs/encoders/SVT-VP9","952"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/uavs3e",component:d("/docs/encoders/uavs3e","8de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/uvg266",component:d("/docs/encoders/uvg266","d2d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/vpxenc",component:d("/docs/encoders/vpxenc","9fa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VTM",component:d("/docs/encoders/VTM","e57"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VVenC",component:d("/docs/encoders/VVenC","469"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x264",component:d("/docs/encoders/x264","26c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x265",component:d("/docs/encoders/x265","fb3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x266",component:d("/docs/encoders/x266","74f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/FAQ",component:d("/docs/FAQ","5ed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/antialiasing",component:d("/docs/filtering/antialiasing","118"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/basics",component:d("/docs/filtering/basics","c1f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deband",component:d("/docs/filtering/deband","2ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/decombing",component:d("/docs/filtering/decombing","08e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/dehalo",component:d("/docs/filtering/dehalo","c4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deinterlace",component:d("/docs/filtering/deinterlace","62f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/denoise",component:d("/docs/filtering/denoise","129"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/graining",component:d("/docs/filtering/graining","e7d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/ivtc",component:d("/docs/filtering/ivtc","d1b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/stabilizing",component:d("/docs/filtering/stabilizing","d74"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/vapoursynth",component:d("/docs/filtering/vapoursynth","42f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/AVIF",component:d("/docs/images/AVIF","371"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/GIF",component:d("/docs/images/GIF","677"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/HEIC",component:d("/docs/images/HEIC","70b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG",component:d("/docs/images/JPEG","7f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG2000",component:d("/docs/images/JPEG2000","3f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JXL",component:d("/docs/images/JXL","abb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/PNG",component:d("/docs/images/PNG","9b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/QOI",component:d("/docs/images/QOI","c2e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/WebP",component:d("/docs/images/WebP","b27"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/high-dynamic-range",component:d("/docs/introduction/high-dynamic-range","7e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/lossless",component:d("/docs/introduction/lossless","417"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/lossy",component:d("/docs/introduction/lossy","aeb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/prologue",component:d("/docs/introduction/prologue","b4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/psychovisual",component:d("/docs/introduction/psychovisual","539"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/terminology",component:d("/docs/introduction/terminology","041"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/video-artifacts",component:d("/docs/introduction/video-artifacts","0af"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/butteraugli",component:d("/docs/metrics/butteraugli","a60"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/PSNR",component:d("/docs/metrics/PSNR","1e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIM",component:d("/docs/metrics/SSIM","1ea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIMULACRA2",component:d("/docs/metrics/SSIMULACRA2","a14"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/VMAF",component:d("/docs/metrics/VMAF","62e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/XPSNR",component:d("/docs/metrics/XPSNR","646"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/privacy-policy",component:d("/docs/privacy-policy","923"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/resources",component:d("/docs/resources","0e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/SRT",component:d("/docs/subtitles/SRT","af2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/SSA",component:d("/docs/subtitles/SSA","c6a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/webvtt",component:d("/docs/subtitles/webvtt","d8f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/terms-of-use",component:d("/docs/terms-of-use","70c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/autocompressor",component:d("/docs/utilities/autocompressor","43c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/av1an",component:d("/docs/utilities/av1an","53c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/av1an-command-gen",component:d("/docs/utilities/av1an-command-gen","f4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/Aviator",component:d("/docs/utilities/Aviator","b18"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/Discord",component:d("/docs/utilities/Discord","849"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/dovi_tool",component:d("/docs/utilities/dovi_tool","6fd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/eac3to",component:d("/docs/utilities/eac3to","fde"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/FFMetrics",component:d("/docs/utilities/FFMetrics","bb5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/ffmpeg",component:d("/docs/utilities/ffmpeg","07b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/hdr10plus_tool",component:d("/docs/utilities/hdr10plus_tool","d8d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/MKVToolNix",component:d("/docs/utilities/MKVToolNix","2d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/mp4box",component:d("/docs/utilities/mp4box","d04"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/nmkoder",component:d("/docs/utilities/nmkoder","a80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rAV1ator",component:d("/docs/utilities/rAV1ator","88b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rav1ator-cli",component:d("/docs/utilities/rav1ator-cli","930"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/YUView",component:d("/docs/utilities/YUView","017"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video-players",component:d("/docs/video-players","870"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AV1",component:d("/docs/video/AV1","28f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVC",component:d("/docs/video/AVC","e47"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVS3",component:d("/docs/video/AVS3","42e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/ECM",component:d("/docs/video/ECM","568"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/FFV1",component:d("/docs/video/FFV1","ec1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/HEVC",component:d("/docs/video/HEVC","df9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/prores",component:d("/docs/video/prores","770"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/Theora",component:d("/docs/video/Theora","4cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/utvideo",component:d("/docs/video/utvideo","9f1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VC-1",component:d("/docs/video/VC-1","d82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP8",component:d("/docs/video/VP8","88c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP9",component:d("/docs/video/VP9","dc7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VVC",component:d("/docs/video/VVC","1f7"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7815:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),s=n(4784),l=n(8193);const c=[n(119),n(6134),n(6294),n(1043),n(8015)];var u=n(8328),d=n(6347),p=n(2831),f=n(4848);function h(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(5260),g=n(4586),b=n(6025),y=n(6342),v=n(1213),x=n(2131),w=n(4090);const S="default";var k=n(440),_=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,x.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,k.Ks)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function A(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,y.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:w.w})]}),n&&(0,f.jsx)(v.be,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(E,{}),(0,f.jsx)(_.A,{tag:S,locale:e}),(0,f.jsx)(m.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const T=new Map;var P=n(6125),L=n(6988),O=n(205);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const j=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,O.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),N("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(j,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const F=I,M="__docusaurus-base-url-issue-banner-container",z="__docusaurus-base-url-issue-banner",D="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(F,{location:e,children:G})}function Y(){return(0,f.jsx)(H.A,{children:(0,f.jsx)(L.l,{children:(0,f.jsxs)(P.x,{children:[(0,f.jsxs)(h,{children:[(0,f.jsx)(U,{}),(0,f.jsx)(A,{}),(0,f.jsx)(V,{}),(0,f.jsx)(q,{})]}),(0,f.jsx)(W,{})]})})})}var K=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),R(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const ae=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(Y,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};R(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"introduction/prologue","docs":[{"id":"audio/AAC","path":"/docs/audio/AAC","sidebar":"tutorialSidebar"},{"id":"audio/ALAC","path":"/docs/audio/ALAC","sidebar":"tutorialSidebar"},{"id":"audio/Dolby","path":"/docs/audio/Dolby","sidebar":"tutorialSidebar"},{"id":"audio/FLAC","path":"/docs/audio/FLAC","sidebar":"tutorialSidebar"},{"id":"audio/intro","path":"/docs/audio/intro","sidebar":"tutorialSidebar"},{"id":"audio/MP3","path":"/docs/audio/MP3","sidebar":"tutorialSidebar"},{"id":"audio/Opus","path":"/docs/audio/Opus","sidebar":"tutorialSidebar"},{"id":"audio/Speex","path":"/docs/audio/Speex","sidebar":"tutorialSidebar"},{"id":"audio/Vorbis","path":"/docs/audio/Vorbis","sidebar":"tutorialSidebar"},{"id":"audio/WavPack","path":"/docs/audio/WavPack","sidebar":"tutorialSidebar"},{"id":"colorimetry/format","path":"/docs/colorimetry/format","sidebar":"tutorialSidebar"},{"id":"colorimetry/intro","path":"/docs/colorimetry/intro","sidebar":"tutorialSidebar"},{"id":"colorimetry/matrix","path":"/docs/colorimetry/matrix","sidebar":"tutorialSidebar"},{"id":"colorimetry/primaries","path":"/docs/colorimetry/primaries","sidebar":"tutorialSidebar"},{"id":"colorimetry/range","path":"/docs/colorimetry/range","sidebar":"tutorialSidebar"},{"id":"colorimetry/transfer","path":"/docs/colorimetry/transfer","sidebar":"tutorialSidebar"},{"id":"contribution-guide","path":"/docs/contribution-guide","sidebar":"tutorialSidebar"},{"id":"data/7z","path":"/docs/data/7z","sidebar":"tutorialSidebar"},{"id":"data/brotli","path":"/docs/data/brotli","sidebar":"tutorialSidebar"},{"id":"data/bzip2","path":"/docs/data/bzip2","sidebar":"tutorialSidebar"},{"id":"data/gzip","path":"/docs/data/gzip","sidebar":"tutorialSidebar"},{"id":"data/tar","path":"/docs/data/tar","sidebar":"tutorialSidebar"},{"id":"data/xz","path":"/docs/data/xz","sidebar":"tutorialSidebar"},{"id":"data/zip","path":"/docs/data/zip","sidebar":"tutorialSidebar"},{"id":"data/zpaq","path":"/docs/data/zpaq","sidebar":"tutorialSidebar"},{"id":"data/zstd","path":"/docs/data/zstd","sidebar":"tutorialSidebar"},{"id":"encoders_hw/amf","path":"/docs/encoders_hw/amf","sidebar":"tutorialSidebar"},{"id":"encoders_hw/mediacodec","path":"/docs/encoders_hw/mediacodec","sidebar":"tutorialSidebar"},{"id":"encoders_hw/nvenc","path":"/docs/encoders_hw/nvenc","sidebar":"tutorialSidebar"},{"id":"encoders_hw/qsv","path":"/docs/encoders_hw/qsv","sidebar":"tutorialSidebar"},{"id":"encoders_hw/videotoolbox","path":"/docs/encoders_hw/videotoolbox","sidebar":"tutorialSidebar"},{"id":"encoders/aom-av1-lavish","path":"/docs/encoders/aom-av1-lavish","sidebar":"tutorialSidebar"},{"id":"encoders/aom-psy101","path":"/docs/encoders/aom-psy101","sidebar":"tutorialSidebar"},{"id":"encoders/aomenc","path":"/docs/encoders/aomenc","sidebar":"tutorialSidebar"},{"id":"encoders/Aurora1","path":"/docs/encoders/Aurora1","sidebar":"tutorialSidebar"},{"id":"encoders/AVM","path":"/docs/encoders/AVM","sidebar":"tutorialSidebar"},{"id":"encoders/HM","path":"/docs/encoders/HM","sidebar":"tutorialSidebar"},{"id":"encoders/JM","path":"/docs/encoders/JM","sidebar":"tutorialSidebar"},{"id":"encoders/Kvazaar","path":"/docs/encoders/Kvazaar","sidebar":"tutorialSidebar"},{"id":"encoders/rav1e","path":"/docs/encoders/rav1e","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-AV1","path":"/docs/encoders/SVT-AV1","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-AV1-PSY","path":"/docs/encoders/SVT-AV1-PSY","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-HEVC","path":"/docs/encoders/SVT-HEVC","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-VP9","path":"/docs/encoders/SVT-VP9","sidebar":"tutorialSidebar"},{"id":"encoders/uavs3e","path":"/docs/encoders/uavs3e","sidebar":"tutorialSidebar"},{"id":"encoders/uvg266","path":"/docs/encoders/uvg266","sidebar":"tutorialSidebar"},{"id":"encoders/vpxenc","path":"/docs/encoders/vpxenc","sidebar":"tutorialSidebar"},{"id":"encoders/VTM","path":"/docs/encoders/VTM","sidebar":"tutorialSidebar"},{"id":"encoders/VVenC","path":"/docs/encoders/VVenC","sidebar":"tutorialSidebar"},{"id":"encoders/x264","path":"/docs/encoders/x264","sidebar":"tutorialSidebar"},{"id":"encoders/x265","path":"/docs/encoders/x265","sidebar":"tutorialSidebar"},{"id":"encoders/x266","path":"/docs/encoders/x266","sidebar":"tutorialSidebar"},{"id":"FAQ","path":"/docs/FAQ","sidebar":"tutorialSidebar"},{"id":"filtering/antialiasing","path":"/docs/filtering/antialiasing","sidebar":"tutorialSidebar"},{"id":"filtering/basics","path":"/docs/filtering/basics","sidebar":"tutorialSidebar"},{"id":"filtering/deband","path":"/docs/filtering/deband","sidebar":"tutorialSidebar"},{"id":"filtering/decombing","path":"/docs/filtering/decombing","sidebar":"tutorialSidebar"},{"id":"filtering/dehalo","path":"/docs/filtering/dehalo","sidebar":"tutorialSidebar"},{"id":"filtering/deinterlace","path":"/docs/filtering/deinterlace","sidebar":"tutorialSidebar"},{"id":"filtering/denoise","path":"/docs/filtering/denoise","sidebar":"tutorialSidebar"},{"id":"filtering/graining","path":"/docs/filtering/graining","sidebar":"tutorialSidebar"},{"id":"filtering/ivtc","path":"/docs/filtering/ivtc","sidebar":"tutorialSidebar"},{"id":"filtering/stabilizing","path":"/docs/filtering/stabilizing","sidebar":"tutorialSidebar"},{"id":"filtering/vapoursynth","path":"/docs/filtering/vapoursynth","sidebar":"tutorialSidebar"},{"id":"images/AVIF","path":"/docs/images/AVIF","sidebar":"tutorialSidebar"},{"id":"images/GIF","path":"/docs/images/GIF","sidebar":"tutorialSidebar"},{"id":"images/HEIC","path":"/docs/images/HEIC","sidebar":"tutorialSidebar"},{"id":"images/JPEG","path":"/docs/images/JPEG","sidebar":"tutorialSidebar"},{"id":"images/JPEG2000","path":"/docs/images/JPEG2000","sidebar":"tutorialSidebar"},{"id":"images/JXL","path":"/docs/images/JXL","sidebar":"tutorialSidebar"},{"id":"images/PNG","path":"/docs/images/PNG","sidebar":"tutorialSidebar"},{"id":"images/QOI","path":"/docs/images/QOI","sidebar":"tutorialSidebar"},{"id":"images/WebP","path":"/docs/images/WebP","sidebar":"tutorialSidebar"},{"id":"introduction/high-dynamic-range","path":"/docs/introduction/high-dynamic-range","sidebar":"tutorialSidebar"},{"id":"introduction/lossless","path":"/docs/introduction/lossless","sidebar":"tutorialSidebar"},{"id":"introduction/lossy","path":"/docs/introduction/lossy","sidebar":"tutorialSidebar"},{"id":"introduction/prologue","path":"/docs/introduction/prologue","sidebar":"tutorialSidebar"},{"id":"introduction/psychovisual","path":"/docs/introduction/psychovisual","sidebar":"tutorialSidebar"},{"id":"introduction/terminology","path":"/docs/introduction/terminology","sidebar":"tutorialSidebar"},{"id":"introduction/video-artifacts","path":"/docs/introduction/video-artifacts","sidebar":"tutorialSidebar"},{"id":"metrics/butteraugli","path":"/docs/metrics/butteraugli","sidebar":"tutorialSidebar"},{"id":"metrics/PSNR","path":"/docs/metrics/PSNR","sidebar":"tutorialSidebar"},{"id":"metrics/SSIM","path":"/docs/metrics/SSIM","sidebar":"tutorialSidebar"},{"id":"metrics/SSIMULACRA2","path":"/docs/metrics/SSIMULACRA2","sidebar":"tutorialSidebar"},{"id":"metrics/VMAF","path":"/docs/metrics/VMAF","sidebar":"tutorialSidebar"},{"id":"metrics/XPSNR","path":"/docs/metrics/XPSNR","sidebar":"tutorialSidebar"},{"id":"privacy-policy","path":"/docs/privacy-policy","sidebar":"tutorialSidebar"},{"id":"resources","path":"/docs/resources","sidebar":"tutorialSidebar"},{"id":"subtitles/SRT","path":"/docs/subtitles/SRT","sidebar":"tutorialSidebar"},{"id":"subtitles/SSA","path":"/docs/subtitles/SSA","sidebar":"tutorialSidebar"},{"id":"subtitles/webvtt","path":"/docs/subtitles/webvtt","sidebar":"tutorialSidebar"},{"id":"terms-of-use","path":"/docs/terms-of-use","sidebar":"tutorialSidebar"},{"id":"utilities/autocompressor","path":"/docs/utilities/autocompressor","sidebar":"tutorialSidebar"},{"id":"utilities/av1an","path":"/docs/utilities/av1an","sidebar":"tutorialSidebar"},{"id":"utilities/av1an-command-gen","path":"/docs/utilities/av1an-command-gen","sidebar":"tutorialSidebar"},{"id":"utilities/Aviator","path":"/docs/utilities/Aviator","sidebar":"tutorialSidebar"},{"id":"utilities/Discord","path":"/docs/utilities/Discord","sidebar":"tutorialSidebar"},{"id":"utilities/dovi_tool","path":"/docs/utilities/dovi_tool","sidebar":"tutorialSidebar"},{"id":"utilities/eac3to","path":"/docs/utilities/eac3to","sidebar":"tutorialSidebar"},{"id":"utilities/FFMetrics","path":"/docs/utilities/FFMetrics","sidebar":"tutorialSidebar"},{"id":"utilities/ffmpeg","path":"/docs/utilities/ffmpeg","sidebar":"tutorialSidebar"},{"id":"utilities/hdr10plus_tool","path":"/docs/utilities/hdr10plus_tool","sidebar":"tutorialSidebar"},{"id":"utilities/MKVToolNix","path":"/docs/utilities/MKVToolNix","sidebar":"tutorialSidebar"},{"id":"utilities/mp4box","path":"/docs/utilities/mp4box","sidebar":"tutorialSidebar"},{"id":"utilities/nmkoder","path":"/docs/utilities/nmkoder","sidebar":"tutorialSidebar"},{"id":"utilities/rAV1ator","path":"/docs/utilities/rAV1ator","sidebar":"tutorialSidebar"},{"id":"utilities/rav1ator-cli","path":"/docs/utilities/rav1ator-cli","sidebar":"tutorialSidebar"},{"id":"utilities/YUView","path":"/docs/utilities/YUView","sidebar":"tutorialSidebar"},{"id":"video-players","path":"/docs/video-players","sidebar":"tutorialSidebar"},{"id":"video/AV1","path":"/docs/video/AV1","sidebar":"tutorialSidebar"},{"id":"video/AVC","path":"/docs/video/AVC","sidebar":"tutorialSidebar"},{"id":"video/AVS3","path":"/docs/video/AVS3","sidebar":"tutorialSidebar"},{"id":"video/ECM","path":"/docs/video/ECM","sidebar":"tutorialSidebar"},{"id":"video/FFV1","path":"/docs/video/FFV1","sidebar":"tutorialSidebar"},{"id":"video/HEVC","path":"/docs/video/HEVC","sidebar":"tutorialSidebar"},{"id":"video/prores","path":"/docs/video/prores","sidebar":"tutorialSidebar"},{"id":"video/Theora","path":"/docs/video/Theora","sidebar":"tutorialSidebar"},{"id":"video/utvideo","path":"/docs/video/utvideo","sidebar":"tutorialSidebar"},{"id":"video/VC-1","path":"/docs/video/VC-1","sidebar":"tutorialSidebar"},{"id":"video/VP8","path":"/docs/video/VP8","sidebar":"tutorialSidebar"},{"id":"video/VP9","path":"/docs/video/VP9","sidebar":"tutorialSidebar"},{"id":"video/VVC","path":"/docs/video/VVC","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/introduction/prologue","label":"introduction/prologue"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.1.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"},"docusaurus-plugin-image-zoom":{"type":"package","name":"plugin-image-zoom","version":"1.2.0"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.40.1"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(6540),o=n(8193),a=n(5260),i=n(440),s=n(263),l=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const h=e=>(0,c.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??h)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),o=n(4625),a=n(440),i=n(4586),s=n(6654),l=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:m,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:x,baseUrl:w}=v,S=v.future.experimental_router,{withBaseUrl:k}=(0,u.hH)(),_=(0,c.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const C=p||f;const A=(0,s.A)(C),T=C?.replace("pathname://","");let P=void 0!==T?(L=T,b&&(e=>e.startsWith("/"))(L)?k(L):L):void 0;var L;"hash"===S&&P?.startsWith("./")&&(P=P?.slice(1)),P&&A&&(P=(0,a.Ks)(P,{trailingSlash:x,baseUrl:w}));const O=(0,r.useRef)(!1),N=n?o.k2:o.N_,j=l.A.canUseIntersectionObserver,R=(0,r.useRef)(),I=()=>{O.current||null==P||(window.docusaurus.preload(P),O.current=!0)};(0,r.useEffect)((()=>(!j&&A&&l.A.canUseDOM&&null!=P&&window.docusaurus.prefetch(P),()=>{j&&R.current&&R.current.disconnect()})),[R,P,j,A]);const F=P?.startsWith("#")??!1,M=!y.target||"_self"===y.target,z=!P||!A||!M||F&&"hash"!==S;g||!F&&z||_.collectLink(P),y.id&&_.collectAnchor(y.id);const D={};return z?(0,d.jsx)("a",{ref:E,href:P,...C&&!A&&{target:"_blank",rel:"noopener noreferrer"},...y,...D}):(0,d.jsx)(N,{...y,onMouseEnter:I,onTouchStart:I,innerRef:e=>{E.current=e,j&&e&&A&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=P&&window.docusaurus.prefetch(P))}))})),R.current.observe(e))},to:P,...n&&{isActive:m,activeClassName:h},...D})}const f=r.forwardRef(p)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6988);function a(){return(0,r.useContext)(o.o)}},6588:(e,t,n)=>{"use strict";n.d(t,{P_:()=>i,kh:()=>a});var r=n(4586),o=n(7065);function a(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=a(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6125);function a(){return(0,r.useContext)(o.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6803:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(3102);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},3886:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,XK:()=>v,g1:()=>y});var r=n(6540),o=n(8295),a=n(7065),i=n(6342),s=n(679),l=n(9532),c=n(4848);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.Wf)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function h(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=h();return(0,c.jsx)(f.Provider,{value:n,children:t})}function g(e){let{children:t}=e;return(0,c.jsx)(m,{children:t})}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function v(){const e=(0,o.Gy)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},2565:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>i});var r=n(8295),o=n(3886);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,o.XK)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],s=e[r].versions.find((e=>e.isLast));return a(r,(o??i??s).name)}))]}},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},6972:(e,t,n)=>{"use strict";n.d(t,{$S:()=>f,B5:()=>_,Nr:()=>p,OF:()=>x,QB:()=>k,Vd:()=>w,Y:()=>y,d1:()=>E,fW:()=>S,w8:()=>g});var r=n(6540),o=n(6347),a=n(2831),i=n(8295),s=n(9169),l=n(1682),c=n(3886),u=n(3025),d=n(609);function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}function f(){const{pathname:e}=(0,o.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,s.ys)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||m(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,s.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,s.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,l.sb)([t,n,o].filter(Boolean))),[t,n,o])}function S(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,u.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,a.v)(i),sidebarName:l,sidebarItems:c}}function E(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!p(e)))}},3025:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},8295:(e,t,n)=>{"use strict";n.d(t,{d1:()=>l.d1,zK:()=>y,vT:()=>h,gk:()=>m,Gy:()=>p,$S:()=>l.$S,HW:()=>v,vF:()=>u.v,ht:()=>f,g1:()=>c.g1,r7:()=>b,jh:()=>g});var r=n(6347),o=n(6588);const a=e=>e.versions.find((e=>e.isLast));function i(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function s(e,t){const n=i(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}var l=n(6972),c=n(3886),u=n(2565);const d={},p=()=>(0,o.kh)("docusaurus-plugin-content-docs")??d,f=e=>{try{return(0,o.P_)("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function h(e){void 0===e&&(e={});const t=p(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=h(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:i(t.pluginData,n)}}function g(e){return f(e).versions}function b(e){const t=f(e);return a(t)}function y(e){const t=f(e),{pathname:n}=(0,r.zy)();return s(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=a(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1765),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(875)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),o=n(1312),a=n(6342),i=n(8774),s=n(3427);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:p}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},263:(e,t,n)=>{"use strict";n.d(t,{A:()=>Dt});var r=n(6540),o=n(4164),a=n(7489),i=n(1213),s=n(6347),l=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??h,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),b=n(4090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var x=n(6342),w=n(5041);function S(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const k={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",k.closeButton,e.className),children:(0,u.jsx)(S,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,x.p)(),{isActive:t,close:n}=(0,w.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(C,{className:A.announcementBarContent}),a&&(0,u.jsx)(_,{onClick:n,className:A.announcementBarClose})]})}var P=n(2069),L=n(3104);var O=n(9532),N=n(5600);const j=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,P.M)(),t=(0,N.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,O.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(j.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function F(){const e=(0,r.useContext)(j);if(!e)throw new O.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:I(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=F();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var z=n(5293),D=n(2303);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const V={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function U(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,D.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(V.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",V.toggleButton,!i&&V.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.A)(V.toggleIcon,V.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(V.toggleIcon,V.darkToggleIcon)})]})})}const H=r.memo(U),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,x.p)().navbar.style,r=(0,x.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,z.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var G=n(3465);function q(){return(0,u.jsx)(G.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,P.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(S,{color:"var(--ifm-color-emphasis-600)"})})}function K(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(q,{}),(0,u.jsx)(W,{className:"margin-right--md"}),(0,u.jsx)(Y,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),h=a&&o&&!(0,J.A)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,h&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?f:o,...c,...m}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),se=n(9169),le=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ze,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ze,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var he=n(2131);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_nlXk";var be=n(1088),ye=n(5391);var ve=n(6588);const xe={},we=()=>(0,ve.kh)("docusaurus-plugin-content-docs")??xe;function Se(e){void 0===e&&(e={});const t=we(),{pathname:n}=(0,s.zy)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,s.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}var ke=n(5891),_e=n(2384),Ee=n(4471),Ce=n(7674),Ae=n(6841),Te=n(3810);const Pe='',Le='',Oe='',Ne='',je='',Re='',Ie='',Fe={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Me(e){let{document:t,type:n,page:r,metadata:o,tokens:a,isInterOfTree:i,isLastOfTree:s}=e;const l=0===n,c=1===n,u=[];i?u.push(Re):s&&u.push(Ie);const d=u.map((e=>`${e}`)),p=`${l?Pe:c?Le:Oe}`,f=[`${(0,Te.C)(t.t,(0,Ce.g)(o,"t"),a)}`];if(!i&&!s&&be.tb){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;f.push(`${(0,Ee.$)(e??[])}`)}else l||f.push(`${(0,Ae.Z)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),a)}`);const h=`${Ne}`;return[...d,p,``,...f,"",h].join("")}function ze(){return`${je}${(0,l.T)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var De=n(2849),Be=n(3385);async function $e(){const e=await Promise.all([n.e(489),n.e(5741)]).then(n.t.bind(n,489,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const Ve="_highlight";const Ue=function(e){let{handleSearchBarToggle:t}=e;const o=(0,D.A)(),{siteConfig:{baseUrl:a},i18n:{currentLocale:i}}=(0,le.A)(),c=Se();let d=a;try{const{preferredVersion:e}=function(){return n(8295).g1(...arguments)}(c?.pluginId??be.UB);e&&!e.isLast&&(d=e.path+"/")}catch(z){if(be.I$&&!(z instanceof O.dV))throw z}const p=(0,s.W6)(),f=(0,s.zy)(),h=(0,r.useRef)(null),m=(0,r.useRef)(new Map),g=(0,r.useRef)(!1),[b,y]=(0,r.useState)(!1),[v,x]=(0,r.useState)(!1),[w,S]=(0,r.useState)(""),k=(0,r.useRef)(null),_=(0,r.useRef)(""),[E,C]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(be.Hg))return;let e="";if(f.pathname.startsWith(d)){const t=f.pathname.substring(d.length);let n;for(const e of be.Hg){const r="string"==typeof e?e:e.path;if(t===r||t.startsWith(`${r}/`)){n=r;break}}n&&(e=n)}_.current!==e&&(m.current.delete(e),_.current=e),C(e)}),[f.pathname,d]);const A=!!be.O6&&Array.isArray(be.Hg)&&""===E,T=(0,r.useCallback)((async()=>{if(A||m.current.get(E))return;m.current.set(E,"loading"),k.current?.autocomplete.destroy(),y(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,ke.Z)(d,E),$e()]);if(k.current=n(h.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,ye.A)(Fe.searchBar,{[Fe.searchBarLeft]:"left"===be.ZG}),noPrefix:!0,dropdownMenu:Fe.dropdownMenu,input:Fe.input,hint:Fe.hint,suggestions:Fe.suggestions,suggestion:Fe.suggestion,cursor:Fe.cursor,dataset:Fe.dataset,empty:Fe.empty}},[{source:(0,_e.m)(e,t,be.AT),templates:{suggestion:Me,empty:ze,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&(!E||!be.dz))return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),o=new URLSearchParams;let s;if(o.set("q",t),E){const e=E&&Array.isArray(be.Hg)?be.Hg.find((e=>"string"==typeof e?e===E:e.path===E)):E,t=e?(0,Be.p)(e,i).label:E;s=be.dz&&n?(0,l.T)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:t}):(0,l.T)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:t})}else s=(0,l.T)({id:"theme.SearchBar.seeAll",message:"See all results"});if(!E||!Array.isArray(be.Hg)||be.dz&&n||o.set("ctx",E),d!==a){if(!d.startsWith(a))throw new Error(`Version url '${d}' does not start with base url '${a}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);o.set("version",d.substring(a.length))}const c=`${a}search?${o.toString()}`;return r.href=c,r.textContent=s,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),k.current?.autocomplete.close(),p.push(c))})),r})({query:t,isEmpty:n}),o=document.createElement("div");return o.className=Fe.hitFooter,o.appendChild(r),o}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:o}=t;h.current?.blur();let a=n;if(be.CU&&o.length>0){const e=new URLSearchParams;for(const t of o)e.append(Ve,t);a+=`?${e.toString()}`}r&&(a+=r),p.push(a)})).on("autocomplete:closed",(()=>{h.current?.blur()})),m.current.set(E,"done"),y(!1),g.current){const e=h.current;e.value&&k.current?.autocomplete.open(),e.focus()}}),[A,E,d,a,p]);(0,r.useEffect)((()=>{if(!be.CU)return;const e=o?new URLSearchParams(f.search).getAll(Ve):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new be.CU(t);n.unmark(),0!==e.length&&n.mark(e),S(e.join(" ")),k.current?.autocomplete.setVal(e.join(" "))}))}),[o,f.search,f.pathname]);const[P,L]=(0,r.useState)(!1),N=(0,r.useCallback)((()=>{g.current=!0,T(),L(!0),t?.(!0)}),[t,T]),j=(0,r.useCallback)((()=>{L(!1),t?.(!1)}),[t]),R=(0,r.useCallback)((()=>{T()}),[T]),I=(0,r.useCallback)((e=>{S(e.target.value),e.target.value&&x(!0)}),[]),F=!!o&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!be.WW)return;const e=e=>{!(F?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),h.current?.focus(),N())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[F,N]);const M=(0,r.useCallback)((()=>{const e=new URLSearchParams(f.search);e.delete(Ve);const t=e.toString(),n=f.pathname+(""!=t?`?${t}`:"")+f.hash;n!=f.pathname+f.search+f.hash&&p.push(n),S(""),k.current?.autocomplete.setVal("")}),[f.pathname,f.search,f.hash,p]);return(0,u.jsxs)("div",{className:(0,ye.A)("navbar__search",Fe.searchBarContainer,{[Fe.searchIndexLoading]:b&&v,[Fe.focused]:P}),hidden:A,children:[(0,u.jsx)("input",{placeholder:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:R,onFocus:N,onBlur:j,onChange:I,ref:h,value:w}),(0,u.jsx)(De.A,{className:Fe.searchBarLoadingRing}),be.WW&&be.pk&&(""!==w?(0,u.jsx)("button",{className:Fe.searchClearButton,onClick:M,children:"\u2715"}):o&&(0,u.jsxs)("div",{className:Fe.searchHintContainer,children:[(0,u.jsx)("kbd",{className:Fe.searchHint,children:F?"\u2318":"ctrl"}),(0,u.jsx)("kbd",{className:Fe.searchHint,children:"K"})]}))]})},He={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Qe(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,He.navbarSearchContainer),children:t})}var We=n(8295),Ge=n(6972);var qe=n(3886);function Ye(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const Ke={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),p=(0,he.o)(),{search:f,hash:h}=(0,s.zy)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:ge}),g]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Qe,{className:n,children:(0,u.jsx)(Ue,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,We.zK)(r),i=(0,Ge.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,We.zK)(r),i=(0,Ge.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,Ge.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),p=(0,We.zK)(n),f=(0,We.jh)(n),{savePreferredVersionName:h}=(0,qe.g1)(n),m=[...o,...f.map((function(e){const t=Ye(e,p);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...a],g=(0,Ge.Vd)(n)[0],b=t&&m.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,y=t&&m.length>1?void 0:Ye(g,p).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}};function Ze(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ke[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Xe(){const e=(0,P.M)(),t=(0,x.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ze,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Je(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function et(){const e=0===(0,x.p)().navbar.items.length,t=F();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Je,{onClick:()=>t.hide()}),t.content]})}function tt(){const e=(0,P.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(K,{}),primaryMenu:(0,u.jsx)(Xe,{}),secondaryMenu:(0,u.jsx)(et,{})}):null}const nt={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function rt(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function ot(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.p)(),i=(0,P.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,L.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[nt.navbarHideable,!d&&nt.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(rt,{onClick:i.toggle}),(0,u.jsx)(tt,{})]})}var at=n(440);const it={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function st(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function lt(e){let{error:t}=e;const n=(0,at.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:it.errorBoundaryError,children:n})}class ct extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const ut="right";function dt(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function pt(){const{toggle:e,shown:t}=(0,P.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(dt,{})})}const ft={colorModeToggle:"colorModeToggle_DEke"};function ht(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(ct,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Ze,{...e})},t)))})}function mt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function gt(){const e=(0,P.M)(),t=(0,x.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??ut)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(mt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(pt,{}),(0,u.jsx)(q,{}),(0,u.jsx)(ht,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ht,{items:r}),(0,u.jsx)(W,{className:ft.colorModeToggle}),!o&&(0,u.jsx)(Qe,{children:(0,u.jsx)(Ue,{})})]})})}function bt(){return(0,u.jsx)(ot,{children:(0,u.jsx)(gt,{})})}function yt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.Ay)(n),l=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function vt(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(yt,{item:t})},t.href??t.to)}function xt(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(vt,{item:e},t)))})]})}function wt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(xt,{column:e},t)))})}function St(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function kt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(yt,{item:t})}function _t(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(kt,{item:e}),t.length!==n+1&&(0,u.jsx)(St,{})]},n)))})})}function Et(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(wt,{columns:t}):(0,u.jsx)(_t,{links:t})}var Ct=n(1122);const At={footerLogoLink:"footerLogoLink_BH7S"};function Tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(Ct.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function Pt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:At.footerLogoLink,target:t.target,children:(0,u.jsx)(Tt,{logo:t})}):(0,u.jsx)(Tt,{logo:t})}function Lt(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ot(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function Nt(){const{footer:e}=(0,x.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(Ot,{style:o,links:n&&n.length>0&&(0,u.jsx)(Et,{links:n}),logo:r&&(0,u.jsx)(Pt,{logo:r}),copyright:t&&(0,u.jsx)(Lt,{copyright:t})})}const jt=r.memo(Nt),Rt=(0,O.fM)([z.a,w.o,L.Tv,qe.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(N.y_,{children:(0,u.jsx)(P.e,{children:(0,u.jsx)(R,{children:t})})})}]);function It(e){let{children:t}=e;return(0,u.jsx)(Rt,{children:t})}var Ft=n(1107);function Mt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(Ft.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(st,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(lt,{error:t})})]})})})}const zt={mainWrapper:"mainWrapper_z2l0"};function Dt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.J)(),(0,u.jsxs)(It,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(T,{}),(0,u.jsx)(bt,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,zt.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Mt,{...e}),children:t})}),!n&&(0,u.jsx)(jt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),o=n(6025),a=n(4586),i=n(6342),s=n(1122),l=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.Ay)(s?.href||"/"),h=n?"":t,m=s?.alt??h;return(0,l.jsxs)(r.A,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(5260),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(4164),a=n(2303),i=n(5293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),o=n(8193),a=n(205),i=n(3109),s=n(4848);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function h(e){if(!o.A.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:h(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(m,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:m;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,o:()=>h});var r=n(6540),o=n(2303),a=n(679),i=n(9532),s=n(6342),l=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function h(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>g});var r=n(6540),o=n(8193),a=n(9532),i=n(679),s=n(6342),l=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,h=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(h(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(6540),o=n(5600),a=n(4581),i=n(7485),s=n(6342),l=n(9532),c=n(4848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,aZ:()=>l});var r=n(6540),o=n(6347),a=n(9532);function i(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function l(e){return s((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},1682:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}function a(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{$z:()=>a,XI:()=>r,sb:()=>o})},1213:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>u,Jx:()=>f});var r=n(6540),o=n(4164),a=n(5260),i=n(6803),s=n(6025),l=n(4586);var c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,l.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.hH)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,o.A)(i,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:s})}),n]})}function f(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(6540),o=n(205),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(6540),o=n(8328),a=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>u,a_:()=>h,gk:()=>m});var r=n(6540),o=n(8193),a=n(2303),i=n(205),s=n(9532),l=n(4848);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.dV("ScrollControllerProvider");return e}const p=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),a=(0,s._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function h(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.A)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function m(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u,Dv:()=>d});var r=n(6540);const o=JSON.parse('{"N":"localStorage","M":""}'),a=o.N;function i(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function s(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=s(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),o=n(6347),a=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.Ks)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(9532);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(4586);function o(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(2566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},440:(e,t,n)=>{"use strict";t.rA=t.Ks=t.LU=void 0;const r=n(1635);t.LU="__blog-post-container";var o=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},2849:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});n(6540);var r=n(5391);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var a=n(4848);function i(e){let{className:t}=e;return(0,a.jsxs)("div",{className:(0,r.A)(o.loadingRing,t),children:[(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{})]})}},5891:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(8291),o=n.n(r),a=n(1088);const i=new Map;function s(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${a.IH.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:o().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},2384:(e,t,n)=>{"use strict";n.d(t,{m:()=>l});var r=n(8291),o=n.n(r);var a=n(1088);function i(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:o().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?o().Query.wildcard.TRAILING:o().Query.wildcard.NONE})))})))}function l(e,t,n){return function(r,s){const l=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return o()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,a.BH);if(0===l.length)return void s([]);const c=function(e,t){const n=function(e,t){const n=[];return function e(r,o){if(0===r.length)return void n.push(o);const a=r[0];if(/\p{Unified_Ideograph}/u.test(a)){const n=function(e,t){const n=[];return function e(r,o){let a=0,i=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:o.missed,term:o.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),i=!0}else for(let t=s.length-1;t>a;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){a=t;const s={missed:o.missed,term:o.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:o.missed+1,term:o.term}):o.term.length>0&&n.push(o))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(a,t);for(const t of n){const n=o.concat(...t);e(r.slice(1),n)}}else{const t=o.concat({value:a});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:o().Query.presence.REQUIRED,wildcard:o().Query.wildcard.LEADING|o().Query.wildcard.TRAILING})))}];for(const o of n)o[o.length-1].maybeTyping=!0;const r=[];for(const i of a.BH)if("en"===i)a.sx||r.unshift(o().stopWordFilter);else{const e=o()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const o of s)if(o.length>2)for(let e=o.length-1;e>=0;e-=1)l.push(o.slice(0,e).concat(o.slice(e+1)));return i(n).concat(i(l))}(l,t),u=[];e:for(const{term:t,tokens:o}of c)for(const{documents:r,index:a,type:i}of e)if(u.push(...a.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!u.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-u.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:o,score:t.score}}))),u.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,o=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===o&&(o=n.index),r===o?0===t.type?-1:0===n.type?1:t.index-n.index:r-o}))}(u),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{$:()=>r})},3103:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{Z:()=>r})},7674:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{g:()=>r})},6841:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(3103);function o(e,t,n){const a=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&a.push(o(e.substr(0,n),t)),a.push(`${(0,r.Z)(e.substr(n,i.length))}`);const s=n+i.length;s${(0,r.Z)(e)}`:(0,r.Z)(e):a.join("")}},3810:(e,t,n)=>{"use strict";n.d(t,{C:()=>l});var r=n(3103),o=n(6841);const a=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const o=r.match(a);if(!o){t.push(r);break}o.index>0&&t.push(r.substring(0,o.index)),t.push(o[0]),n+=o.index+o[0].length,r=e.substring(n)}return t}var s=n(1088);function l(e,t,n,a){void 0===a&&(a=s.rG);const{chunkIndex:l,chunks:c}=function(e,t,n){const a=[];let s=0,l=0,c=-1;for(;sl){const t=i(e.substring(l,u)).map((e=>({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)a.push(e)}-1===c&&(c=a.length),l=u+d,a.push({html:(0,o.Z)(e.substring(u,l),n,!0),textLength:d})}}if(l({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)a.push(e)}return{chunkIndex:c,chunks:a}}(e,t,n),u=c.slice(0,l),d=c[l],p=[d.html],f=c.slice(l+1);let h=d.textLength,m=0,g=0,b=!1,y=!1;for(;h0){const e=u.pop();h+e.textLength<=a?(p.unshift(e.html),m+=e.textLength,h+=e.textLength):(b=!0,u.length=0)}else{if(!(f.length>0))break;{const e=f.shift();h+e.textLength<=a?(p.push(e.html),g+=e.textLength,h+=e.textLength):(y=!0,f.length=0)}}return(b||u.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},3385:(e,t,n)=>{"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{const{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{p:()=>r})},1088:(e,t,n)=>{"use strict";n.d(t,{CU:()=>a,UB:()=>f,tb:()=>c,O6:()=>g,I$:()=>h,BH:()=>r,sx:()=>o,ZG:()=>p,WW:()=>u,pk:()=>d,Hg:()=>m,IH:()=>i,rG:()=>l,AT:()=>s,dz:()=>b});n(8291);const r=["en"],o=!1,a=null,i="search-index{dir}.json",s=8,l=50,c=!1,u=!0,d=!0,p="right",f=void 0,h=!0,m=null,g=!1,b=!1},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>x,TM:()=>C,yJ:()=>f,sC:()=>T,AO:()=>p});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var s=n(1561);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),x.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=x.index+e;return t>=0&&t{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=f(n);o&&o!==h&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),g=0;g{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},8291:(e,t,n)=>{var r,o;!function(){var a,i,s,l,c,u,d,p,f,h,m,g,b,y,v,x,w,S,k,_,E,C,A,T,P,L,O,N,j,R,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=I.utils.clone(t)||{};l.position=[i,s],l.index=o.length,o.push(new I.Token(n.slice(i,a),l))}i=a+1}}return o},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ae&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:as?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new I.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new I.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new I.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var c,u=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?c=o.node.edges[d]:(c=new I.TokenSet,o.node.edges[d]=c),1==o.str.length&&(c.final=!0),r.push({node:c,editsRemaining:o.editsRemaining-1,str:u+o.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,o=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),s=0;s1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(o.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=o)}()},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},8015:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>p});var r=n(4784),o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},r=window.Promise||function(e){function t(){}e(t,t)},a=function(){for(var e=arguments.length,t=Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:{}).target,t=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,n=void 0;if(b.container)if(b.container instanceof Object)t=(e=o({},e,b.container)).width-e.left-e.right-2*b.margin,n=e.height-e.top-e.bottom-2*b.margin;else{var r=(i(b.container)?b.container:document.querySelector(b.container)).getBoundingClientRect(),a=r.width,l=r.height,c=r.left,u=r.top;e=o({},e,{width:a,height:l,left:c,top:u})}t=t||e.width-2*b.margin,n=n||e.height-2*b.margin;var d=y.zoomedHd||y.original,p=s(d)?t:d.naturalWidth||t,f=s(d)?n:d.naturalHeight||n,h=d.getBoundingClientRect(),m=h.top,g=h.left,v=h.width,x=h.height,w=Math.min(Math.max(v,p),t)/v,S=Math.min(Math.max(x,f),n)/x,k=Math.min(w,S),_="scale("+k+") translate3d("+((t-v)/2-g+b.margin+e.left)/k+"px, "+((n-x)/2-m+b.margin+e.top)/k+"px, 0)";y.zoomed.style.transform=_,y.zoomedHd&&(y.zoomedHd.style.transform=_)};return new r((function(n){if(e&&-1===f.indexOf(e))n(x);else{if(y.zoomed)n(x);else{if(e)y.original=e;else{if(!(f.length>0))return void n(x);var r=f;y.original=r[0]}if(y.original.dispatchEvent(c("medium-zoom:open",{detail:{zoom:x}})),g=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,m=!0,y.zoomed=function(e){var t=e.getBoundingClientRect(),n=t.top,r=t.left,o=t.width,a=t.height,i=e.cloneNode(),s=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,l=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return i.removeAttribute("id"),i.style.position="absolute",i.style.top=n+s+"px",i.style.left=r+l+"px",i.style.width=o+"px",i.style.height=a+"px",i.style.transform="",i}(y.original),document.body.appendChild(v),b.template){var o=i(b.template)?b.template:document.querySelector(b.template);y.template=document.createElement("div"),y.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(y.template)}if(y.original.parentElement&&"PICTURE"===y.original.parentElement.tagName&&y.original.currentSrc&&(y.zoomed.src=y.original.currentSrc),document.body.appendChild(y.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),y.original.classList.add("medium-zoom-image--hidden"),y.zoomed.classList.add("medium-zoom-image--opened"),y.zoomed.addEventListener("click",d),y.zoomed.addEventListener("transitionend",(function e(){m=!1,y.zoomed.removeEventListener("transitionend",e),y.original.dispatchEvent(c("medium-zoom:opened",{detail:{zoom:x}})),n(x)})),y.original.getAttribute("data-zoom-src")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("srcset"),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading"),y.zoomedHd.src=y.zoomed.getAttribute("data-zoom-src"),y.zoomedHd.onerror=function(){clearInterval(a),console.warn("Unable to reach the zoom image target "+y.zoomedHd.src),y.zoomedHd=null,t()};var a=setInterval((function(){y.zoomedHd.complete&&(clearInterval(a),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t())}),10)}else if(y.original.hasAttribute("srcset")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading");var s=y.zoomedHd.addEventListener("load",(function(){y.zoomedHd.removeEventListener("load",s),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t()}))}else t()}}}))},d=function(){return new r((function(e){if(!m&&y.original){m=!0,document.body.classList.remove("medium-zoom--opened"),y.zoomed.style.transform="",y.zoomedHd&&(y.zoomedHd.style.transform=""),y.template&&(y.template.style.transition="opacity 150ms",y.template.style.opacity=0),y.original.dispatchEvent(c("medium-zoom:close",{detail:{zoom:x}})),y.zoomed.addEventListener("transitionend",(function t(){y.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(y.zoomed),y.zoomedHd&&document.body.removeChild(y.zoomedHd),document.body.removeChild(v),y.zoomed.classList.remove("medium-zoom-image--opened"),y.template&&document.body.removeChild(y.template),m=!1,y.zoomed.removeEventListener("transitionend",t),y.original.dispatchEvent(c("medium-zoom:closed",{detail:{zoom:x}})),y.original=null,y.zoomed=null,y.zoomedHd=null,y.template=null,e(x)}))}else e(x)}))},p=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).target;return y.original?d():u({target:e})},f=[],h=[],m=!1,g=0,b=n,y={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?b=t:(t||"string"==typeof t)&&a(t);var v=function(e){var t=document.createElement("div");return t.classList.add("medium-zoom-overlay"),t.style.background=e,t}((b=o({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},b)).background);document.addEventListener("click",(function(e){var t=e.target;t!==v?-1!==f.indexOf(t)&&p({target:t}):d()})),document.addEventListener("keyup",(function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||d()})),document.addEventListener("scroll",(function(){if(!m&&y.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(g-e)>b.scrollOffset&&setTimeout(d,150)}})),window.addEventListener("resize",d);var x={open:u,close:d,toggle:p,update:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(v.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=o({},b.container,e.container)),e.template){var n=i(e.template)?e.template:document.querySelector(e.template);t.template=n}return b=o({},b,t),f.forEach((function(e){e.dispatchEvent(c("medium-zoom:update",{detail:{zoom:x}}))})),x},clone:function(){return e(o({},b,arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}))},attach:a,detach:function(){for(var e=arguments.length,t=Array(e),n=0;n0?t.reduce((function(e,t){return[].concat(e,l(t))}),[]):f;return r.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(c("medium-zoom:detach",{detail:{zoom:x}}))})),f=f.filter((function(e){return-1===r.indexOf(e)})),x},on:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.addEventListener("medium-zoom:"+e,t,n)})),h.push({type:"medium-zoom:"+e,listener:t,options:n}),x},off:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.removeEventListener("medium-zoom:"+e,t,n)})),h=h.filter((function(n){return!(n.type==="medium-zoom:"+e&&n.listener.toString()===t.toString())})),x},getOptions:function(){return b},getImages:function(){return f},getZoomedImage:function(){return y.original}};return x},{themeConfig:d}=r.default,p=function(){if("undefined"==typeof window)return null;const{zoomSelector:e=".markdown img"}=d,{imageZoom:{selector:t=e,options:n}={}}=d;return setTimeout((()=>{u(t,n)}),1e3),{onRouteUpdate({location:e,previousLocation:r}){e&&e.hash&&e.hash.length||r&&e.pathname!==r.pathname&&setTimeout((()=>{u(t,n)}),1e3)}}}()},7022:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i{!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(Prism)},6976:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2514:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},5294:()=>{!function(e){var t=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:t,alias:"regex"}};e.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:t,alias:"selector"},punctuation:/[[\]{}&]/},e.languages.tex=e.languages.latex,e.languages.context=e.languages.latex}(Prism)},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),h=p.indexOf(f);if(h>-1){++o;var m=p.substring(0,h),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(h+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},875:(e,t,n)=>{var r={"./prism-bash":7022,"./prism-diff":7839,"./prism-java":6976,"./prism-json":2514,"./prism-latex":5294};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=875},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n

Z0P17I|S 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