diff --git a/404.html b/404.html index 0c164b7c5..c448d5ad0 100644 --- a/404.html +++ b/404.html @@ -11,13 +11,13 @@ - +
Skip to main content

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.

- + \ No newline at end of file diff --git a/_headers b/_headers new file mode 100644 index 000000000..1dabfa168 --- /dev/null +++ b/_headers @@ -0,0 +1,6 @@ +# They are safe for immutable caching, as we're not changing fonts any time soon + +/static/fonts/* + Cache-Control: public + Cache-Control: max-age=31536000 + Cache-Control: immutable \ No newline at end of file diff --git a/assets/js/0cc695c5.55af884a.js b/assets/js/0cc695c5.55af884a.js new file mode 100644 index 000000000..c9a2e3b1b --- /dev/null +++ b/assets/js/0cc695c5.55af884a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2768],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(r),m=i,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||o;return r?n.createElement(f,a(a({ref:t},p),{},{components:r})):n.createElement(f,a({ref:t},p))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:i,a[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=r(7462),i=(r(7294),r(3905));const o={label:"JPEG 2000",sidebar_position:5},a="JPEG 2000",s={unversionedId:"images/JPEG2000",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.md",sourceDirName:"images",slug:"/images/JPEG2000",permalink:"/docs/images/JPEG2000",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG2000.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"JPEG 2000",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"WebP",permalink:"/docs/images/WebP"},next:{title:"AVIF",permalink:"/docs/images/AVIF"}},c={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,i.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"jpeg-2000"},"JPEG 2000"),(0,i.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,i.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,i.kt)("p",null,'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.'))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0cc695c5.dc5a5d25.js b/assets/js/0cc695c5.dc5a5d25.js deleted file mode 100644 index 10be2a1a4..000000000 --- a/assets/js/0cc695c5.dc5a5d25.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2768],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),l=u(r),m=o,f=l["".concat(s,".").concat(m)]||l[m]||d[m]||i;return r?n.createElement(f,a(a({ref:t},p),{},{components:r})):n.createElement(f,a({ref:t},p))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[l]="string"==typeof e?e:o,a[1]=c;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={label:"JPEG 2000",sidebar_position:5},a="JPEG 2000",c={unversionedId:"images/JPEG2000",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.md",sourceDirName:"images",slug:"/images/JPEG2000",permalink:"/docs/images/JPEG2000",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG2000.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"JPEG 2000",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"WebP",permalink:"/docs/images/WebP"},next:{title:"AVIF",permalink:"/docs/images/AVIF"}},s={},u=[],p={toc:u},l="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(l,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"jpeg-2000"},"JPEG 2000"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/146621ac.1ae57d7f.js b/assets/js/146621ac.1ae57d7f.js deleted file mode 100644 index 9d1472bd1..000000000 --- a/assets/js/146621ac.1ae57d7f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1164],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=s(r),b=o,f=p["".concat(l,".").concat(b)]||p[b]||d[b]||i;return r?n.createElement(f,a(a({ref:t},u),{},{components:r})):n.createElement(f,a({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=b;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[p]="string"==typeof e?e:o,a[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const i={label:"brotli",sidebar_position:6},a="Brotli",c={unversionedId:"data/brotli",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.md",sourceDirName:"data",slug:"/data/brotli",permalink:"/docs/data/brotli",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/brotli.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"brotli",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"XZ",permalink:"/docs/data/xz"},next:{title:"ZPAQ",permalink:"/docs/data/zpaq"}},l={},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"brotli"},"Brotli"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/146621ac.71181485.js b/assets/js/146621ac.71181485.js new file mode 100644 index 000000000..a499890b6 --- /dev/null +++ b/assets/js/146621ac.71181485.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1164],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=o.createContext({}),c=function(e){var t=o.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},f=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(r),f=n,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||a;return r?o.createElement(m,i(i({ref:t},p),{},{components:r})):o.createElement(m,i({ref:t},p))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=f;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=r(7462),n=(r(7294),r(3905));const a={label:"brotli",sidebar_position:6},i="Brotli",l={unversionedId:"data/brotli",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.md",sourceDirName:"data",slug:"/data/brotli",permalink:"/docs/data/brotli",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/brotli.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"brotli",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"XZ",permalink:"/docs/data/xz"},next:{title:"ZPAQ",permalink:"/docs/data/zpaq"}},s={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,o.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"brotli"},"Brotli"),(0,n.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,n.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,n.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,n.kt)("p",null,"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.kt)("inlineCode",{parentName:"p"},".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.kt)("inlineCode",{parentName:"p"},".tar.br")," Brotli archives like you would with ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/gzip"},"gzip")," or ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/xz"},"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."),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Brotli was co-authored & partially developed by Jyrki Alakuijala, who also worked on ",(0,n.kt)("a",{parentName:"p",href:"/docs/images/JXL"},"JPEG-XL")," & the efficient ",(0,n.kt)("a",{parentName:"p",href:"/docs/images/JPEG"},"JPEG")," encoder jpegli. JPEG-XL's metadata information is usually Brotli-compressed."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1776fc83.f8089d7a.js b/assets/js/1776fc83.db2049f7.js similarity index 73% rename from assets/js/1776fc83.f8089d7a.js rename to assets/js/1776fc83.db2049f7.js index 43f2c630a..e5686651d 100644 --- a/assets/js/1776fc83.f8089d7a.js +++ b/assets/js/1776fc83.db2049f7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6326],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),u=p(r),d=o,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||i;return r?n.createElement(f,a(a({ref:t},l),{},{components:r})):n.createElement(f,a({ref:t},l))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:o,a[1]=c;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={label:"JPEG-XL",sidebar_position:7},a="JPEG-XL",c={unversionedId:"images/JXL",id:"images/JXL",title:"JPEG-XL",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/JXL.md",sourceDirName:"images",slug:"/images/JXL",permalink:"/docs/images/JXL",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JXL.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"JPEG-XL",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AVIF",permalink:"/docs/images/AVIF"},next:{title:"x264",permalink:"/docs/encoders/x264"}},s={},p=[{value:"Performance Checklist",id:"performance-checklist",level:2}],l={toc:p},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"jpeg-xl"},"JPEG-XL"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,o.kt)("p",null,"Lossless? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Lossy? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Supported Bit Depths:\n",(0,o.kt)("em",{parentName:"p"},"Up to 32 BPC")),(0,o.kt)("p",null,"HDR/Wide Gamut? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Animation? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Transparency? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Progressive Decode? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Royalty Free? ",(0,o.kt)("em",{parentName:"p"},"Yes")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6326],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),u=p(r),d=o,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||i;return r?n.createElement(f,a(a({ref:t},l),{},{components:r})):n.createElement(f,a({ref:t},l))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:o,a[1]=c;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={label:"JPEG-XL",sidebar_position:7},a="JPEG-XL",c={unversionedId:"images/JXL",id:"images/JXL",title:"JPEG-XL",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/JXL.md",sourceDirName:"images",slug:"/images/JXL",permalink:"/docs/images/JXL",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JXL.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"JPEG-XL",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AVIF",permalink:"/docs/images/AVIF"},next:{title:"x264",permalink:"/docs/encoders/x264"}},s={},p=[{value:"Performance Checklist",id:"performance-checklist",level:2}],l={toc:p},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"jpeg-xl"},"JPEG-XL"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("p",null,"JPEG-XL 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,o.kt)("a",{parentName:"p",href:"/docs/images/JPEG"},"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."),(0,o.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,o.kt)("p",null,"Lossless? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Lossy? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Supported Bit Depths:\n",(0,o.kt)("em",{parentName:"p"},"Up to 32 BPC")),(0,o.kt)("p",null,"HDR/Wide Gamut? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Animation? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Transparency? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Progressive Decode? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Royalty Free? ",(0,o.kt)("em",{parentName:"p"},"Yes")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/195e296c.5b006741.js b/assets/js/195e296c.5b006741.js deleted file mode 100644 index 465ac42f6..000000000 --- a/assets/js/195e296c.5b006741.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6117],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>u});var i=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),c=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),h=a,u=d["".concat(l,".").concat(h)]||d[h]||m[h]||o;return n?i.createElement(u,r(r({ref:t},p),{},{components:n})):i.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,r[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var i=n(7462),a=(n(7294),n(3905));const o={label:"JPEG",sidebar_position:1},r="JPEG",s={unversionedId:"images/JPEG",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.md",sourceDirName:"images",slug:"/images/JPEG",permalink:"/docs/images/JPEG",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"JPEG",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Zstandard",permalink:"/docs/data/zstd"},next:{title:"PNG",permalink:"/docs/images/PNG"}},l={},c=[{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}],p={toc:c},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,i.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"jpeg"},"JPEG"),(0,a.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,a.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,a.kt)("admonition",{title:"Pending Review",type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.")),(0,a.kt)("p",null,"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 compression."),(0,a.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,a.kt)("p",null,"Lossless? ",(0,a.kt)("em",{parentName:"p"},"No")),(0,a.kt)("p",null,"Lossy? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("p",null,"Supported Bit Depth:\n",(0,a.kt)("em",{parentName:"p"},"8 BPC")),(0,a.kt)("p",null,"HDR/Wide Gamut? ",(0,a.kt)("em",{parentName:"p"},"Kinda")),(0,a.kt)("p",null,"Animation? ",(0,a.kt)("em",{parentName:"p"},"No")),(0,a.kt)("p",null,"Transparency? ",(0,a.kt)("em",{parentName:"p"},"No")),(0,a.kt)("p",null,"Progressive Decode? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("p",null,"Royalty Free? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("h2",{id:"compression"},"Compression"),(0,a.kt)("p",null,"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:"),(0,a.kt)("h4",{id:"color-space-conversion"},"Color Space Conversion"),(0,a.kt)("p",null," 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,a.kt)("em",{parentName:"p"},"4:2:0")," subsampling."),(0,a.kt)("h4",{id:"image-tiling"},"Image Tiling"),(0,a.kt)("p",null," The image is divided into smaller blocks or tiles, typically 8x8 pixels each. Each of these blocks will be processed separately."),(0,a.kt)("h4",{id:"discrete-cosine-transform-dct"},"Discrete Cosine Transform (DCT)"),(0,a.kt)("p",null," 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. "),(0,a.kt)("h4",{id:"quantization"},"Quantization"),(0,a.kt)("p",null,' 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.'),(0,a.kt)("h4",{id:"zigzag-scanning"},"Zigzag Scanning"),(0,a.kt)("p",null," The quantized coefficients are then reordered using a zigzag pattern. This is done to prepare the data for the next step."),(0,a.kt)("h4",{id:"run-length-encoding"},"Run-Length Encoding"),(0,a.kt)("p",null," 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."),(0,a.kt)("h4",{id:"entropy-encoding"},"Entropy Encoding"),(0,a.kt)("p",null," 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."),(0,a.kt)("h4",{id:"saving-the-file"},"Saving the File"),(0,a.kt)("p",null," 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."),(0,a.kt)("h4",{id:"decoding"},"Decoding"),(0,a.kt)("p",null," 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."),(0,a.kt)("p",null,"It's important to note that JPEG compression is ",(0,a.kt)("strong",{parentName:"p"},(0,a.kt)("em",{parentName:"strong"},"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,a.kt)("a",{parentName:"p",href:"/docs/images/PNG"},"PNG"),", ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/WebP"},"WebP"),"'s lossless mode, and ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/JXL"},"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."),(0,a.kt)("p",null,"While JPEG is certainly not the most state of the art lossy image codec compared to its newer and (usually) better successors like JPEG-XL (an actual direct successor) & ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/AVIF"},"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."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/195e296c.d6739c70.js b/assets/js/195e296c.d6739c70.js new file mode 100644 index 000000000..e621e09df --- /dev/null +++ b/assets/js/195e296c.d6739c70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6117],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>u});var i=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),c=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),h=a,u=d["".concat(l,".").concat(h)]||d[h]||m[h]||o;return n?i.createElement(u,r(r({ref:t},p),{},{components:n})):i.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,r[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var i=n(7462),a=(n(7294),n(3905));const o={label:"JPEG",sidebar_position:1},r="JPEG",s={unversionedId:"images/JPEG",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.md",sourceDirName:"images",slug:"/images/JPEG",permalink:"/docs/images/JPEG",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"JPEG",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Zstandard",permalink:"/docs/data/zstd"},next:{title:"PNG",permalink:"/docs/images/PNG"}},l={},c=[{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}],p={toc:c},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,i.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"jpeg"},"JPEG"),(0,a.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,a.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,a.kt)("admonition",{title:"Pending Review",type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.")),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,a.kt)("p",null,"Lossless? ",(0,a.kt)("em",{parentName:"p"},"No")),(0,a.kt)("p",null,"Lossy? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("p",null,"Supported Bit Depth:\n",(0,a.kt)("em",{parentName:"p"},"8 BPC")),(0,a.kt)("p",null,"HDR/Wide Gamut? ",(0,a.kt)("em",{parentName:"p"},"Kinda")),(0,a.kt)("p",null,"Animation? ",(0,a.kt)("em",{parentName:"p"},"No")),(0,a.kt)("p",null,"Transparency? ",(0,a.kt)("em",{parentName:"p"},"No")),(0,a.kt)("p",null,"Progressive Decode? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("p",null,"Royalty Free? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("h2",{id:"compression"},"Compression"),(0,a.kt)("p",null,"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:"),(0,a.kt)("h4",{id:"color-space-conversion"},"Color Space Conversion"),(0,a.kt)("p",null," 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,a.kt)("em",{parentName:"p"},"4:2:0")," subsampling."),(0,a.kt)("h4",{id:"image-tiling"},"Image Tiling"),(0,a.kt)("p",null," The image is divided into smaller blocks or tiles, typically 8x8 pixels each. Each of these blocks will be processed separately."),(0,a.kt)("h4",{id:"discrete-cosine-transform-dct"},"Discrete Cosine Transform (DCT)"),(0,a.kt)("p",null," 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. "),(0,a.kt)("h4",{id:"quantization"},"Quantization"),(0,a.kt)("p",null,' 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.'),(0,a.kt)("h4",{id:"zigzag-scanning"},"Zigzag Scanning"),(0,a.kt)("p",null," The quantized coefficients are then reordered using a zigzag pattern. This is done to prepare the data for the next step."),(0,a.kt)("h4",{id:"run-length-encoding"},"Run-Length Encoding"),(0,a.kt)("p",null," 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."),(0,a.kt)("h4",{id:"entropy-encoding"},"Entropy Encoding"),(0,a.kt)("p",null," 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."),(0,a.kt)("h4",{id:"saving-the-file"},"Saving the File"),(0,a.kt)("p",null," 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."),(0,a.kt)("h4",{id:"decoding"},"Decoding"),(0,a.kt)("p",null," 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."),(0,a.kt)("p",null,"It's important to note that JPEG compression is ",(0,a.kt)("strong",{parentName:"p"},(0,a.kt)("em",{parentName:"strong"},"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,a.kt)("a",{parentName:"p",href:"/docs/images/PNG"},"PNG"),", ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/WebP"},"WebP"),"'s lossless mode, and ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/JXL"},"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."),(0,a.kt)("p",null,"While JPEG is certainly not the most state of the art lossy image codec compared to its newer and (usually) better successors like JPEG-XL (an actual direct successor) & ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/AVIF"},"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."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/236b5e64.722f80d2.js b/assets/js/236b5e64.722f80d2.js new file mode 100644 index 000000000..677ef0f20 --- /dev/null +++ b/assets/js/236b5e64.722f80d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4591],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(r),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||i;return r?n.createElement(f,a(a({ref:t},p),{},{components:r})):n.createElement(f,a({ref:t},p))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:o,a[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const i={label:"xz",sidebar_position:5},a="XZ",s={unversionedId:"data/xz",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.md",sourceDirName:"data",slug:"/data/xz",permalink:"/docs/data/xz",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/xz.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"xz",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"7-zip (7z)",permalink:"/docs/data/7z"},next:{title:"Brotli",permalink:"/docs/data/brotli"}},c={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"xz"},"XZ"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("p",null,"XZ is a data compression format 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,o.kt)("a",{parentName:"p",href:"/docs/data/7z"},"7-zip")," to increase the resulting archive's compression ratio."),(0,o.kt)("p",null,"XZ can only compress one file at a time, so making a tar archive of the files you'd like to compress (if there are multiple) is necessary when using XZ."),(0,o.kt)("p",null,"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."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/236b5e64.f7c0268f.js b/assets/js/236b5e64.f7c0268f.js deleted file mode 100644 index 85997a11e..000000000 --- a/assets/js/236b5e64.f7c0268f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4591],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(r),f=o,b=p["".concat(s,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(b,a(a({ref:t},u),{},{components:r})):n.createElement(b,a({ref:t},u))}));function b(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[p]="string"==typeof e?e:o,a[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const i={label:"xz",sidebar_position:5},a="XZ",c={unversionedId:"data/xz",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.md",sourceDirName:"data",slug:"/data/xz",permalink:"/docs/data/xz",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/xz.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"xz",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"7-zip (7z)",permalink:"/docs/data/7z"},next:{title:"Brotli",permalink:"/docs/data/brotli"}},s={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"xz"},"XZ"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3494e53a.8d763d6c.js b/assets/js/3494e53a.8d763d6c.js new file mode 100644 index 000000000..6c4a7eb12 --- /dev/null +++ b/assets/js/3494e53a.8d763d6c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[370],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=p(r),d=o,f=u["".concat(c,".").concat(d)]||u[d]||m[d]||i;return r?n.createElement(f,a(a({ref:t},l),{},{components:r})):n.createElement(f,a({ref:t},l))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:o,a[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={label:"WebP",sidebar_position:4},a="WebP",s={unversionedId:"images/WebP",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.md",sourceDirName:"images",slug:"/images/WebP",permalink:"/docs/images/WebP",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/WebP.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"WebP",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"HEIC",permalink:"/docs/images/HEIC"},next:{title:"JPEG 2000",permalink:"/docs/images/JPEG2000"}},c={},p=[{value:"Performance Checklist",id:"performance-checklist",level:2}],l={toc:p},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"webp"},"WebP"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("p",null,'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,o.kt)("a",{parentName:"p",href:"/docs/video/VP8"},"VP8")," video codec, and a novel lossless mode added in 2011."),(0,o.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,o.kt)("p",null,"Lossless? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Lossy? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Supported Bit Depth:\n",(0,o.kt)("em",{parentName:"p"},"8 BPC")),(0,o.kt)("p",null,"HDR/Wide Gamut? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Animation? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Transparency? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Progressive Decode? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Royalty Free? ",(0,o.kt)("em",{parentName:"p"},"Yes")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3494e53a.fb908f26.js b/assets/js/3494e53a.fb908f26.js deleted file mode 100644 index 00c5029df..000000000 --- a/assets/js/3494e53a.fb908f26.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[370],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),m=c(r),u=o,f=m["".concat(l,".").concat(u)]||m[u]||d[u]||i;return r?n.createElement(f,a(a({ref:t},p),{},{components:r})):n.createElement(f,a({ref:t},p))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:o,a[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const i={label:"WebP",sidebar_position:4},a="WebP",s={unversionedId:"images/WebP",id:"images/WebP",title:"WebP",description:'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 [VP8] video codec, and a novel lossless mode added in 2011.',source:"@site/docs/images/WebP.md",sourceDirName:"images",slug:"/images/WebP",permalink:"/docs/images/WebP",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/WebP.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"WebP",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"HEIC",permalink:"/docs/images/HEIC"},next:{title:"JPEG 2000",permalink:"/docs/images/JPEG2000"}},l={},c=[{value:"Performance Checklist",id:"performance-checklist",level:2}],p={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(m,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"webp"},"WebP"),(0,o.kt)("p",null,'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 ',"[VP8]"," video codec, and a novel lossless mode added in 2011."),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,o.kt)("p",null,"Lossless? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Lossy? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Supported Bit Depth:\n",(0,o.kt)("em",{parentName:"p"},"8 BPC")),(0,o.kt)("p",null,"HDR/Wide Gamut? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Animation? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Transparency? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Progressive Decode? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Royalty Free? ",(0,o.kt)("em",{parentName:"p"},"Yes")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/44ae7035.451f1fa8.js b/assets/js/44ae7035.451f1fa8.js deleted file mode 100644 index ca06d1656..000000000 --- a/assets/js/44ae7035.451f1fa8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5888],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,p=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),u=s(r),d=o,f=u["".concat(p,".").concat(d)]||u[d]||m[d]||i;return r?n.createElement(f,a(a({ref:t},l),{},{components:r})):n.createElement(f,a({ref:t},l))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[u]="string"==typeof e?e:o,a[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const i={label:"HEIC",sidebar_position:4},a="HEIC",c={unversionedId:"images/HEIC",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.md",sourceDirName:"images",slug:"/images/HEIC",permalink:"/docs/images/HEIC",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/HEIC.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"HEIC",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"GIF",permalink:"/docs/images/GIF"},next:{title:"WebP",permalink:"/docs/images/WebP"}},p={},s=[{value:"Performance Checklist",id:"performance-checklist",level:2}],l={toc:s},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"heic"},"HEIC"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,o.kt)("p",null,"Lossless? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Lossy? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Supported Bit Depths:\n",(0,o.kt)("em",{parentName:"p"},"8 BPC, 10 BPC")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("em",{parentName:"p"},"Higher bit depths not widely supported"))),(0,o.kt)("p",null,"HDR/Wide Gamut? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Animation? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Transparency? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Progressive Decode? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Royalty Free? ",(0,o.kt)("em",{parentName:"p"},"No")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/44ae7035.ddcb322a.js b/assets/js/44ae7035.ddcb322a.js new file mode 100644 index 000000000..444e23343 --- /dev/null +++ b/assets/js/44ae7035.ddcb322a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5888],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),m=c(r),d=o,f=m["".concat(p,".").concat(d)]||m[d]||u[d]||a;return r?n.createElement(f,i(i({ref:t},l),{},{components:r})):n.createElement(f,i({ref:t},l))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[m]="string"==typeof e?e:o,i[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const a={label:"HEIC",sidebar_position:4},i="HEIC",s={unversionedId:"images/HEIC",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.md",sourceDirName:"images",slug:"/images/HEIC",permalink:"/docs/images/HEIC",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/HEIC.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"HEIC",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"GIF",permalink:"/docs/images/GIF"},next:{title:"WebP",permalink:"/docs/images/WebP"}},p={},c=[{value:"Performance Checklist",id:"performance-checklist",level:2}],l={toc:c},m="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(m,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"heic"},"HEIC"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("p",null,"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,o.kt)("a",{parentName:"p",href:"/docs/images/JPEG"},"JPEG"),". HEIC files use ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/HEVC"},"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,o.kt)("a",{parentName:"p",href:"/docs/images/AVIF"},"AVIF"),", which uses the same container to store ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"AV1"),"-compressed images."),(0,o.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,o.kt)("p",null,"Lossless? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Lossy? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Supported Bit Depths:\n",(0,o.kt)("em",{parentName:"p"},"8 BPC, 10 BPC")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("em",{parentName:"p"},"Higher bit depths not widely supported"))),(0,o.kt)("p",null,"HDR/Wide Gamut? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Animation? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Transparency? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Progressive Decode? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Royalty Free? ",(0,o.kt)("em",{parentName:"p"},"No")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4d465a8d.b5e22740.js b/assets/js/4d465a8d.b5e22740.js deleted file mode 100644 index a36a7d3ea..000000000 --- a/assets/js/4d465a8d.b5e22740.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4503],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=a.createContext({}),m=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=m(e.components);return a.createElement(p.Provider,{value:t},e.children)},u="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=m(n),c=i,f=u["".concat(p,".").concat(c)]||u[c]||s[c]||r;return n?a.createElement(f,o(o({ref:t},d),{},{components:n})):a.createElement(f,o({ref:t},d))}));function f(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,o=new Array(r);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:i,o[1]=l;for(var m=2;m{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>s,frontMatter:()=>r,metadata:()=>l,toc:()=>m});var a=n(7462),i=(n(7294),n(3905));const r={label:"ffmpeg",sidebar_position:11},o="FFmpeg",l={unversionedId:"utilities/ffmpeg",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.md",sourceDirName:"utilities",slug:"/utilities/ffmpeg",permalink:"/docs/utilities/ffmpeg",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/ffmpeg.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{label:"ffmpeg",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"eac3to",permalink:"/docs/utilities/eac3to"},next:{title:"PSNR",permalink:"/docs/metrics/PSNR"}},p={},m=[{value:"Linux & macOS",id:"linux--macos",level:3},{value:"Windows",id:"windows",level:3},{value:"Transmux a video",id:"transmux-a-video",level:4},{value:"Filter a video",id:"filter-a-video",level:4},{value:"References",id:"references",level:2}],d={toc:m},u="wrapper";function s(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"ffmpeg"},"FFmpeg"),(0,i.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,i.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"//ffmpeg.org"},"FFmpeg")," is a multimedia framework that has utilities for transcoding, transmuxing, and filtering audio and video. It provides the ",(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"ffprobe"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"ffplay")," command-line utilities. It also features the libav","*"," libraries, which allow you to use the functionality of FFmpeg without the programs."),(0,i.kt)("h1",{id:"installation"},"Installation"),(0,i.kt)("p",null,"There are a number of ways to install FFmpeg depending on the operating system you're using."),(0,i.kt)("h3",{id:"linux--macos"},"Linux & macOS"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Package Manager")),(0,i.kt)("p",null,"The easiest way to obtain FFmpeg is through your package manager. On most package managers, the package is simply named ",(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg"),", however ",(0,i.kt)("inlineCode",{parentName:"p"},"ffprobe")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"ffplay")," may have their own packages. Note that the packages may be outdated."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Compiling from source")),(0,i.kt)("p",null,"A more complete guide is available at the ",(0,i.kt)("a",{parentName:"p",href:"https://trac.ffmpeg.org/wiki/CompilationGuide"},"FFmpeg Compilation Guide"),". Simplifying things a bit, what you need to do is:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"grab ",(0,i.kt)("a",{parentName:"li",href:"https://ffmpeg.org/download.html"},"the sources")," or clone from FFmpeg's git: ",(0,i.kt)("inlineCode",{parentName:"li"},"git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg")),(0,i.kt)("li",{parentName:"ul"},"Enter the directory & run ",(0,i.kt)("inlineCode",{parentName:"li"},"./configure --help")," to see a list of features and libraries you can choose to build with."),(0,i.kt)("li",{parentName:"ul"},"Install all libraries you want to build FFmpeg with."),(0,i.kt)("li",{parentName:"ul"},"Run ",(0,i.kt)("inlineCode",{parentName:"li"},"./configure")," with all ",(0,i.kt)("inlineCode",{parentName:"li"},"--enable-")," flags you want."),(0,i.kt)("li",{parentName:"ul"},"Run ",(0,i.kt)("inlineCode",{parentName:"li"},"make"),", or ",(0,i.kt)("inlineCode",{parentName:"li"},"make -j $(nproc)")," on Linux to properly make use of multiple cores. on macOS, this would be ",(0,i.kt)("inlineCode",{parentName:"li"},"make -j $(sysctl -n hw.ncpu)"),"."),(0,i.kt)("li",{parentName:"ul"},"Run ",(0,i.kt)("inlineCode",{parentName:"li"},"make install"),". May require root.")),(0,i.kt)("h3",{id:"windows"},"Windows"),(0,i.kt)("p",null,"To be filled."),(0,i.kt)("h1",{id:"using-ffmpeg"},"Using FFmpeg"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg")," is the primary command-line tool of FFmpeg. It takes 0 or more bitstreams as inputs & outputs."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"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,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -r 24 -i file1 file2")," applies the ",(0,i.kt)("inlineCode",{parentName:"p"},"-r 24")," option to the input ",(0,i.kt)("inlineCode",{parentName:"p"},"file1"),", interpreting the video as having that frame rate, while ",(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -i file1 -r 24 file2")," applies the ",(0,i.kt)("inlineCode",{parentName:"p"},"-r 24")," option to ",(0,i.kt)("inlineCode",{parentName:"p"},"file2"),". To get a list of options, refer to the ",(0,i.kt)("a",{parentName:"p",href:"//ffmpeg.org/ffmpeg-all.html"},"FFmpeg documentation"),"."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Video Transcoding")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -i input -c:v video_codec -b:v video_bitrate -c:a audio_codec -b:a audio_bitrate output")),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Option"),(0,i.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-c:v video_encoder")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"c"),"odec for the automatically selected ",(0,i.kt)("strong",{parentName:"td"},"v"),"ideo stream")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-b:v video_bitrate")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"b"),"itrate for the automatically selected ",(0,i.kt)("strong",{parentName:"td"},"v"),"ideo stream")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-c:a audio_codec")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"c"),"odec for the automatically selected ",(0,i.kt)("strong",{parentName:"td"},"a"),"udio stream")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-b:a audio_bitrate")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"b"),"itrate for the automatically selected ",(0,i.kt)("strong",{parentName:"td"},"a"),"udio stream")))),(0,i.kt)("h4",{id:"transmux-a-video"},"Transmux a video"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -i input -c copy output")),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Option"),(0,i.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-c copy")),(0,i.kt)("td",{parentName:"tr",align:null},"set the ",(0,i.kt)("strong",{parentName:"td"},"c"),"odec to ",(0,i.kt)("strong",{parentName:"td"},"copy"))))),(0,i.kt)("h4",{id:"filter-a-video"},"Filter a video"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -i input -c:v video_encoder -c:a audio_codec (...) -vf filter_name output")),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Option"),(0,i.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-vf filter_name")),(0,i.kt)("td",{parentName:"tr",align:null},"set the ",(0,i.kt)("strong",{parentName:"td"},"v"),"ideo ",(0,i.kt)("strong",{parentName:"td"},"f"),"ilter to ",(0,i.kt)("strong",{parentName:"td"},"filter_name"))))),(0,i.kt)("h2",{id:"references"},"References"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Special thanks to ",(0,i.kt)("a",{parentName:"em",href:"https://encoding.bluefalcon.cc/"},"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.")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4d465a8d.f78a5eef.js b/assets/js/4d465a8d.f78a5eef.js new file mode 100644 index 000000000..84e0f7795 --- /dev/null +++ b/assets/js/4d465a8d.f78a5eef.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4503],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>f});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var p=n.createContext({}),m=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=m(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=m(a),c=i,f=u["".concat(p,".").concat(c)]||u[c]||s[c]||r;return a?n.createElement(f,o(o({ref:t},d),{},{components:a})):n.createElement(f,o({ref:t},d))}));function f(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,o=new Array(r);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:i,o[1]=l;for(var m=2;m{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>s,frontMatter:()=>r,metadata:()=>l,toc:()=>m});var n=a(7462),i=(a(7294),a(3905));const r={label:"ffmpeg",sidebar_position:11},o="FFmpeg",l={unversionedId:"utilities/ffmpeg",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.md",sourceDirName:"utilities",slug:"/utilities/ffmpeg",permalink:"/docs/utilities/ffmpeg",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/ffmpeg.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{label:"ffmpeg",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"eac3to",permalink:"/docs/utilities/eac3to"},next:{title:"PSNR",permalink:"/docs/metrics/PSNR"}},p={},m=[{value:"Linux & macOS",id:"linux--macos",level:3},{value:"Windows",id:"windows",level:3},{value:"Transmux a video",id:"transmux-a-video",level:4},{value:"Filter a video",id:"filter-a-video",level:4}],d={toc:m},u="wrapper";function s(e){let{components:t,...a}=e;return(0,i.kt)(u,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"ffmpeg"},"FFmpeg"),(0,i.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,i.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"//ffmpeg.org"},"FFmpeg")," is a multimedia framework that has utilities for transcoding, transmuxing, and filtering audio and video. It provides the ",(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"ffprobe"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"ffplay")," command-line utilities. It also features the libav","*"," libraries, which allow you to use the functionality of FFmpeg without the programs."),(0,i.kt)("h1",{id:"installation"},"Installation"),(0,i.kt)("p",null,"There are a number of ways to install FFmpeg depending on the operating system you're using."),(0,i.kt)("h3",{id:"linux--macos"},"Linux & macOS"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Package Manager")),(0,i.kt)("p",null,"The easiest way to obtain FFmpeg is through your package manager. On most package managers, the package is simply named ",(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg"),", however ",(0,i.kt)("inlineCode",{parentName:"p"},"ffprobe")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"ffplay")," may have their own packages. Note that the packages may be outdated."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Compiling from source")),(0,i.kt)("p",null,"A more complete guide is available at the ",(0,i.kt)("a",{parentName:"p",href:"https://trac.ffmpeg.org/wiki/CompilationGuide"},"FFmpeg Compilation Guide"),". Simplifying things a bit, what you need to do is:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"grab ",(0,i.kt)("a",{parentName:"li",href:"https://ffmpeg.org/download.html"},"the sources")," or clone from FFmpeg's git: ",(0,i.kt)("inlineCode",{parentName:"li"},"git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg")),(0,i.kt)("li",{parentName:"ul"},"Enter the directory & run ",(0,i.kt)("inlineCode",{parentName:"li"},"./configure --help")," to see a list of features and libraries you can choose to build with."),(0,i.kt)("li",{parentName:"ul"},"Install all libraries you want to build FFmpeg with."),(0,i.kt)("li",{parentName:"ul"},"Run ",(0,i.kt)("inlineCode",{parentName:"li"},"./configure")," with all ",(0,i.kt)("inlineCode",{parentName:"li"},"--enable-")," flags you want."),(0,i.kt)("li",{parentName:"ul"},"Run ",(0,i.kt)("inlineCode",{parentName:"li"},"make"),", or ",(0,i.kt)("inlineCode",{parentName:"li"},"make -j $(nproc)")," on Linux to properly make use of multiple cores. on macOS, this would be ",(0,i.kt)("inlineCode",{parentName:"li"},"make -j $(sysctl -n hw.ncpu)"),"."),(0,i.kt)("li",{parentName:"ul"},"Run ",(0,i.kt)("inlineCode",{parentName:"li"},"make install"),". May require root.")),(0,i.kt)("h3",{id:"windows"},"Windows"),(0,i.kt)("p",null,"To be filled."),(0,i.kt)("h1",{id:"using-ffmpeg"},"Using FFmpeg"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg")," is the primary command-line tool of FFmpeg. It takes 0 or more bitstreams as inputs & outputs."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"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,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -r 24 -i file1 file2")," applies the ",(0,i.kt)("inlineCode",{parentName:"p"},"-r 24")," option to the input ",(0,i.kt)("inlineCode",{parentName:"p"},"file1"),", interpreting the video as having that frame rate, while ",(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -i file1 -r 24 file2")," applies the ",(0,i.kt)("inlineCode",{parentName:"p"},"-r 24")," option to ",(0,i.kt)("inlineCode",{parentName:"p"},"file2"),". To get a list of options, refer to the ",(0,i.kt)("a",{parentName:"p",href:"//ffmpeg.org/ffmpeg-all.html"},"FFmpeg documentation"),"."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Video Transcoding")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -i input -c:v video_codec -b:v video_bitrate -c:a audio_codec -b:a audio_bitrate output")),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Option"),(0,i.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-c:v video_encoder")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"c"),"odec for the automatically selected ",(0,i.kt)("strong",{parentName:"td"},"v"),"ideo stream")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-b:v video_bitrate")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"b"),"itrate for the automatically selected ",(0,i.kt)("strong",{parentName:"td"},"v"),"ideo stream")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-c:a audio_codec")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"c"),"odec for the automatically selected ",(0,i.kt)("strong",{parentName:"td"},"a"),"udio stream")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-b:a audio_bitrate")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"b"),"itrate for the automatically selected ",(0,i.kt)("strong",{parentName:"td"},"a"),"udio stream")))),(0,i.kt)("h4",{id:"transmux-a-video"},"Transmux a video"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -i input -c copy output")),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Option"),(0,i.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-c copy")),(0,i.kt)("td",{parentName:"tr",align:null},"set the ",(0,i.kt)("strong",{parentName:"td"},"c"),"odec to ",(0,i.kt)("strong",{parentName:"td"},"copy"))))),(0,i.kt)("h4",{id:"filter-a-video"},"Filter a video"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -i input -c:v video_encoder -c:a audio_codec (...) -vf filter_name output")),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Option"),(0,i.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"-vf filter_name")),(0,i.kt)("td",{parentName:"tr",align:null},"set the ",(0,i.kt)("strong",{parentName:"td"},"v"),"ideo ",(0,i.kt)("strong",{parentName:"td"},"f"),"ilter to ",(0,i.kt)("strong",{parentName:"td"},"filter_name"))))),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"References:"),"\n",(0,i.kt)("em",{parentName:"p"},(0,i.kt)("sup",{parentName:"em",id:"fnref-multimediawiki-howtos"},(0,i.kt)("a",{parentName:"sup",href:"#fn-multimediawiki-howtos",className:"footnote-ref"},"multimediawiki-howtos")),": ",(0,i.kt)("a",{parentName:"em",href:"//wiki.multimedia.cx/index.php?search=HOWTO&title=Special%3ASearch&go=Go"},"HOWTO Search Results - MultimediaWiki"))),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Special thanks to ",(0,i.kt)("a",{parentName:"em",href:"https://encoding.bluefalcon.cc/"},"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.")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/68409bcb.1b3a7739.js b/assets/js/68409bcb.1b3a7739.js new file mode 100644 index 000000000..2df9ee474 --- /dev/null +++ b/assets/js/68409bcb.1b3a7739.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6976],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),p=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(r),u=n,f=d["".concat(l,".").concat(u)]||d[u]||m[u]||o;return r?a.createElement(f,i(i({ref:t},c),{},{components:r})):a.createElement(f,i({ref:t},c))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:n,i[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=r(7462),n=(r(7294),r(3905));const o={label:"zstd",sidebar_position:7},i="Zstandard",s={unversionedId:"data/zstd",id:"data/zstd",title:"Zstandard",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.md",sourceDirName:"data",slug:"/data/zstd",permalink:"/docs/data/zstd",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zstd.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"zstd",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"ZPAQ",permalink:"/docs/data/zpaq"},next:{title:"JPEG",permalink:"/docs/images/JPEG"}},l={},p=[],c={toc:p},d="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"zstandard"},"Zstandard"),(0,n.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,n.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,n.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,n.kt)("p",null,"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,n.kt)("a",{parentName:"p",href:"/docs/data/zip"},"ZIP")," or ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/gzip"},"gzip")," while being faster overall. In practice, it is said to compress similarly to pure LZMA (part of ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/xz"},"XZ")," & ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/7z"},"7-zip"),") while being much faster."),(0,n.kt)("p",null,"While ",(0,n.kt)("inlineCode",{parentName:"p"},".tar.zst")," archives aren't as popular as ",(0,n.kt)("inlineCode",{parentName:"p"},".tar.xz")," or ",(0,n.kt)("inlineCode",{parentName:"p"},".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."),(0,n.kt)("p",null,"The command line ",(0,n.kt)("inlineCode",{parentName:"p"},"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,n.kt)("inlineCode",{parentName:"p"},"--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 which was published in 2020. Content encoding using zstd is supported since Chromium 118 behind an experimental flag, meaning it might compete with ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/brotli"},"Brotli")," on the web in the future. Apple's LZFSE algorithm is purportedly similar to Zstandard compression level 6."),(0,n.kt)("p",null,"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,n.kt)("inlineCode",{parentName:"p"},".tar.zst")," could replace 7-zip, ZIP, or other archiving formats, making speedy decode a reality on systems featuring varying levels of compute horsepower."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/68409bcb.7142152b.js b/assets/js/68409bcb.7142152b.js deleted file mode 100644 index b08c0fb53..000000000 --- a/assets/js/68409bcb.7142152b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6976],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),d=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=d(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=d(r),f=o,m=p["".concat(s,".").concat(f)]||p[f]||l[f]||a;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[p]="string"==typeof e?e:o,i[1]=c;for(var d=2;d{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>c,toc:()=>d});var n=r(7462),o=(r(7294),r(3905));const a={label:"zstd",sidebar_position:7},i="Zstandard",c={unversionedId:"data/zstd",id:"data/zstd",title:"Zstandard",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.md",sourceDirName:"data",slug:"/data/zstd",permalink:"/docs/data/zstd",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zstd.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"zstd",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"ZPAQ",permalink:"/docs/data/zpaq"},next:{title:"JPEG",permalink:"/docs/images/JPEG"}},s={},d=[],u={toc:d},p="wrapper";function l(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"zstandard"},"Zstandard"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/871a984d.02dc7d86.js b/assets/js/871a984d.02dc7d86.js new file mode 100644 index 000000000..8501a337f --- /dev/null +++ b/assets/js/871a984d.02dc7d86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5474],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},l=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),m=c(r),d=a,f=m["".concat(p,".").concat(d)]||m[d]||u[d]||i;return r?n.createElement(f,o(o({ref:t},l),{},{components:r})):n.createElement(f,o({ref:t},l))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=d;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[m]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const i={label:"GIF",sidebar_position:3},o="GIF",s={unversionedId:"images/GIF",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.md",sourceDirName:"images",slug:"/images/GIF",permalink:"/docs/images/GIF",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/GIF.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"GIF",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"PNG",permalink:"/docs/images/PNG"},next:{title:"HEIC",permalink:"/docs/images/HEIC"}},p={},c=[{value:"Performance Checklist",id:"performance-checklist",level:2}],l={toc:c},m="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"gif"},"GIF"),(0,a.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,a.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,a.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,a.kt)("p",null,"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,a.kt)("a",{parentName:"p",href:"/docs/images/AVIF"},"AVIF")," & Animated ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/WebP"},"WebP")," have since surpassed GIF in functionality, as has the animated ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/PNG"},"PNG")," variant APNG."),(0,a.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,a.kt)("p",null,"Lossless? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("p",null,"Lossy? ",(0,a.kt)("em",{parentName:"p"},"No")),(0,a.kt)("p",null,"Supported Bit Depth:\n",(0,a.kt)("em",{parentName:"p"},"256 colors")),(0,a.kt)("p",null,"HDR/Wide Gamut? ",(0,a.kt)("em",{parentName:"p"},"No")),(0,a.kt)("p",null,"Animation? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("p",null,"Transparency? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("p",null,"Progressive Decode? ",(0,a.kt)("em",{parentName:"p"},"No")),(0,a.kt)("p",null,"Royalty Free? ",(0,a.kt)("em",{parentName:"p"},"Yes")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/871a984d.bc691dd3.js b/assets/js/871a984d.bc691dd3.js deleted file mode 100644 index 7f3ef86ac..000000000 --- a/assets/js/871a984d.bc691dd3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5474],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=p(r),d=o,f=u["".concat(c,".").concat(d)]||u[d]||m[d]||i;return r?n.createElement(f,a(a({ref:t},l),{},{components:r})):n.createElement(f,a({ref:t},l))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:o,a[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={label:"GIF",sidebar_position:3},a="GIF",s={unversionedId:"images/GIF",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.md",sourceDirName:"images",slug:"/images/GIF",permalink:"/docs/images/GIF",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/GIF.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"GIF",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"PNG",permalink:"/docs/images/PNG"},next:{title:"HEIC",permalink:"/docs/images/HEIC"}},c={},p=[{value:"Performance Checklist",id:"performance-checklist",level:2}],l={toc:p},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"gif"},"GIF"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("p",null,"Graphics Interchange Format (GIF) is an image file format first releasedby CompuServe in 1987. It remains popular due to it's widespread support for animated images despite it's obsolesence in efficency."),(0,o.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,o.kt)("p",null,"Lossless? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Lossy? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Supported Bit Depth:\n",(0,o.kt)("em",{parentName:"p"},"256 colors")),(0,o.kt)("p",null,"HDR/Wide Gamut? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Animation? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Transparency? ",(0,o.kt)("em",{parentName:"p"},"Yes")),(0,o.kt)("p",null,"Progressive Decode? ",(0,o.kt)("em",{parentName:"p"},"No")),(0,o.kt)("p",null,"Royalty Free? ",(0,o.kt)("em",{parentName:"p"},"Yes")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.b07daa0b.js b/assets/js/935f2afb.44ec4c5e.js similarity index 67% rename from assets/js/935f2afb.b07daa0b.js rename to assets/js/935f2afb.44ec4c5e.js index 299a065e3..00d3c87a5 100644 --- a/assets/js/935f2afb.b07daa0b.js +++ b/assets/js/935f2afb.44ec4c5e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"\ud83d\udca1 Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Prologue","href":"/docs/introduction/prologue","docId":"introduction/prologue"},{"type":"link","label":"Terminology","href":"/docs/introduction/terminology","docId":"introduction/terminology"},{"type":"link","label":"Spotting Video Artifacts","href":"/docs/introduction/video-artifacts","docId":"introduction/video-artifacts"},{"type":"link","label":"Psycho-visual","href":"/docs/introduction/psychovisual","docId":"introduction/psychovisual"},{"type":"link","label":"High Dynamic Range","href":"/docs/introduction/high-dynamic-range","docId":"introduction/high-dynamic-range"}]},{"type":"category","label":"\ud83d\udd0a Audio","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AAC","href":"/docs/audio/AAC","docId":"audio/AAC"},{"type":"link","label":"Opus","href":"/docs/audio/Opus","docId":"audio/Opus"},{"type":"link","label":"Dolby Digital","href":"/docs/audio/Dolby","docId":"audio/Dolby"},{"type":"link","label":"MP3","href":"/docs/audio/MP3","docId":"audio/MP3"},{"type":"link","label":"Vorbis","href":"/docs/audio/Vorbis","docId":"audio/Vorbis"},{"type":"link","label":"Speex","href":"/docs/audio/Speex","docId":"audio/Speex"},{"type":"link","label":"FLAC","href":"/docs/audio/FLAC","docId":"audio/FLAC"},{"type":"link","label":"WavPack","href":"/docs/audio/WavPack","docId":"audio/WavPack"}]},{"type":"category","label":"\ud83d\udcf9\ufe0f Video","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"H.264","href":"/docs/video/AVC","docId":"video/AVC"},{"type":"link","label":"H.265","href":"/docs/video/HEVC","docId":"video/HEVC"},{"type":"link","label":"H.266","href":"/docs/video/VVC","docId":"video/VVC"},{"type":"link","label":"VP8","href":"/docs/video/VP8","docId":"video/VP8"},{"type":"link","label":"VP9","href":"/docs/video/VP9","docId":"video/VP9"},{"type":"link","label":"AV1","href":"/docs/video/AV1","docId":"video/AV1"},{"type":"link","label":"AVS3","href":"/docs/video/AVS3","docId":"video/AVS3"},{"type":"link","label":"VC-1","href":"/docs/video/VC-1","docId":"video/VC-1"},{"type":"link","label":"Theora","href":"/docs/video/Theora","docId":"video/Theora"},{"type":"link","label":"FFV1","href":"/docs/video/FFV1","docId":"video/FFV1"},{"type":"link","label":"UT Video Codec Suite","href":"/docs/video/utvideo","docId":"video/utvideo"},{"type":"link","label":"ProRes","href":"/docs/video/prores","docId":"video/prores"}]},{"type":"category","label":"\ud83d\udcbd Data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ZIP","href":"/docs/data/zip","docId":"data/zip"},{"type":"link","label":"gzip","href":"/docs/data/gzip","docId":"data/gzip"},{"type":"link","label":"bzip2","href":"/docs/data/bzip2","docId":"data/bzip2"},{"type":"link","label":"7-zip (7z)","href":"/docs/data/7z","docId":"data/7z"},{"type":"link","label":"XZ","href":"/docs/data/xz","docId":"data/xz"},{"type":"link","label":"Brotli","href":"/docs/data/brotli","docId":"data/brotli"},{"type":"link","label":"ZPAQ","href":"/docs/data/zpaq","docId":"data/zpaq"},{"type":"link","label":"Zstandard","href":"/docs/data/zstd","docId":"data/zstd"}]},{"type":"category","label":"\ud83c\udfde\ufe0f Images","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JPEG","href":"/docs/images/JPEG","docId":"images/JPEG"},{"type":"link","label":"PNG","href":"/docs/images/PNG","docId":"images/PNG"},{"type":"link","label":"GIF","href":"/docs/images/GIF","docId":"images/GIF"},{"type":"link","label":"HEIC","href":"/docs/images/HEIC","docId":"images/HEIC"},{"type":"link","label":"WebP","href":"/docs/images/WebP","docId":"images/WebP"},{"type":"link","label":"JPEG 2000","href":"/docs/images/JPEG2000","docId":"images/JPEG2000"},{"type":"link","label":"AVIF","href":"/docs/images/AVIF","docId":"images/AVIF"},{"type":"link","label":"JPEG-XL","href":"/docs/images/JXL","docId":"images/JXL"}]},{"type":"category","label":"\ud83d\udcbe Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"x264","href":"/docs/encoders/x264","docId":"encoders/x264"},{"type":"link","label":"x265","href":"/docs/encoders/x265","docId":"encoders/x265"},{"type":"link","label":"aomenc","href":"/docs/encoders/aomenc","docId":"encoders/aomenc"},{"type":"link","label":"vpxenc","href":"/docs/encoders/vpxenc","docId":"encoders/vpxenc"},{"type":"link","label":"SVT-AV1","href":"/docs/encoders/SVT-AV1","docId":"encoders/SVT-AV1"},{"type":"link","label":"rav1e","href":"/docs/encoders/rav1e","docId":"encoders/rav1e"},{"type":"link","label":"Aurora1 AV1","href":"/docs/encoders/Aurora1","docId":"encoders/Aurora1"},{"type":"link","label":"Kvazaar","href":"/docs/encoders/Kvazaar","docId":"encoders/Kvazaar"},{"type":"link","label":"SVT-HEVC","href":"/docs/encoders/SVT-HEVC","docId":"encoders/SVT-HEVC"},{"type":"link","label":"SVT-VP9","href":"/docs/encoders/SVT-VP9","docId":"encoders/SVT-VP9"},{"type":"link","label":"VVenC","href":"/docs/encoders/VVenC","docId":"encoders/VVenC"},{"type":"link","label":"uvg266","href":"/docs/encoders/uvg266","docId":"encoders/uvg266"},{"type":"link","label":"VTM","href":"/docs/encoders/VTM","docId":"encoders/VTM"},{"type":"link","label":"AVM","href":"/docs/encoders/AVM","docId":"encoders/AVM"},{"type":"link","label":"HM","href":"/docs/encoders/HM","docId":"encoders/HM"},{"type":"link","label":"JM","href":"/docs/encoders/JM","docId":"encoders/JM"}]},{"type":"category","label":"\ud83d\udcac Subtitles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"SRT","href":"/docs/subtitles/SRT","docId":"subtitles/SRT"},{"type":"link","label":"WebVTT","href":"/docs/subtitles/webvtt","docId":"subtitles/webvtt"}]},{"type":"category","label":"\ud83c\udf9e\ufe0f Filtering","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/filtering/intro","docId":"filtering/intro"},{"type":"link","label":"Deband","href":"/docs/filtering/deband","docId":"filtering/deband"},{"type":"link","label":"Vapoursynth","href":"/docs/filtering/vapoursynth","docId":"filtering/vapoursynth"},{"type":"link","label":"Deinterlace","href":"/docs/filtering/deinterlace","docId":"filtering/deinterlace"},{"type":"link","label":"Denoise","href":"/docs/filtering/denoise","docId":"filtering/denoise"},{"type":"link","label":"Detelecine / Inverse Telecine","href":"/docs/filtering/detelecine","docId":"filtering/detelecine"},{"type":"link","label":"Dehalo","href":"/docs/filtering/dehalo","docId":"filtering/dehalo"}]},{"type":"category","label":"\ud83d\udee0\ufe0f Utilities","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aviator","href":"/docs/utilities/Aviator","docId":"utilities/Aviator"},{"type":"link","label":"Av1an","href":"/docs/utilities/av1an","docId":"utilities/av1an"},{"type":"link","label":"MKVToolNix","href":"/docs/utilities/MKVToolNix","docId":"utilities/MKVToolNix"},{"type":"link","label":"rAV1ator","href":"/docs/utilities/rAV1ator","docId":"utilities/rAV1ator"},{"type":"link","label":"FFMetrics","href":"/docs/utilities/FFMetrics","docId":"utilities/FFMetrics"},{"type":"link","label":"YUView","href":"/docs/utilities/YUView","docId":"utilities/YUView"},{"type":"link","label":"rAV1ator CLI","href":"/docs/utilities/rav1ator-cli","docId":"utilities/rav1ator-cli"},{"type":"link","label":"NMKODER","href":"/docs/utilities/nmkoder","docId":"utilities/nmkoder"},{"type":"link","label":"dovi_tool","href":"/docs/utilities/dovi_tool","docId":"utilities/dovi_tool"},{"type":"link","label":"mp4box","href":"/docs/utilities/mp4box","docId":"utilities/mp4box"},{"type":"link","label":"hdr10plus_tool","href":"/docs/utilities/hdr10plus_tool","docId":"utilities/hdr10plus_tool"},{"type":"link","label":"eac3to","href":"/docs/utilities/eac3to","docId":"utilities/eac3to"},{"type":"link","label":"FFmpeg","href":"/docs/utilities/ffmpeg","docId":"utilities/ffmpeg"}]},{"type":"category","label":"\ud83d\udc41\ufe0f Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PSNR","href":"/docs/metrics/PSNR","docId":"metrics/PSNR"},{"type":"link","label":"SSIM","href":"/docs/metrics/SSIM","docId":"metrics/SSIM"},{"type":"link","label":"SSIMULACRA2","href":"/docs/metrics/SSIMULACRA2","docId":"metrics/SSIMULACRA2"},{"type":"link","label":"VMAF","href":"/docs/metrics/VMAF","docId":"metrics/VMAF"},{"type":"link","label":"Butteraugli","href":"/docs/metrics/butteraugli","docId":"metrics/butteraugli"}]},{"type":"link","label":"\u25b6\ufe0f Video Players","href":"/docs/video-players","docId":"video-players"},{"type":"link","label":"\ud83d\uddc3\ufe0f Resources","href":"/docs/resources","docId":"resources"},{"type":"link","label":"\u2712\ufe0f Contribution Guide","href":"/docs/contribution-guide","docId":"contribution-guide"},{"type":"link","label":"\u2753 FAQ","href":"/docs/FAQ","docId":"FAQ"},{"type":"link","label":"\ud83d\udd0f Privacy Policy","href":"/docs/privacy-policy","docId":"privacy-policy"},{"type":"link","label":"\ud83e\udd1d Terms of Use","href":"/docs/terms-of-use","docId":"terms-of-use"}]},"docs":{"audio/AAC":{"id":"audio/AAC","title":"AAC","description":"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:","sidebar":"tutorialSidebar"},"audio/Dolby":{"id":"audio/Dolby","title":"Dolby Digital","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/FLAC":{"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!","sidebar":"tutorialSidebar"},"audio/MP3":{"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!","sidebar":"tutorialSidebar"},"audio/Opus":{"id":"audio/Opus","title":"Opus","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/Speex":{"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!","sidebar":"tutorialSidebar"},"audio/Vorbis":{"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!","sidebar":"tutorialSidebar"},"audio/WavPack":{"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!","sidebar":"tutorialSidebar"},"contribution-guide":{"id":"contribution-guide","title":"Contribution Guide","description":"Codec Wiki - community-maintained wiki for all things encoding.","sidebar":"tutorialSidebar"},"data/7z":{"id":"data/7z","title":"7-zip (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!","sidebar":"tutorialSidebar"},"data/brotli":{"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!","sidebar":"tutorialSidebar"},"data/bzip2":{"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!","sidebar":"tutorialSidebar"},"data/gzip":{"id":"data/gzip","title":"gzip","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!","sidebar":"tutorialSidebar"},"data/xz":{"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!","sidebar":"tutorialSidebar"},"data/zip":{"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.","sidebar":"tutorialSidebar"},"data/zpaq":{"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!","sidebar":"tutorialSidebar"},"data/zstd":{"id":"data/zstd","title":"Zstandard","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!","sidebar":"tutorialSidebar"},"encoders/aomenc":{"id":"encoders/aomenc","title":"aomenc","description":"aomenc or 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.","sidebar":"tutorialSidebar"},"encoders/Aurora1":{"id":"encoders/Aurora1","title":"Aurora1 AV1","description":"Aurora1 AV1 is a proprietary software AV1 encoder developed by Visionular. Not much is known about this encoder other than rumors that it is supposedly \\"better\\" than public, FOSS encoders. With some pretty dubious claims and proof provided by the company themselves.","sidebar":"tutorialSidebar"},"encoders/AVM":{"id":"encoders/AVM","title":"AVM","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!","sidebar":"tutorialSidebar"},"encoders/HM":{"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.","sidebar":"tutorialSidebar"},"encoders/JM":{"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!","sidebar":"tutorialSidebar"},"encoders/Kvazaar":{"id":"encoders/Kvazaar","title":"Kvazaar","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!","sidebar":"tutorialSidebar"},"encoders/rav1e":{"id":"encoders/rav1e","title":"rav1e","description":"rav1e is a command line application for encoding AV1 written in Rust & Assembly co-developed by Xiph.org and Mozilla.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1":{"id":"encoders/SVT-AV1","title":"SVT-AV1","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/SVT-HEVC":{"id":"encoders/SVT-HEVC","title":"SVT-HEVC","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!","sidebar":"tutorialSidebar"},"encoders/SVT-VP9":{"id":"encoders/SVT-VP9","title":"SVT-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!","sidebar":"tutorialSidebar"},"encoders/uvg266":{"id":"encoders/uvg266","title":"uvg266","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!","sidebar":"tutorialSidebar"},"encoders/vpxenc":{"id":"encoders/vpxenc","title":"vpxenc","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/VTM":{"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!","sidebar":"tutorialSidebar"},"encoders/VVenC":{"id":"encoders/VVenC","title":"VVenC","description":"{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"\ud83d\udca1 Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Prologue","href":"/docs/introduction/prologue","docId":"introduction/prologue"},{"type":"link","label":"Terminology","href":"/docs/introduction/terminology","docId":"introduction/terminology"},{"type":"link","label":"Spotting Video Artifacts","href":"/docs/introduction/video-artifacts","docId":"introduction/video-artifacts"},{"type":"link","label":"Psycho-visual","href":"/docs/introduction/psychovisual","docId":"introduction/psychovisual"},{"type":"link","label":"High Dynamic Range","href":"/docs/introduction/high-dynamic-range","docId":"introduction/high-dynamic-range"}]},{"type":"category","label":"\ud83d\udd0a Audio","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AAC","href":"/docs/audio/AAC","docId":"audio/AAC"},{"type":"link","label":"Opus","href":"/docs/audio/Opus","docId":"audio/Opus"},{"type":"link","label":"Dolby Digital","href":"/docs/audio/Dolby","docId":"audio/Dolby"},{"type":"link","label":"MP3","href":"/docs/audio/MP3","docId":"audio/MP3"},{"type":"link","label":"Vorbis","href":"/docs/audio/Vorbis","docId":"audio/Vorbis"},{"type":"link","label":"Speex","href":"/docs/audio/Speex","docId":"audio/Speex"},{"type":"link","label":"FLAC","href":"/docs/audio/FLAC","docId":"audio/FLAC"},{"type":"link","label":"WavPack","href":"/docs/audio/WavPack","docId":"audio/WavPack"}]},{"type":"category","label":"\ud83d\udcf9\ufe0f Video","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"H.264","href":"/docs/video/AVC","docId":"video/AVC"},{"type":"link","label":"H.265","href":"/docs/video/HEVC","docId":"video/HEVC"},{"type":"link","label":"H.266","href":"/docs/video/VVC","docId":"video/VVC"},{"type":"link","label":"VP8","href":"/docs/video/VP8","docId":"video/VP8"},{"type":"link","label":"VP9","href":"/docs/video/VP9","docId":"video/VP9"},{"type":"link","label":"AV1","href":"/docs/video/AV1","docId":"video/AV1"},{"type":"link","label":"AVS3","href":"/docs/video/AVS3","docId":"video/AVS3"},{"type":"link","label":"VC-1","href":"/docs/video/VC-1","docId":"video/VC-1"},{"type":"link","label":"Theora","href":"/docs/video/Theora","docId":"video/Theora"},{"type":"link","label":"FFV1","href":"/docs/video/FFV1","docId":"video/FFV1"},{"type":"link","label":"UT Video Codec Suite","href":"/docs/video/utvideo","docId":"video/utvideo"},{"type":"link","label":"ProRes","href":"/docs/video/prores","docId":"video/prores"}]},{"type":"category","label":"\ud83d\udcbd Data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ZIP","href":"/docs/data/zip","docId":"data/zip"},{"type":"link","label":"gzip","href":"/docs/data/gzip","docId":"data/gzip"},{"type":"link","label":"bzip2","href":"/docs/data/bzip2","docId":"data/bzip2"},{"type":"link","label":"7-zip (7z)","href":"/docs/data/7z","docId":"data/7z"},{"type":"link","label":"XZ","href":"/docs/data/xz","docId":"data/xz"},{"type":"link","label":"Brotli","href":"/docs/data/brotli","docId":"data/brotli"},{"type":"link","label":"ZPAQ","href":"/docs/data/zpaq","docId":"data/zpaq"},{"type":"link","label":"Zstandard","href":"/docs/data/zstd","docId":"data/zstd"}]},{"type":"category","label":"\ud83c\udfde\ufe0f Images","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JPEG","href":"/docs/images/JPEG","docId":"images/JPEG"},{"type":"link","label":"PNG","href":"/docs/images/PNG","docId":"images/PNG"},{"type":"link","label":"GIF","href":"/docs/images/GIF","docId":"images/GIF"},{"type":"link","label":"HEIC","href":"/docs/images/HEIC","docId":"images/HEIC"},{"type":"link","label":"WebP","href":"/docs/images/WebP","docId":"images/WebP"},{"type":"link","label":"JPEG 2000","href":"/docs/images/JPEG2000","docId":"images/JPEG2000"},{"type":"link","label":"AVIF","href":"/docs/images/AVIF","docId":"images/AVIF"},{"type":"link","label":"JPEG-XL","href":"/docs/images/JXL","docId":"images/JXL"}]},{"type":"category","label":"\ud83d\udcbe Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"x264","href":"/docs/encoders/x264","docId":"encoders/x264"},{"type":"link","label":"x265","href":"/docs/encoders/x265","docId":"encoders/x265"},{"type":"link","label":"aomenc","href":"/docs/encoders/aomenc","docId":"encoders/aomenc"},{"type":"link","label":"vpxenc","href":"/docs/encoders/vpxenc","docId":"encoders/vpxenc"},{"type":"link","label":"SVT-AV1","href":"/docs/encoders/SVT-AV1","docId":"encoders/SVT-AV1"},{"type":"link","label":"rav1e","href":"/docs/encoders/rav1e","docId":"encoders/rav1e"},{"type":"link","label":"Aurora1 AV1","href":"/docs/encoders/Aurora1","docId":"encoders/Aurora1"},{"type":"link","label":"Kvazaar","href":"/docs/encoders/Kvazaar","docId":"encoders/Kvazaar"},{"type":"link","label":"SVT-HEVC","href":"/docs/encoders/SVT-HEVC","docId":"encoders/SVT-HEVC"},{"type":"link","label":"SVT-VP9","href":"/docs/encoders/SVT-VP9","docId":"encoders/SVT-VP9"},{"type":"link","label":"VVenC","href":"/docs/encoders/VVenC","docId":"encoders/VVenC"},{"type":"link","label":"uvg266","href":"/docs/encoders/uvg266","docId":"encoders/uvg266"},{"type":"link","label":"VTM","href":"/docs/encoders/VTM","docId":"encoders/VTM"},{"type":"link","label":"AVM","href":"/docs/encoders/AVM","docId":"encoders/AVM"},{"type":"link","label":"HM","href":"/docs/encoders/HM","docId":"encoders/HM"},{"type":"link","label":"JM","href":"/docs/encoders/JM","docId":"encoders/JM"}]},{"type":"category","label":"\ud83d\udcac Subtitles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"SRT","href":"/docs/subtitles/SRT","docId":"subtitles/SRT"},{"type":"link","label":"WebVTT","href":"/docs/subtitles/webvtt","docId":"subtitles/webvtt"}]},{"type":"category","label":"\ud83c\udf9e\ufe0f Filtering","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/filtering/intro","docId":"filtering/intro"},{"type":"link","label":"Deband","href":"/docs/filtering/deband","docId":"filtering/deband"},{"type":"link","label":"Vapoursynth","href":"/docs/filtering/vapoursynth","docId":"filtering/vapoursynth"},{"type":"link","label":"Deinterlace","href":"/docs/filtering/deinterlace","docId":"filtering/deinterlace"},{"type":"link","label":"Denoise","href":"/docs/filtering/denoise","docId":"filtering/denoise"},{"type":"link","label":"Detelecine / Inverse Telecine","href":"/docs/filtering/detelecine","docId":"filtering/detelecine"},{"type":"link","label":"Dehalo","href":"/docs/filtering/dehalo","docId":"filtering/dehalo"}]},{"type":"category","label":"\ud83d\udee0\ufe0f Utilities","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aviator","href":"/docs/utilities/Aviator","docId":"utilities/Aviator"},{"type":"link","label":"Av1an","href":"/docs/utilities/av1an","docId":"utilities/av1an"},{"type":"link","label":"MKVToolNix","href":"/docs/utilities/MKVToolNix","docId":"utilities/MKVToolNix"},{"type":"link","label":"rAV1ator","href":"/docs/utilities/rAV1ator","docId":"utilities/rAV1ator"},{"type":"link","label":"FFMetrics","href":"/docs/utilities/FFMetrics","docId":"utilities/FFMetrics"},{"type":"link","label":"YUView","href":"/docs/utilities/YUView","docId":"utilities/YUView"},{"type":"link","label":"rAV1ator CLI","href":"/docs/utilities/rav1ator-cli","docId":"utilities/rav1ator-cli"},{"type":"link","label":"NMKODER","href":"/docs/utilities/nmkoder","docId":"utilities/nmkoder"},{"type":"link","label":"dovi_tool","href":"/docs/utilities/dovi_tool","docId":"utilities/dovi_tool"},{"type":"link","label":"mp4box","href":"/docs/utilities/mp4box","docId":"utilities/mp4box"},{"type":"link","label":"hdr10plus_tool","href":"/docs/utilities/hdr10plus_tool","docId":"utilities/hdr10plus_tool"},{"type":"link","label":"eac3to","href":"/docs/utilities/eac3to","docId":"utilities/eac3to"},{"type":"link","label":"FFmpeg","href":"/docs/utilities/ffmpeg","docId":"utilities/ffmpeg"}]},{"type":"category","label":"\ud83d\udc41\ufe0f Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PSNR","href":"/docs/metrics/PSNR","docId":"metrics/PSNR"},{"type":"link","label":"SSIM","href":"/docs/metrics/SSIM","docId":"metrics/SSIM"},{"type":"link","label":"SSIMULACRA2","href":"/docs/metrics/SSIMULACRA2","docId":"metrics/SSIMULACRA2"},{"type":"link","label":"VMAF","href":"/docs/metrics/VMAF","docId":"metrics/VMAF"},{"type":"link","label":"Butteraugli","href":"/docs/metrics/butteraugli","docId":"metrics/butteraugli"}]},{"type":"link","label":"\u25b6\ufe0f Video Players","href":"/docs/video-players","docId":"video-players"},{"type":"link","label":"\ud83d\uddc3\ufe0f Resources","href":"/docs/resources","docId":"resources"},{"type":"link","label":"\u2712\ufe0f Contribution Guide","href":"/docs/contribution-guide","docId":"contribution-guide"},{"type":"link","label":"\u2753 FAQ","href":"/docs/FAQ","docId":"FAQ"},{"type":"link","label":"\ud83d\udd0f Privacy Policy","href":"/docs/privacy-policy","docId":"privacy-policy"},{"type":"link","label":"\ud83e\udd1d Terms of Use","href":"/docs/terms-of-use","docId":"terms-of-use"}]},"docs":{"audio/AAC":{"id":"audio/AAC","title":"AAC","description":"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:","sidebar":"tutorialSidebar"},"audio/Dolby":{"id":"audio/Dolby","title":"Dolby Digital","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/FLAC":{"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!","sidebar":"tutorialSidebar"},"audio/MP3":{"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!","sidebar":"tutorialSidebar"},"audio/Opus":{"id":"audio/Opus","title":"Opus","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/Speex":{"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!","sidebar":"tutorialSidebar"},"audio/Vorbis":{"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!","sidebar":"tutorialSidebar"},"audio/WavPack":{"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!","sidebar":"tutorialSidebar"},"contribution-guide":{"id":"contribution-guide","title":"Contribution Guide","description":"Codec Wiki - community-maintained wiki for all things encoding.","sidebar":"tutorialSidebar"},"data/7z":{"id":"data/7z","title":"7-zip (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!","sidebar":"tutorialSidebar"},"data/brotli":{"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!","sidebar":"tutorialSidebar"},"data/bzip2":{"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!","sidebar":"tutorialSidebar"},"data/gzip":{"id":"data/gzip","title":"gzip","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!","sidebar":"tutorialSidebar"},"data/xz":{"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!","sidebar":"tutorialSidebar"},"data/zip":{"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.","sidebar":"tutorialSidebar"},"data/zpaq":{"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!","sidebar":"tutorialSidebar"},"data/zstd":{"id":"data/zstd","title":"Zstandard","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!","sidebar":"tutorialSidebar"},"encoders/aomenc":{"id":"encoders/aomenc","title":"aomenc","description":"aomenc or 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.","sidebar":"tutorialSidebar"},"encoders/Aurora1":{"id":"encoders/Aurora1","title":"Aurora1 AV1","description":"Aurora1 AV1 is a proprietary software AV1 encoder developed by Visionular. Not much is known about this encoder other than rumors that it is supposedly \\"better\\" than public, FOSS encoders. With some pretty dubious claims and proof provided by the company themselves.","sidebar":"tutorialSidebar"},"encoders/AVM":{"id":"encoders/AVM","title":"AVM","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!","sidebar":"tutorialSidebar"},"encoders/HM":{"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.","sidebar":"tutorialSidebar"},"encoders/JM":{"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!","sidebar":"tutorialSidebar"},"encoders/Kvazaar":{"id":"encoders/Kvazaar","title":"Kvazaar","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!","sidebar":"tutorialSidebar"},"encoders/rav1e":{"id":"encoders/rav1e","title":"rav1e","description":"rav1e is a command line application for encoding AV1 written in Rust & Assembly co-developed by Xiph.org and Mozilla.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1":{"id":"encoders/SVT-AV1","title":"SVT-AV1","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/SVT-HEVC":{"id":"encoders/SVT-HEVC","title":"SVT-HEVC","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!","sidebar":"tutorialSidebar"},"encoders/SVT-VP9":{"id":"encoders/SVT-VP9","title":"SVT-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!","sidebar":"tutorialSidebar"},"encoders/uvg266":{"id":"encoders/uvg266","title":"uvg266","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!","sidebar":"tutorialSidebar"},"encoders/vpxenc":{"id":"encoders/vpxenc","title":"vpxenc","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/VTM":{"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!","sidebar":"tutorialSidebar"},"encoders/VVenC":{"id":"encoders/VVenC","title":"VVenC","description":"{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),l=s(r),f=o,b=l["".concat(p,".").concat(f)]||l[f]||d[f]||i;return r?n.createElement(b,a(a({ref:t},u),{},{components:r})):n.createElement(b,a({ref:t},u))}));function b(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=f;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[l]="string"==typeof e?e:o,a[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const i={label:"gzip",sidebar_position:2},a="gzip",c={unversionedId:"data/gzip",id:"data/gzip",title:"gzip",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/gzip.md",sourceDirName:"data",slug:"/data/gzip",permalink:"/docs/data/gzip",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/gzip.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"gzip",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"ZIP",permalink:"/docs/data/zip"},next:{title:"bzip2",permalink:"/docs/data/bzip2"}},p={},s=[],u={toc:s},l="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(l,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"gzip"},"gzip"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/abb705c2.e0f08909.js b/assets/js/abb705c2.e0f08909.js new file mode 100644 index 000000000..91352acab --- /dev/null +++ b/assets/js/abb705c2.e0f08909.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1586],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>u});var i=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=i.createContext({}),p=function(e){var t=i.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},c=function(e){var t=p(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},f=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(a),f=n,u=d["".concat(l,".").concat(f)]||d[f]||m[f]||o;return a?i.createElement(u,r(r({ref:t},c),{},{components:a})):i.createElement(u,r({ref:t},c))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,r=new Array(o);r[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:n,r[1]=s;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var i=a(7462),n=(a(7294),a(3905));const o={label:"gzip",sidebar_position:2},r="gzip",s={unversionedId:"data/gzip",id:"data/gzip",title:"gzip",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/gzip.md",sourceDirName:"data",slug:"/data/gzip",permalink:"/docs/data/gzip",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/gzip.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"gzip",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"ZIP",permalink:"/docs/data/zip"},next:{title:"bzip2",permalink:"/docs/data/bzip2"}},l={},p=[{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}],c={toc:p},d="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,i.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"gzip"},"gzip"),(0,n.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,n.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,n.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,n.kt)("h2",{id:"format-breakdown"},"Format Breakdown"),(0,n.kt)("p",null,"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.kt)("inlineCode",{parentName:"p"},"tar")," to create ",(0,n.kt)("inlineCode",{parentName:"p"},".tar.gz")," archives. Formats like ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/zip"},"ZIP")," & ",(0,n.kt)("a",{parentName:"p",href:"/docs/images/PNG"},"PNG")," also use Deflate to different effects."),(0,n.kt)("p",null,"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."),(0,n.kt)("h2",{id:"history"},"History"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation PKZIP was shareware."),(0,n.kt)("p",null,"A ",(0,n.kt)("a",{parentName:"p",href:"http://www.digitalpreservation.gov/formats/fdd/fdd000361.shtml"},"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."),(0,n.kt)("p",null,'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.kt)("a",{parentName:"p",href:"https://infozip.sourceforge.net/"},"https://infozip.sourceforge.net/"),"). They did this successfully, leading to increased adoption of the ZIP format."),(0,n.kt)("p",null,"In the early 1990s the ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/gzip"},"gzip")," format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix ",(0,n.kt)("inlineCode",{parentName:"p"},"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."),(0,n.kt)("p",null,"As a ",(0,n.kt)("inlineCode",{parentName:"p"},"compress")," replacement, the Unix gzip utility can decompress data that was compressed using ",(0,n.kt)("inlineCode",{parentName:"p"},"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."),(0,n.kt)("p",null,"The popular ",(0,n.kt)("inlineCode",{parentName:"p"},"tar")," utility, which creates an archive of files, has an option to compress directly to the ",(0,n.kt)("inlineCode",{parentName:"p"},".tar.gz")," format and is a very popular use caze for gzip. Since the compression of a ",(0,n.kt)("inlineCode",{parentName:"p"},".tar")," can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. ",(0,n.kt)("inlineCode",{parentName:"p"},".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.kt)("a",{parentName:"p",href:"/docs/data/xz"},"XZ"),", ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/bzip2"},"bzip2"),", ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/brotli"},"brotli"),", ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/7z"},"7-zip"),", & ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/zstd"},"Zstandard"),"."),(0,n.kt)("h2",{id:"encoding"},"Encoding"),(0,n.kt)("h3",{id:"linux--macos"},"Linux & macOS"),(0,n.kt)("p",null,"Chances are, you have gzip already available on your system. You can encode gzip archives using the ",(0,n.kt)("inlineCode",{parentName:"p"},"gzip")," command."),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Open a terminal window.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Navigate to the directory where you want to create the gzip archive.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Use the ",(0,n.kt)("inlineCode",{parentName:"p"},"gzip")," command followed by the name of the file you want to compress. For example:"))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"gzip -7 myfile.txt\n")),(0,n.kt)("p",null,"This will create a compressed file called ",(0,n.kt)("inlineCode",{parentName:"p"},"myfile.txt.gz")," in the current directory using compression level 7. Compression levels span from 1 through 9 (",(0,n.kt)("inlineCode",{parentName:"p"},"-1 .. -9"),"; shortcuts are ",(0,n.kt)("inlineCode",{parentName:"p"},"--fast")," for ",(0,n.kt)("inlineCode",{parentName:"p"},"-1"),", ",(0,n.kt)("inlineCode",{parentName:"p"},"--best")," for ",(0,n.kt)("inlineCode",{parentName:"p"},"-9"),")."),(0,n.kt)("ol",{start:4},(0,n.kt)("li",{parentName:"ol"},"If you want to compress multiple files at once, you can use the ",(0,n.kt)("inlineCode",{parentName:"li"},"-a")," option followed by the names of the files you want to compress. For example:")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"gzip -a myfile1.txt myfile2.txt\n")),(0,n.kt)("p",null,"This will create compressed files called ",(0,n.kt)("inlineCode",{parentName:"p"},"myfile1.txt.gz")," & ",(0,n.kt)("inlineCode",{parentName:"p"},"myfile2.txt.gz")," in the current directory."),(0,n.kt)("ol",{start:5},(0,n.kt)("li",{parentName:"ol"},"If you want to compress a directory and all its contents, you can use the ",(0,n.kt)("inlineCode",{parentName:"li"},"-r")," option followed by the name of the directory. For example:")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"gzip -r mydirectory/\n")),(0,n.kt)("p",null,"This will create compressed versions of each file in the specified directory."),(0,n.kt)("ol",{start:6},(0,n.kt)("li",{parentName:"ol"},"If you want to encode the gzip archive with a different extension, you can use the ",(0,n.kt)("inlineCode",{parentName:"li"},"-S")," option followed by the suffix ",(0,n.kt)("inlineCode",{parentName:"li"},".suf"),". For example:")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"gzip -S .suf myfile.txt\n")),(0,n.kt)("p",null,"This will create a gzip-compressed file called ",(0,n.kt)("inlineCode",{parentName:"p"},"myfile.txt.suf")," in the current directory."),(0,n.kt)("p",null,"Also, you can use other options like ",(0,n.kt)("inlineCode",{parentName:"p"},"-v")," for verbose mode, ",(0,n.kt)("inlineCode",{parentName:"p"},"-f")," to force overwriting & compress links, ",(0,n.kt)("inlineCode",{parentName:"p"},"-l")," for listing the files and ",(0,n.kt)("inlineCode",{parentName:"p"},"-d")," for decompressing the files."),(0,n.kt)("p",null,"You can find more information about the ",(0,n.kt)("inlineCode",{parentName:"p"},"gzip")," command & its options by running ",(0,n.kt)("inlineCode",{parentName:"p"},"man gzip")," in a terminal."),(0,n.kt)("h3",{id:"windows"},"Windows"),(0,n.kt)("p",null,"To be filled."),(0,n.kt)("p",null,(0,n.kt)("em",{parentName:"p"},"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.kt)("a",{parentName:"em",href:"https://stackoverflow.com/questions/20762094/how-are-zlib-gzip-and-zip-related-what-do-they-have-in-common-and-how-are-they"},"this StackOverflow answer"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d2946d3d.3b054cb8.js b/assets/js/d2946d3d.12977300.js similarity index 56% rename from assets/js/d2946d3d.3b054cb8.js rename to assets/js/d2946d3d.12977300.js index 0fa1717dd..ab3f11dc7 100644 --- a/assets/js/d2946d3d.3b054cb8.js +++ b/assets/js/d2946d3d.12977300.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2875],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var o=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function n(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=o.createContext({}),l=function(e){var t=o.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):n(n({},t),e)),r},c=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,p=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=l(r),m=i,f=u["".concat(p,".").concat(m)]||u[m]||d[m]||a;return r?o.createElement(f,n(n({ref:t},c),{},{components:r})):o.createElement(f,n({ref:t},c))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,n=new Array(a);n[0]=m;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:i,n[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>n,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=r(7462),i=(r(7294),r(3905));const a={label:"7z",sidebar_position:4},n="7-zip (7z)",s={unversionedId:"data/7z",id:"data/7z",title:"7-zip (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.md",sourceDirName:"data",slug:"/data/7z",permalink:"/docs/data/7z",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/7z.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"7z",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"bzip2",permalink:"/docs/data/bzip2"},next:{title:"XZ",permalink:"/docs/data/xz"}},p={},l=[],c={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,i.kt)(u,(0,o.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"7-zip-7z"},"7-zip (7z)"),(0,i.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,i.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,i.kt)("p",null,"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,i.kt)("a",{parentName:"p",href:"/docs/data/xz"},"XZ"),"."),(0,i.kt)("p",null,"The 7-zip format has some noteworthy advantages over the popular ",(0,i.kt)("a",{parentName:"p",href:"/docs/data/zip"},"ZIP")," format."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},'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.'),(0,i.kt)("li",{parentName:"ul"},"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."),(0,i.kt)("li",{parentName:"ul"},"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.")),(0,i.kt)("p",null,"However, 7-zip also has some drawbacks and limitations."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"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 files45."),(0,i.kt)("li",{parentName:"ul"},"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."),(0,i.kt)("li",{parentName:"ul"},"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")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2875],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var i=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function n(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=i.createContext({}),l=function(e){var t=i.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):n(n({},t),e)),r},c=function(e){var t=l(e.components);return i.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=l(r),m=o,f=u["".concat(p,".").concat(m)]||u[m]||d[m]||a;return r?i.createElement(f,n(n({ref:t},c),{},{components:r})):i.createElement(f,n({ref:t},c))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,n=new Array(a);n[0]=m;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:o,n[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>n,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var i=r(7462),o=(r(7294),r(3905));const a={label:"7z",sidebar_position:4},n="7-zip (7z)",s={unversionedId:"data/7z",id:"data/7z",title:"7-zip (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.md",sourceDirName:"data",slug:"/data/7z",permalink:"/docs/data/7z",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/7z.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"7z",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"bzip2",permalink:"/docs/data/bzip2"},next:{title:"XZ",permalink:"/docs/data/xz"}},p={},l=[],c={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,i.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"7-zip-7z"},"7-zip (7z)"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("p",null,"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,o.kt)("a",{parentName:"p",href:"/docs/data/xz"},"XZ"),"."),(0,o.kt)("p",null,"The 7-zip format has some noteworthy advantages over the popular ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/zip"},"ZIP")," format."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},'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.'),(0,o.kt)("li",{parentName:"ul"},"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."),(0,o.kt)("li",{parentName:"ul"},"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.")),(0,o.kt)("p",null,"However, 7-zip also has some drawbacks and limitations."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"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 files45."),(0,o.kt)("li",{parentName:"ul"},"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."),(0,o.kt)("li",{parentName:"ul"},"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")),(0,o.kt)("p",null,"7z archives are supported natively by macOS & many Linux distributions."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ddf1125a.236bb914.js b/assets/js/ddf1125a.236bb914.js new file mode 100644 index 000000000..14ae8a7e7 --- /dev/null +++ b/assets/js/ddf1125a.236bb914.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3586],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>f});var i=a(7294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function r(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=i.createContext({}),d=function(e){var t=i.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},p=function(e){var t=d(e.components);return i.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var a=e.components,o=e.mdxType,n=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=d(a),h=o,f=c["".concat(l,".").concat(h)]||c[h]||m[h]||n;return a?i.createElement(f,r(r({ref:t},p),{},{components:a})):i.createElement(f,r({ref:t},p))}));function f(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=a.length,r=new Array(n);r[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:o,r[1]=s;for(var d=2;d{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>n,metadata:()=>s,toc:()=>d});var i=a(7462),o=(a(7294),a(3905));const n={label:"ZIP",sidebar_position:1},r="ZIP",s={unversionedId:"data/zip",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.md",sourceDirName:"data",slug:"/data/zip",permalink:"/docs/data/zip",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zip.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"ZIP",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"ProRes",permalink:"/docs/video/prores"},next:{title:"gzip",permalink:"/docs/data/gzip"}},l={},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:4},{value:"Windows",id:"windows",level:4},{value:"Conclusion",id:"conclusion",level:2}],p={toc:d},c="wrapper";function m(e){let{components:t,...a}=e;return(0,o.kt)(c,(0,i.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"zip"},"ZIP"),(0,o.kt)("admonition",{title:"Pending Review",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.")),(0,o.kt)("p",null,"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.kt)("a",{parentName:"p",href:"/docs/data/gzip"},"gzip")," & ",(0,o.kt)("a",{parentName:"p",href:"/docs/images/PNG"},"PNG"),"."),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,'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.kt)("a",{parentName:"p",href:"/docs/data/gzip"},"gzip")," and has been succeeded many times by formats & algorithms such as ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/bzip2"},"bzip2"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/xz"},"XZ"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/7z"},"7-zip"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/brotli"},"brotli")," (to a degree), and ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/zstd"},"Zstandard"),"."),(0,o.kt)("h2",{id:"format-breakdown"},"Format Breakdown"),(0,o.kt)("p",null,'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.'),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"ZIP files can also support other compression methods, such as Deflate64(tm), BZIP2, LZMA, & ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/zstd"},"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."),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,'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.kt)("a",{parentName:"p",href:"/docs/data/7z"},"7-zip compression format"),", though the two are related)."),(0,o.kt)("h2",{id:"history"},"History"),(0,o.kt)("p",null,"The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation, PKZIP, was shareware."),(0,o.kt)("p",null,"A ",(0,o.kt)("a",{parentName:"p",href:"http://www.digitalpreservation.gov/formats/fdd/fdd000361.shtml"},"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."),(0,o.kt)("p",null,'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.kt)("a",{parentName:"p",href:"https://infozip.sourceforge.net/"},"https://infozip.sourceforge.net/"),"). They did this successfully, leading to increased adoption of the ZIP format."),(0,o.kt)("p",null,"In the early 1990s the ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/gzip"},"gzip")," format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix ",(0,o.kt)("inlineCode",{parentName:"p"},"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."),(0,o.kt)("p",null,"Unlike ",(0,o.kt)("inlineCode",{parentName:"p"},".tar"),", ",(0,o.kt)("inlineCode",{parentName:"p"},".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.kt)("inlineCode",{parentName:"p"},".zip")," file. A ",(0,o.kt)("inlineCode",{parentName:"p"},".tar")," file would have to be decompressed and scanned from start to end in order to build a directory."),(0,o.kt)("p",null,"The popular ",(0,o.kt)("inlineCode",{parentName:"p"},"tar")," utility, which creates an archive of files, has an option to compress directly to the ",(0,o.kt)("inlineCode",{parentName:"p"},".tar.gz")," format and is a very popular use caze for gzip. Since the compression of a ",(0,o.kt)("inlineCode",{parentName:"p"},".tar")," can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. ",(0,o.kt)("inlineCode",{parentName:"p"},".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.kt)("a",{parentName:"p",href:"/docs/data/xz"},"XZ"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/bzip2"},"bzip2"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/brotli"},"brotli"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/7z"},"7-zip"),", & ",(0,o.kt)("a",{parentName:"p",href:"/docs/data/zstd"},"Zstandard"),"."),(0,o.kt)("p",null,"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.kt)("inlineCode",{parentName:"p"},".zip")," file. A ",(0,o.kt)("inlineCode",{parentName:"p"},".tar")," file would have to be decompressed and scanned from start to end in order to build a directory."),(0,o.kt)("h2",{id:"encoding"},"Encoding"),(0,o.kt)("h4",{id:"linux--macos"},"Linux & macOS"),(0,o.kt)("p",null,'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.kt)("a",{parentName:"p",href:"https://www.7-zip.org/download.html"},"7-zip's Download page"),". Here are some direct download links: ",(0,o.kt)("a",{parentName:"p",href:"https://www.7-zip.org/a/7z2301-linux-x64.tar.xz"},"Linux x86_64")," | ",(0,o.kt)("a",{parentName:"p",href:"https://www.7-zip.org/a/7z2301-mac.tar.xz"},"macOS Universal")),(0,o.kt)("p",null,"Once you've downloaded the utility, remember whether you are choosing to use the ",(0,o.kt)("inlineCode",{parentName:"p"},"7zz")," binary or the static ",(0,o.kt)("inlineCode",{parentName:"p"},"7zzs")," binary. Commands run using ",(0,o.kt)("inlineCode",{parentName:"p"},"7zz")," should run using ",(0,o.kt)("inlineCode",{parentName:"p"},"7zzs")," as well, so please replace ",(0,o.kt)("inlineCode",{parentName:"p"},"7zz")," in our examples as appropriate if you choose not to use it. Additionally, please copy your choice of binary to your ",(0,o.kt)("inlineCode",{parentName:"p"},"/usr/local/bin")," if you want to be able to use it everywhere."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"To encode a ZIP file at the lowest effort setting using one thread:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'7zz a -bso0 -tzip -mmt1 -mx1 "Output.zip" "Input"\n')),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"To encode a ZIP file at the highest effort setting using eight threads:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'7zz a -bso0 -tzip -mmt8 -mx9 "Output.zip" "Input"\n')),(0,o.kt)("h4",{id:"windows"},"Windows"),(0,o.kt)("p",null,"To be filled."),(0,o.kt)("h2",{id:"conclusion"},"Conclusion"),(0,o.kt)("p",null,"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."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ddf1125a.2f6ce9fa.js b/assets/js/ddf1125a.2f6ce9fa.js deleted file mode 100644 index f0e479a52..000000000 --- a/assets/js/ddf1125a.2f6ce9fa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3586],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var o=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=o.createContext({}),d=function(e){var t=o.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},c=function(e){var t=d(e.components);return o.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(a),u=n,h=p["".concat(l,".").concat(u)]||p[u]||m[u]||i;return a?o.createElement(h,r(r({ref:t},c),{},{components:a})):o.createElement(h,r({ref:t},c))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,r=new Array(i);r[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:n,r[1]=s;for(var d=2;d{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var o=a(7462),n=(a(7294),a(3905));const i={label:"ZIP",sidebar_position:1},r="ZIP",s={unversionedId:"data/zip",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.md",sourceDirName:"data",slug:"/data/zip",permalink:"/docs/data/zip",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zip.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"ZIP",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"ProRes",permalink:"/docs/video/prores"},next:{title:"gzip",permalink:"/docs/data/gzip"}},l={},d=[{value:"Format Breakdown",id:"format-breakdown",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}],c={toc:d},p="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,o.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"zip"},"ZIP"),(0,n.kt)("admonition",{title:"Pending Review",type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.")),(0,n.kt)("p",null,"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,n.kt)("a",{parentName:"p",href:"/docs/data/gzip"},"gzip")," & ",(0,n.kt)("a",{parentName:"p",href:"/docs/images/PNG"},"PNG"),"."),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,'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,n.kt)("a",{parentName:"p",href:"/docs/data/gzip"},"gzip")," and has been succeeded many times by formats & algorithms such as ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/bzip2"},"bzip2"),", ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/xz"},"XZ"),", ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/7z"},"7-zip"),", ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/brotli"},"brotli")," (to a degree), and ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/zstd"},"Zstandard"),"."),(0,n.kt)("h2",{id:"format-breakdown"},"Format Breakdown"),(0,n.kt)("p",null,'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.'),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"ZIP files can also support other compression methods, such as Deflate64(tm), BZIP2, LZMA, & ",(0,n.kt)("a",{parentName:"p",href:"/docs/data/zstd"},"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."),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,'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,n.kt)("a",{parentName:"p",href:"/docs/data/7z"},"7-zip compression format"),", though the two are related)."),(0,n.kt)("h2",{id:"encoding"},"Encoding"),(0,n.kt)("h4",{id:"linux--macos"},"Linux & macOS"),(0,n.kt)("p",null,'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,n.kt)("a",{parentName:"p",href:"https://www.7-zip.org/download.html"},"7-zip's Download page"),". Here are some direct download links: ",(0,n.kt)("a",{parentName:"p",href:"https://www.7-zip.org/a/7z2301-linux-x64.tar.xz"},"Linux x86_64")," | ",(0,n.kt)("a",{parentName:"p",href:"https://www.7-zip.org/a/7z2301-mac.tar.xz"},"macOS Universal")),(0,n.kt)("p",null,"Once you've downloaded the utility, remember whether you are choosing to use the ",(0,n.kt)("inlineCode",{parentName:"p"},"7zz")," binary or the static ",(0,n.kt)("inlineCode",{parentName:"p"},"7zzs")," binary. Commands run using ",(0,n.kt)("inlineCode",{parentName:"p"},"7zz")," should run using ",(0,n.kt)("inlineCode",{parentName:"p"},"7zzs")," as well, so please replace ",(0,n.kt)("inlineCode",{parentName:"p"},"7zz")," in our examples as appropriate if you choose not to use it. Additionally, please copy your choice of binary to your ",(0,n.kt)("inlineCode",{parentName:"p"},"/usr/local/bin")," if you want to be able to use it everywhere."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"To encode a ZIP file at the lowest effort setting using one thread:")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'7zz a -bso0 -tzip -mmt1 -mx1 "Output.zip" "Input"\n')),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"To encode a ZIP file at the highest effort setting using eight threads:")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'7zz a -bso0 -tzip -mmt8 -mx9 "Output.zip" "Input"\n')),(0,n.kt)("h4",{id:"windows"},"Windows"),(0,n.kt)("p",null,"To be filled."),(0,n.kt)("h2",{id:"conclusion"},"Conclusion"),(0,n.kt)("p",null,"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."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4173e2a.249f1a0f.js b/assets/js/f4173e2a.249f1a0f.js new file mode 100644 index 000000000..92cff9a83 --- /dev/null +++ b/assets/js/f4173e2a.249f1a0f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5463],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(r),f=o,m=u["".concat(c,".").concat(f)]||u[f]||d[f]||i;return r?n.createElement(m,a(a({ref:t},p),{},{components:r})):n.createElement(m,a({ref:t},p))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:o,a[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const i={label:"zpaq",sidebar_position:7},a="ZPAQ",s={unversionedId:"data/zpaq",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.md",sourceDirName:"data",slug:"/data/zpaq",permalink:"/docs/data/zpaq",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zpaq.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"zpaq",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Brotli",permalink:"/docs/data/brotli"},next:{title:"Zstandard",permalink:"/docs/data/zstd"}},c={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"zpaq"},"ZPAQ"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,o.kt)("p",null,"ZPAQ is a lossless data compression algorithm that combines several techniques to achieve high compression ratios. It was developed by Matt Mahoney."),(0,o.kt)("p",null,'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."'),(0,o.kt)("p",null,'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.'))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4173e2a.4a901b46.js b/assets/js/f4173e2a.4a901b46.js deleted file mode 100644 index 252306add..000000000 --- a/assets/js/f4173e2a.4a901b46.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5463],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>b});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),u=s(r),f=o,b=u["".concat(p,".").concat(f)]||u[f]||d[f]||a;return r?n.createElement(b,i(i({ref:t},l),{},{components:r})):n.createElement(b,i({ref:t},l))}));function b(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const a={label:"zpaq",sidebar_position:7},i="ZPAQ",c={unversionedId:"data/zpaq",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.md",sourceDirName:"data",slug:"/data/zpaq",permalink:"/docs/data/zpaq",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zpaq.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"zpaq",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Brotli",permalink:"/docs/data/brotli"},next:{title:"Zstandard",permalink:"/docs/data/zstd"}},p={},s=[],l={toc:s},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"zpaq"},"ZPAQ"),(0,o.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,o.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.efa54ed7.js b/assets/js/runtime~main.ad099f20.js similarity index 92% rename from assets/js/runtime~main.efa54ed7.js rename to assets/js/runtime~main.ad099f20.js index 5c32c6b99..5eb029d65 100644 --- a/assets/js/runtime~main.efa54ed7.js +++ b/assets/js/runtime~main.ad099f20.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,d,f,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,d,f)=>{if(!c){var b=1/0;for(i=0;i=f)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[c,d,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(f,b),f},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({17:"7574d07a",53:"935f2afb",130:"9b6fb453",370:"3494e53a",489:"74450489",533:"b2b675dd",537:"9b4bf0ad",774:"1cb64385",819:"7ecaa93b",837:"4b506820",909:"0f8cca8e",918:"bda40bca",1015:"71e8630b",1034:"46e4c4c4",1056:"311c973b",1062:"5dfd82d3",1157:"6be474c2",1164:"146621ac",1221:"319244b6",1280:"d6f42046",1361:"fdae8881",1444:"6f58bdf2",1477:"b2f554cd",1586:"abb705c2",1606:"cce01883",1713:"a7023ddc",1727:"333f9c20",1746:"7680a4d5",1777:"18c4b02f",1810:"16a2ecb1",1820:"d3fe2180",1923:"8c5da4da",2535:"814f3328",2565:"7d044f50",2759:"b41a2a88",2768:"0cc695c5",2798:"d92a3c43",2875:"d2946d3d",2902:"f98cc194",3085:"1f391b9e",3089:"a6aa9e1f",3128:"33b5e57c",3146:"13d564a8",3155:"d083b8d3",3173:"729fe1da",3241:"6ed27c39",3283:"03398248",3312:"59641f86",3416:"ec2b09d3",3586:"ddf1125a",3599:"b31956d8",3608:"9e4087bc",3677:"9b0d9acc",3681:"96f54850",3686:"e80106d6",3722:"87861d43",3899:"1cb05ddd",3950:"f0f157d6",3958:"19839cd1",4002:"cd1d8cd3",4013:"01a85c17",4100:"39634027",4195:"c4f5d8e4",4288:"ad895e75",4416:"b994ae50",4445:"8a31ca28",4478:"5730e896",4503:"4d465a8d",4591:"236b5e64",4704:"bc8b8418",4828:"22091897",5226:"b9f079c2",5302:"1d129381",5335:"c8fc782b",5463:"f4173e2a",5474:"871a984d",5496:"7015859e",5581:"60e1ac2d",5601:"d4833a76",5663:"56ad2297",5676:"68768e4f",5715:"1b4147b1",5795:"8634481e",5888:"44ae7035",5893:"b059735e",6031:"aea4c9a8",6103:"ccc49370",6117:"195e296c",6242:"2d568f8b",6301:"170db0a5",6326:"1776fc83",6335:"8112becb",6492:"c9a80c62",6627:"180751f5",6643:"239a6b34",6896:"91a1632f",6899:"087cb829",6976:"68409bcb",6997:"50cc20ba",7363:"56ac595f",7414:"393be207",7473:"4edf0cfc",7671:"b0d95fb7",7777:"e6fe0126",7918:"17896441",8007:"4f425cbc",8039:"7dc56e97",8606:"f594c766",8610:"6875c492",8685:"96daa04a",8833:"a5eab855",8971:"92404733",9060:"c177ddec",9087:"43f4d598",9112:"7ec778da",9140:"0e272b0d",9211:"350130fb",9510:"548450a9",9514:"1be78505",9578:"89809f85",9596:"b4470a6f",9612:"2c0077b9",9768:"3ca2a0fe",9967:"608061a6"}[e]||e)+"."+{17:"80bcaa63",53:"b07daa0b",130:"b34e50bc",370:"fb908f26",489:"a76acfc9",533:"8cdb71b9",537:"9733d295",774:"504ae67a",819:"59c1713d",837:"cf255d72",909:"a1bcae2d",918:"711d5bb3",1015:"13731e2f",1034:"dfc91d80",1056:"0d864e01",1062:"fab28e28",1157:"aa437e6f",1164:"1ae57d7f",1221:"f6ed9212",1280:"fc467dc5",1361:"1a614b70",1444:"205a89bf",1477:"95f518ec",1506:"048e9ec4",1586:"0497fe0d",1606:"1f11dc27",1713:"3d7f47f9",1727:"2379da1b",1746:"1dde6da0",1777:"92a4cdfa",1810:"78c8b22d",1820:"ad20cfd1",1923:"f184d37b",2529:"55960c3f",2535:"1d3d3e55",2565:"4a7258cc",2759:"225c37b6",2768:"dc5a5d25",2798:"668e9001",2875:"3b054cb8",2902:"2df28fed",3085:"c5a46bb2",3089:"02dbe3c0",3128:"0e14bf0c",3146:"43f8975b",3155:"f355ca6c",3173:"98753165",3241:"27a2aa80",3283:"7b96acc6",3312:"5b478d95",3416:"e06a1867",3586:"2f6ce9fa",3599:"b4e4f370",3608:"1229cf67",3677:"2625e206",3681:"bb67fd56",3686:"b4f211e6",3722:"a352d04c",3899:"faa467e9",3950:"e3561a77",3958:"76168225",4002:"8be28c9c",4013:"410e35af",4100:"231831df",4195:"ae5bf3de",4288:"76b62aea",4416:"4aa06432",4445:"f4998259",4478:"021f9304",4503:"b5e22740",4591:"f7c0268f",4704:"1c9d40a8",4828:"3f1b2939",4972:"8e6573e9",5226:"a2888097",5302:"8c43c86b",5335:"82f54a91",5463:"4a901b46",5474:"bc691dd3",5496:"7817d71b",5581:"642d5cf9",5601:"dbd0d6ab",5663:"0f86c943",5676:"e985787d",5715:"3760f7ac",5795:"09b3b3c4",5888:"451f1fa8",5893:"a26f2ee7",6031:"d344e793",6103:"b58832c0",6117:"5b006741",6242:"d80ff40c",6301:"96c14a4c",6326:"f8089d7a",6335:"ad893fda",6492:"f57d434c",6627:"bcbeb9b4",6643:"0eb2ad08",6896:"579f792c",6899:"f500f908",6976:"7142152b",6997:"6bd658ab",7363:"fd0ef8cd",7414:"75222362",7473:"1d3b7d8f",7671:"acb71d07",7777:"963217ca",7918:"5b235d7f",8007:"55a3327c",8039:"3d9e0625",8606:"1a311c3d",8610:"3e329360",8685:"7fa0a7cf",8833:"fcb29101",8971:"962d60e5",9060:"92d78069",9087:"c88d96df",9112:"5ffe6777",9140:"30662d48",9211:"91d58b4d",9510:"cc908fb2",9514:"2f986172",9578:"d242abfe",9596:"32de82f1",9612:"a4ce8002",9768:"fa2f2d47",9967:"d75443b3"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="codec-wiki:",r.l=(e,a,c,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"7918",22091897:"4828",39634027:"4100",74450489:"489",92404733:"8971","7574d07a":"17","935f2afb":"53","9b6fb453":"130","3494e53a":"370",b2b675dd:"533","9b4bf0ad":"537","1cb64385":"774","7ecaa93b":"819","4b506820":"837","0f8cca8e":"909",bda40bca:"918","71e8630b":"1015","46e4c4c4":"1034","311c973b":"1056","5dfd82d3":"1062","6be474c2":"1157","146621ac":"1164","319244b6":"1221",d6f42046:"1280",fdae8881:"1361","6f58bdf2":"1444",b2f554cd:"1477",abb705c2:"1586",cce01883:"1606",a7023ddc:"1713","333f9c20":"1727","7680a4d5":"1746","18c4b02f":"1777","16a2ecb1":"1810",d3fe2180:"1820","8c5da4da":"1923","814f3328":"2535","7d044f50":"2565",b41a2a88:"2759","0cc695c5":"2768",d92a3c43:"2798",d2946d3d:"2875",f98cc194:"2902","1f391b9e":"3085",a6aa9e1f:"3089","33b5e57c":"3128","13d564a8":"3146",d083b8d3:"3155","729fe1da":"3173","6ed27c39":"3241","03398248":"3283","59641f86":"3312",ec2b09d3:"3416",ddf1125a:"3586",b31956d8:"3599","9e4087bc":"3608","9b0d9acc":"3677","96f54850":"3681",e80106d6:"3686","87861d43":"3722","1cb05ddd":"3899",f0f157d6:"3950","19839cd1":"3958",cd1d8cd3:"4002","01a85c17":"4013",c4f5d8e4:"4195",ad895e75:"4288",b994ae50:"4416","8a31ca28":"4445","5730e896":"4478","4d465a8d":"4503","236b5e64":"4591",bc8b8418:"4704",b9f079c2:"5226","1d129381":"5302",c8fc782b:"5335",f4173e2a:"5463","871a984d":"5474","7015859e":"5496","60e1ac2d":"5581",d4833a76:"5601","56ad2297":"5663","68768e4f":"5676","1b4147b1":"5715","8634481e":"5795","44ae7035":"5888",b059735e:"5893",aea4c9a8:"6031",ccc49370:"6103","195e296c":"6117","2d568f8b":"6242","170db0a5":"6301","1776fc83":"6326","8112becb":"6335",c9a80c62:"6492","180751f5":"6627","239a6b34":"6643","91a1632f":"6896","087cb829":"6899","68409bcb":"6976","50cc20ba":"6997","56ac595f":"7363","393be207":"7414","4edf0cfc":"7473",b0d95fb7:"7671",e6fe0126:"7777","4f425cbc":"8007","7dc56e97":"8039",f594c766:"8606","6875c492":"8610","96daa04a":"8685",a5eab855:"8833",c177ddec:"9060","43f4d598":"9087","7ec778da":"9112","0e272b0d":"9140","350130fb":"9211","548450a9":"9510","1be78505":"9514","89809f85":"9578",b4470a6f:"9596","2c0077b9":"9612","3ca2a0fe":"9768","608061a6":"9967"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,c)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var f=new Promise(((c,f)=>d=e[a]=[c,f]));c.push(d[2]=f);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var d,f,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(c);n{"use strict";var e,a,c,d,f,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,d,f)=>{if(!c){var b=1/0;for(i=0;i=f)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[c,d,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(f,b),f},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({17:"7574d07a",53:"935f2afb",130:"9b6fb453",370:"3494e53a",489:"74450489",533:"b2b675dd",537:"9b4bf0ad",774:"1cb64385",819:"7ecaa93b",837:"4b506820",909:"0f8cca8e",918:"bda40bca",1015:"71e8630b",1034:"46e4c4c4",1056:"311c973b",1062:"5dfd82d3",1157:"6be474c2",1164:"146621ac",1221:"319244b6",1280:"d6f42046",1361:"fdae8881",1444:"6f58bdf2",1477:"b2f554cd",1586:"abb705c2",1606:"cce01883",1713:"a7023ddc",1727:"333f9c20",1746:"7680a4d5",1777:"18c4b02f",1810:"16a2ecb1",1820:"d3fe2180",1923:"8c5da4da",2535:"814f3328",2565:"7d044f50",2759:"b41a2a88",2768:"0cc695c5",2798:"d92a3c43",2875:"d2946d3d",2902:"f98cc194",3085:"1f391b9e",3089:"a6aa9e1f",3128:"33b5e57c",3146:"13d564a8",3155:"d083b8d3",3173:"729fe1da",3241:"6ed27c39",3283:"03398248",3312:"59641f86",3416:"ec2b09d3",3586:"ddf1125a",3599:"b31956d8",3608:"9e4087bc",3677:"9b0d9acc",3681:"96f54850",3686:"e80106d6",3722:"87861d43",3899:"1cb05ddd",3950:"f0f157d6",3958:"19839cd1",4002:"cd1d8cd3",4013:"01a85c17",4100:"39634027",4195:"c4f5d8e4",4288:"ad895e75",4416:"b994ae50",4445:"8a31ca28",4478:"5730e896",4503:"4d465a8d",4591:"236b5e64",4704:"bc8b8418",4828:"22091897",5226:"b9f079c2",5302:"1d129381",5335:"c8fc782b",5463:"f4173e2a",5474:"871a984d",5496:"7015859e",5581:"60e1ac2d",5601:"d4833a76",5663:"56ad2297",5676:"68768e4f",5715:"1b4147b1",5795:"8634481e",5888:"44ae7035",5893:"b059735e",6031:"aea4c9a8",6103:"ccc49370",6117:"195e296c",6242:"2d568f8b",6301:"170db0a5",6326:"1776fc83",6335:"8112becb",6492:"c9a80c62",6627:"180751f5",6643:"239a6b34",6896:"91a1632f",6899:"087cb829",6976:"68409bcb",6997:"50cc20ba",7363:"56ac595f",7414:"393be207",7473:"4edf0cfc",7671:"b0d95fb7",7777:"e6fe0126",7918:"17896441",8007:"4f425cbc",8039:"7dc56e97",8606:"f594c766",8610:"6875c492",8685:"96daa04a",8833:"a5eab855",8971:"92404733",9060:"c177ddec",9087:"43f4d598",9112:"7ec778da",9140:"0e272b0d",9211:"350130fb",9510:"548450a9",9514:"1be78505",9578:"89809f85",9596:"b4470a6f",9612:"2c0077b9",9768:"3ca2a0fe",9967:"608061a6"}[e]||e)+"."+{17:"80bcaa63",53:"44ec4c5e",130:"b34e50bc",370:"8d763d6c",489:"a76acfc9",533:"8cdb71b9",537:"9733d295",774:"504ae67a",819:"59c1713d",837:"cf255d72",909:"a1bcae2d",918:"711d5bb3",1015:"13731e2f",1034:"dfc91d80",1056:"0d864e01",1062:"fab28e28",1157:"aa437e6f",1164:"71181485",1221:"f6ed9212",1280:"fc467dc5",1361:"1a614b70",1444:"205a89bf",1477:"95f518ec",1506:"048e9ec4",1586:"e0f08909",1606:"1f11dc27",1713:"3d7f47f9",1727:"2379da1b",1746:"1dde6da0",1777:"92a4cdfa",1810:"78c8b22d",1820:"ad20cfd1",1923:"f184d37b",2529:"55960c3f",2535:"1d3d3e55",2565:"4a7258cc",2759:"225c37b6",2768:"55af884a",2798:"668e9001",2875:"12977300",2902:"2df28fed",3085:"c5a46bb2",3089:"02dbe3c0",3128:"0e14bf0c",3146:"43f8975b",3155:"f355ca6c",3173:"98753165",3241:"27a2aa80",3283:"7b96acc6",3312:"5b478d95",3416:"e06a1867",3586:"236bb914",3599:"b4e4f370",3608:"1229cf67",3677:"2625e206",3681:"bb67fd56",3686:"b4f211e6",3722:"a352d04c",3899:"faa467e9",3950:"e3561a77",3958:"76168225",4002:"8be28c9c",4013:"410e35af",4100:"231831df",4195:"ae5bf3de",4288:"76b62aea",4416:"4aa06432",4445:"f4998259",4478:"021f9304",4503:"f78a5eef",4591:"722f80d2",4704:"1c9d40a8",4828:"3f1b2939",4972:"8e6573e9",5226:"a2888097",5302:"8c43c86b",5335:"82f54a91",5463:"249f1a0f",5474:"02dc7d86",5496:"7817d71b",5581:"642d5cf9",5601:"dbd0d6ab",5663:"0f86c943",5676:"e985787d",5715:"3760f7ac",5795:"09b3b3c4",5888:"ddcb322a",5893:"a26f2ee7",6031:"d344e793",6103:"b58832c0",6117:"d6739c70",6242:"d80ff40c",6301:"96c14a4c",6326:"db2049f7",6335:"ad893fda",6492:"f57d434c",6627:"bcbeb9b4",6643:"0eb2ad08",6896:"579f792c",6899:"f500f908",6976:"1b3a7739",6997:"6bd658ab",7363:"fd0ef8cd",7414:"75222362",7473:"1d3b7d8f",7671:"acb71d07",7777:"963217ca",7918:"5b235d7f",8007:"55a3327c",8039:"3d9e0625",8606:"1a311c3d",8610:"3e329360",8685:"7fa0a7cf",8833:"fcb29101",8971:"962d60e5",9060:"92d78069",9087:"c88d96df",9112:"5ffe6777",9140:"30662d48",9211:"91d58b4d",9510:"cc908fb2",9514:"2f986172",9578:"d242abfe",9596:"32de82f1",9612:"a4ce8002",9768:"fa2f2d47",9967:"d75443b3"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="codec-wiki:",r.l=(e,a,c,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"7918",22091897:"4828",39634027:"4100",74450489:"489",92404733:"8971","7574d07a":"17","935f2afb":"53","9b6fb453":"130","3494e53a":"370",b2b675dd:"533","9b4bf0ad":"537","1cb64385":"774","7ecaa93b":"819","4b506820":"837","0f8cca8e":"909",bda40bca:"918","71e8630b":"1015","46e4c4c4":"1034","311c973b":"1056","5dfd82d3":"1062","6be474c2":"1157","146621ac":"1164","319244b6":"1221",d6f42046:"1280",fdae8881:"1361","6f58bdf2":"1444",b2f554cd:"1477",abb705c2:"1586",cce01883:"1606",a7023ddc:"1713","333f9c20":"1727","7680a4d5":"1746","18c4b02f":"1777","16a2ecb1":"1810",d3fe2180:"1820","8c5da4da":"1923","814f3328":"2535","7d044f50":"2565",b41a2a88:"2759","0cc695c5":"2768",d92a3c43:"2798",d2946d3d:"2875",f98cc194:"2902","1f391b9e":"3085",a6aa9e1f:"3089","33b5e57c":"3128","13d564a8":"3146",d083b8d3:"3155","729fe1da":"3173","6ed27c39":"3241","03398248":"3283","59641f86":"3312",ec2b09d3:"3416",ddf1125a:"3586",b31956d8:"3599","9e4087bc":"3608","9b0d9acc":"3677","96f54850":"3681",e80106d6:"3686","87861d43":"3722","1cb05ddd":"3899",f0f157d6:"3950","19839cd1":"3958",cd1d8cd3:"4002","01a85c17":"4013",c4f5d8e4:"4195",ad895e75:"4288",b994ae50:"4416","8a31ca28":"4445","5730e896":"4478","4d465a8d":"4503","236b5e64":"4591",bc8b8418:"4704",b9f079c2:"5226","1d129381":"5302",c8fc782b:"5335",f4173e2a:"5463","871a984d":"5474","7015859e":"5496","60e1ac2d":"5581",d4833a76:"5601","56ad2297":"5663","68768e4f":"5676","1b4147b1":"5715","8634481e":"5795","44ae7035":"5888",b059735e:"5893",aea4c9a8:"6031",ccc49370:"6103","195e296c":"6117","2d568f8b":"6242","170db0a5":"6301","1776fc83":"6326","8112becb":"6335",c9a80c62:"6492","180751f5":"6627","239a6b34":"6643","91a1632f":"6896","087cb829":"6899","68409bcb":"6976","50cc20ba":"6997","56ac595f":"7363","393be207":"7414","4edf0cfc":"7473",b0d95fb7:"7671",e6fe0126:"7777","4f425cbc":"8007","7dc56e97":"8039",f594c766:"8606","6875c492":"8610","96daa04a":"8685",a5eab855:"8833",c177ddec:"9060","43f4d598":"9087","7ec778da":"9112","0e272b0d":"9140","350130fb":"9211","548450a9":"9510","1be78505":"9514","89809f85":"9578",b4470a6f:"9596","2c0077b9":"9612","3ca2a0fe":"9768","608061a6":"9967"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,c)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var f=new Promise(((c,f)=>d=e[a]=[c,f]));c.push(d[2]=f);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var d,f,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(c);n - +

¡ 9 min read
Simulping
Copyright Disclosure

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.

Feature image A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"

A Scenario​

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.

- + \ No newline at end of file diff --git a/blog/archive.html b/blog/archive.html index 7733c0531..c79461356 100644 --- a/blog/archive.html +++ b/blog/archive.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/blog/av1-encoding-for-dummies.html b/blog/av1-encoding-for-dummies.html index 4e6f61c19..0acc7b7f9 100644 --- a/blog/av1-encoding-for-dummies.html +++ b/blog/av1-encoding-for-dummies.html @@ -11,7 +11,7 @@ - + @@ -23,7 +23,7 @@ Set tune-content to psy for everything else, do not use if you encode above cq-level=30 For 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. 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. If you use any of the VMAF tunes, you need to specify --vmaf-model-path= to where you put it.

  • --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.

  • --sb-size=dynamic Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it.

  • --deltaq-mode set to 0 because its just better.

  • --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.

  • --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.

  • --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

  • --enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1 Parameters that give you free efficiency boost.

  • --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.

Concatenation Error on Linux

Run 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

Merging Everything​

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 mp4, just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental.

Tips & Tricks​

  • --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.

  • --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.

  • --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.

Final Thoughts​

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!

Guide originally hosted on https://rentry.co/AV1, rewrite and migration by Simulping.

- + \ No newline at end of file diff --git a/blog/embedding-the-un-embeddable.html b/blog/embedding-the-un-embeddable.html index 2ec5baebe..2b1fb7b5f 100644 --- a/blog/embedding-the-un-embeddable.html +++ b/blog/embedding-the-un-embeddable.html @@ -11,14 +11,14 @@ - +

Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others

¡ 9 min read
Simulping
Copyright Disclosure

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.

Feature image A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"

A Scenario​

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.

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.

stolen.shoes

The 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:

The big question is, how do they work? Let's get to dissecting.

How it Works​

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).

The technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end.

The Website's End​

If you view each website's source, you will find this specific line in each one but they may have a different order:

<meta property="og:image" content="https://example.com/i/someimageforthumbnail.jpg">
<meta property="og:type" content="video.other">
<meta property="og:video:url" content="https://example.com/v/video.mp4">
<meta property="og:video:width" content="1920">
<meta property="og:video:height" content="1080">

These 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 <html> and <body> tags. Here's an example of a static HTML site serving one specific video:

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" type="image/x-icon" href="../favicon.ico"/>
<title>some embed site</title>
<meta property="og:image" content="https://www.themoviedb.org/t/p/original/3U0vksjSY9LWe3Dqfr6xkgd3iQP.jpg">
<meta property="og:type" content="video.other">
<meta property="og:video:url" content="https://upload.wikimedia.org/wikipedia/commons/3/36/Cosmos_Laundromat_-_First_Cycle_-_Official_Blender_Foundation_release.webm">
<meta property="og:video:width" content="2048">
<meta property="og:video:height" content="858">
</head>
<body>
<h1>Hi</h1>
<p>Just your friendly neighborhood video embed site</p>
</body>
</html>

These 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).

Discord's End​

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.

Strengths & Limitations​

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.

Strengths​

  • You can embed non-web compatible codecs such as HEVC in MP4/MOV, but the user must be using a compatible browser. Thorium or Safari version 13 or greater will work for HEVC playback.
  • 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.

Limitations​

  • You can only use hotlinks, 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.
  • 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.
  • 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.

Differences between Sites​

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.

Here are the sites, each with one noteworthy special benefit:

That concludes the technical overview! Next, let's cover the history of this exploit.

The Lore​

Dwayne​

In around April of 2022, a Reddit user going by the name of u/CreativeGamer03 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.

The link used is now unfortunately removed.

Discovery​

On 23rd June 2022, a Discord user Clybius on the AV1 Community server asked people for VP9 or 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.

He tried shortly afterward with AV1. Eureka, it also worked:

AV1

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.

Dwayne

The Experiments & Interactive Site​

After 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 section on the Terminology page.

This applies to HEVC, ProRes, xHE-AAC, and other bizarre codecs that are rarely seen on the Web.

While 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.

Virality​

It'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.

  • 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.

puss

  • 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.

mario

  • 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. The copy seems to be a compressed 720p encode. This example used discord.nfp.is.

fnaf

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:

  • Top Gun Maverick (2022)
  • The SpongeBob trilogy (2005/2015/2020)
  • Spider-Man: Across the Spider-Verse (2023)

Closing​

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.

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.

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.

Thank you for reading this blog post, I hope you learned something!

- + \ No newline at end of file diff --git a/blog/site-optimization.html b/blog/site-optimization.html index 5f4c7e6f1..d2125ec19 100644 --- a/blog/site-optimization.html +++ b/blog/site-optimization.html @@ -11,14 +11,14 @@ - +

Site Optimization by Reducing Image Load on the Web

¡ 10 min read
RootAtKali
Gianni Rosato

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.

caution

These instructions are for photographic images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.

danger

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:

Fire & Forget​

First, 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:

exported straight from Darktable at JPEG q90, with no scaling

bloated_jpeg

2.2 MB

Massive Improvement​

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.

box-size-mac 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.

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 cjpegli, looks like this:

smaller_jpeg

Obviously, 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.

2.2 MB -> 233 kB

Lazy Loading​

A 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:

<picture>
<img src="/images/jpeg_fallback.jpg" alt="alt text" width="XX" height="YY" loading="lazy" />
</picture>

New Codecs​

If you desire further improvement, it may be time to consider using a newer codec like AVIF or 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 WebP or 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.

Fallbacks​

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:

<picture>
<source srcset="/img/jxl_image.jxl" type="image/jxl" />
<source srcset="/img/avif_image.avif" type="image/avif" />
<source srcset="/img/webp_fback.webp" type="image/webp" />
<img src="/images/jpeg_fallback.jpg" alt="alt text" width="XX" height="YY" loading="lazy" />
</picture>

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.

Compression Efficacy​

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 cjpegli (which scores ~83.01 with the SSIMULACRA2 visual fidelity metric).

smaller_jxl

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

smaller_avif

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

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 ssimulacra2 program decodes JPEG & JXL. Either way, the scores are fairly close.

smaller_jxl_jpeg-recomp

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

The 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).

smaller_jpeg_xyb

208.3 kB XYB JPEG, encoded with cjpegli lossless.png out.jpg --xyb -d 1.155. Score: ~83.04 0.10s user time

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.

Responsive Images​

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 Responsive Image Linter that can help us figure out which image sizes we should be using.

responsive_image_linter

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:

<picture>
  <source type="image/jxl" srcset="/img_270.jxl 270w, /img_958.jxl 958w, /img_1350.jxl 1350w, /img_1660.jxl 1660w, /img_1916.jxl 1916w" sizes="(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)" />
  <source type="image/avif" srcset="/img_270.avif 270w, /img_958.avif 958w, /img_1350.avif 1350w, /img_1660.avif 1660w, /img_1916.avif 1916w" sizes="(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)" />
  <img width="1699" height="1136" alt="alt text" srcset="/img_270.jpg 270w, /img_958.jpg 958w, /img_1350.jpg 1350w, /img_1660.jpg 1660w, /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="/fallback.jpg" />
</picture>

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:

  • srcset = the images available to your browser to serve, & their respective widths
  • sizes = the conditions given to the browser explaining under what conditions should it serve which image
  • (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.
  • 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.
      alt text

That'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 blog post when writing this entry. I have confirmed 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/blog/tags.html b/blog/tags.html index a24fd82fc..a8b83597e 100644 --- a/blog/tags.html +++ b/blog/tags.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/blog/tags/compression.html b/blog/tags/compression.html index 2d8704d6b..cf722fcb0 100644 --- a/blog/tags/compression.html +++ b/blog/tags/compression.html @@ -11,13 +11,13 @@ - +

2 posts tagged with "compression"

View All Tags
- + \ No newline at end of file diff --git a/blog/tags/discord.html b/blog/tags/discord.html index 45825f46a..bf0554e96 100644 --- a/blog/tags/discord.html +++ b/blog/tags/discord.html @@ -11,14 +11,14 @@ - +

One post tagged with "discord"

View All Tags

¡ 9 min read
Simulping
Copyright Disclosure

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.

Feature image A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"

A Scenario​

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.

- + \ No newline at end of file diff --git a/blog/tags/image.html b/blog/tags/image.html index 8c2a7de04..b43d46475 100644 --- a/blog/tags/image.html +++ b/blog/tags/image.html @@ -11,13 +11,13 @@ - +

One post tagged with "image"

View All Tags
- + \ No newline at end of file diff --git a/blog/tags/video.html b/blog/tags/video.html index 4ef1ce3de..2a4f8c49c 100644 --- a/blog/tags/video.html +++ b/blog/tags/video.html @@ -11,14 +11,14 @@ - +

2 posts tagged with "video"

View All Tags

¡ 9 min read
Simulping
Copyright Disclosure

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.

Feature image A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"

A Scenario​

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.

- + \ No newline at end of file diff --git a/blog/tags/web.html b/blog/tags/web.html index ac5479d93..99c4b1e5c 100644 --- a/blog/tags/web.html +++ b/blog/tags/web.html @@ -11,13 +11,13 @@ - +

One post tagged with "web"

View All Tags
- + \ No newline at end of file diff --git a/docs/FAQ.html b/docs/FAQ.html index fc24224b2..0326c7dd9 100644 --- a/docs/FAQ.html +++ b/docs/FAQ.html @@ -11,13 +11,13 @@ - +

FAQ

Why are you doing this?​

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.

But alternatives exist. Why not contribute there?​

While this is true, this is easier said than done.

  • Multimedia Wiki is not as active as it used to be, & a new effort makes sense to carry past efforts forward.

  • guide.encode.moe is stagnant and mostly focused on fansub, docs & personal experiences that are scattered around the Internet.

  • 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.

How do I get started as a contributor?​

See our Contribution Guide page in the sidebar.

Why "Codec Wiki"?​

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.

- + \ No newline at end of file diff --git a/docs/audio/AAC.html b/docs/audio/AAC.html index d91220636..91f8107c9 100644 --- a/docs/audio/AAC.html +++ b/docs/audio/AAC.html @@ -11,7 +11,7 @@ - + @@ -21,7 +21,7 @@ AAC-LC

FAAC​

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 AAC-LC.

Nero AAC​

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.

Nero AAC can encode the following formats: AAC-LC, HE-AAC, HE-AACv2

Exhale​

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.

exhale can encode the following formats: xHE-AAC

Conclusion​

Alternatives to AAC include Opus, Vorbis, MP3, & FLAC, among others.

  • Vorbis & MP3 are considered to be worse, although Vorbis has its moments & is entirely royalty-free unlike AAC.
  • 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.
  • 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 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.
- + \ No newline at end of file diff --git a/docs/audio/Dolby.html b/docs/audio/Dolby.html index 2b861c73b..22ce3efce 100644 --- a/docs/audio/Dolby.html +++ b/docs/audio/Dolby.html @@ -11,13 +11,13 @@ - +

Dolby Digital

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

Dolby Digital is a family of both lossless and lossy audio compression algorithms and technologies.

Format Overview​

AC-3​

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 “Modified Discrete Cosine Transform” algorithm. The codec has seen widespread use an adoption, due to its prevalence in DVDs, TV, and Blu-rays as a surround codec.

Dolby Digital Surround EX​

Like Dolby’s 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 “Star Wars: Episode I – The Phantom Menace”.

E-AC-3​

Often referred to as “Dolby Digital Plus”, E-AC-3 is the successor to Dolby’s 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.

TrueHD​

Dolby’s TrueHD is a lossless multi-channel audio codec based on Meridian’s Lossless Packing (MLP) codec, although the two aren’t compatible with each other. TrueHD is mainly used on Blu-ray and supports Dolby Atmos’s 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.

AC-4​

To be added.

Atmos​

To be added.

- + \ No newline at end of file diff --git a/docs/audio/FLAC.html b/docs/audio/FLAC.html index 8952b4408..18dacabbb 100644 --- a/docs/audio/FLAC.html +++ b/docs/audio/FLAC.html @@ -11,13 +11,13 @@ - +
- + \ No newline at end of file diff --git a/docs/audio/MP3.html b/docs/audio/MP3.html index b593690cf..14e8706bf 100644 --- a/docs/audio/MP3.html +++ b/docs/audio/MP3.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/audio/Opus.html b/docs/audio/Opus.html index 24da82c91..2152483cf 100644 --- a/docs/audio/Opus.html +++ b/docs/audio/Opus.html @@ -11,7 +11,7 @@ - + @@ -23,7 +23,7 @@ Wideband: 3-8000hz SuperWideband: 3-12000hz Fullband: 3-20000hz

Encoders​

Opusenc​

Opus's reference encoder is 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.

Usage: opusenc [options] input_file output_file.opus

  • --bitrate #.### Sets the overall target bitrate in kbit/s. Most encoders use 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.

  • --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 enabled by default.

  • --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.

  • --hard-cbr Tells the encoder to use a constant bitrate the whole time.

  • --music & --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.

  • --comp # Sets the encoder complexity to a value from 0 to 10, 0 being the least complex & 10 being the most. The default is 10.

  • --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. The default value is 20.

  • --expect-loss # Percentage value for expected packet loss. Not useful for local encoding & playback, but useful for real-time applications. Default value is 0.

  • --downmix-mono Downmixes multiple channels into a single channel.

  • --downmix-stereo Downmixes multiple channels into two channels, left & right, given more than two channels are provided to the encoder.

  • --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.

  • --max-delay # Sets maximum container delay in milliseconds, from 0-1000. Default is 1000.

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.

An example opusenc command:

opusenc "input.wav" "output.opus" --bitrate 96

FFmpeg using libopus:

ffmpeg -i "input.flac" -c:a libopus -b:a 128K "output.ogg"

If you'd like to learn more about opusenc & its recommended default behavior, read this article on Opus Recommended Settings.

FFopus​

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.

FFopus usage:

ffmpeg -i "input.wma" -c:a opus -b:a 128K -strict -2  "output.opus"

vac-enc​

VAC, or Value Added Codec, is a libopus encoder that uses SoX to resample inputs & supports output to .ogg rather than exclusively .opus. Better resampling theoretically leads to better coding efficiency, but vac-enc hasn't been thoroughly tested.

Encoding a 16-bit signed little endian pcm_s16le WAV to 128kbit/s Opus in an OGG container:

vac-enc input.wav output.ogg 128
- + \ No newline at end of file diff --git a/docs/audio/Speex.html b/docs/audio/Speex.html index 805c8c171..693f4ef44 100644 --- a/docs/audio/Speex.html +++ b/docs/audio/Speex.html @@ -11,13 +11,13 @@ - +
- + \ No newline at end of file diff --git a/docs/audio/Vorbis.html b/docs/audio/Vorbis.html index 619013726..f9ec1960b 100644 --- a/docs/audio/Vorbis.html +++ b/docs/audio/Vorbis.html @@ -11,13 +11,13 @@ - +

Vorbis

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 Opus.

- + \ No newline at end of file diff --git a/docs/audio/WavPack.html b/docs/audio/WavPack.html index 7b76b2921..380f278b6 100644 --- a/docs/audio/WavPack.html +++ b/docs/audio/WavPack.html @@ -11,13 +11,13 @@ - +

WavPack

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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.

- + \ No newline at end of file diff --git a/docs/contribution-guide.html b/docs/contribution-guide.html index 6583ac4cc..15fe87296 100644 --- a/docs/contribution-guide.html +++ b/docs/contribution-guide.html @@ -11,13 +11,13 @@ - +

Contribution Guide

Codec Wiki - community-maintained wiki for all things encoding.

Before You Contribute​

  1. By contributing to the Codec Wiki, you are communicating that you have read & agreed to our Terms & Conditions, Privacy Policy, & Code of Conduct.
  2. 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.

Our current priority is filling out the existing pages with content. Please assist in doing this, if possible, before considering adding new pages.

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:

Pending Review

The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.

If you're aware your entry is too short or incomplete, please add the following message to the top of your entry:

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

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:

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

Connect With Us​

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:

Alternatively, we have a (soon to be) bridged Revolt server linked right here. Revolt is an open-source Discord alternative, which you can read more about on this page.

Clone & Push Instructions​

Make sure to clone from & edit the main branch only, & push your final changes to the deployment branch according to the instructions below. Also be sure to use node 18 LTS, as later versions tend to be troublesome.

don't forget to add unimportant files to the .gitignore before making any commits

  1. Clone from the main branch to start to make a contribution:
% git clone git@github.com:av1-community-contributors/av1-wiki.github.io.git -b main
  1. Test your changes locally before making a commit:
% yarn
% npx docusaurus start
  1. Push changes to main branch:
% git add .
% git commit -m "Commit Message"
% git push -u origin main
  1. Deploy to deployment branch to make live on site:
% GIT_USER=<username> DEPLOYMENT_BRANCH=deployment yarn deploy

Docusaurus Info

Website​

This website is built using Docusaurus 2, a modern static website generator.

Installation​

$ yarn

Local Development​

$ yarn start

This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.

Build​

$ yarn build

This command generates static content into the build directory and can be served using any static contents hosting service.

Deployment​

See the initial instructions at the top.

- + \ No newline at end of file diff --git a/docs/data/7z.html b/docs/data/7z.html index 3e37f7b02..31eb3bf3d 100644 --- a/docs/data/7z.html +++ b/docs/data/7z.html @@ -11,13 +11,13 @@ - +
-

7-zip (7z)

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 XZ.

The 7-zip format has some noteworthy advantages over the popular ZIP format.

  • 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.
  • 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.
  • 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.

However, 7-zip also has some drawbacks and limitations.

  • 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 files45.
  • 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.
  • 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
- +

7-zip (7z)

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 XZ.

The 7-zip format has some noteworthy advantages over the popular ZIP format.

  • 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.
  • 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.
  • 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.

However, 7-zip also has some drawbacks and limitations.

  • 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 files45.
  • 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.
  • 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

7z archives are supported natively by macOS & many Linux distributions.

+ \ No newline at end of file diff --git a/docs/data/brotli.html b/docs/data/brotli.html index 6990cb628..275f16b56 100644 --- a/docs/data/brotli.html +++ b/docs/data/brotli.html @@ -11,13 +11,13 @@ - + - +

Brotli

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 .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 .tar.br Brotli archives like you would with gzip or 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.

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.

Brotli was co-authored & partially developed by Jyrki Alakuijala, who also worked on JPEG-XL & the efficient JPEG encoder jpegli. JPEG-XL's metadata information is usually Brotli-compressed.

+ \ No newline at end of file diff --git a/docs/data/bzip2.html b/docs/data/bzip2.html index 6bdd760d8..0dc15c5a3 100644 --- a/docs/data/bzip2.html +++ b/docs/data/bzip2.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/data/gzip.html b/docs/data/gzip.html index 821cac5ed..46b5ac898 100644 --- a/docs/data/gzip.html +++ b/docs/data/gzip.html @@ -11,13 +11,13 @@ - + - +

gzip

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

Format Breakdown​

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.

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.

History​

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.

The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation PKZIP was shareware.

A 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.

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." (https://infozip.sourceforge.net/). They did this successfully, leading to increased adoption of the ZIP format.

In the early 1990s the gzip format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix 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.

As a compress replacement, the Unix gzip utility can decompress data that was compressed using 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.

The popular tar utility, which creates an archive of files, has an option to compress directly to the .tar.gz format and is a very popular use caze for gzip. Since the compression of a .tar can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. .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 XZ, bzip2, brotli, 7-zip, & Zstandard.

Encoding​

Linux & macOS​

Chances are, you have gzip already available on your system. You can encode gzip archives using the gzip command.

  1. Open a terminal window.

  2. Navigate to the directory where you want to create the gzip archive.

  3. Use the gzip command followed by the name of the file you want to compress. For example:

gzip -7 myfile.txt

This will create a compressed file called myfile.txt.gz in the current directory using compression level 7. Compression levels span from 1 through 9 (-1 .. -9; shortcuts are --fast for -1, --best for -9).

  1. If you want to compress multiple files at once, you can use the -a option followed by the names of the files you want to compress. For example:
gzip -a myfile1.txt myfile2.txt

This will create compressed files called myfile1.txt.gz & myfile2.txt.gz in the current directory.

  1. If you want to compress a directory and all its contents, you can use the -r option followed by the name of the directory. For example:
gzip -r mydirectory/

This will create compressed versions of each file in the specified directory.

  1. If you want to encode the gzip archive with a different extension, you can use the -S option followed by the suffix .suf. For example:
gzip -S .suf myfile.txt

This will create a gzip-compressed file called myfile.txt.suf in the current directory.

Also, you can use other options like -v for verbose mode, -f to force overwriting & compress links, -l for listing the files and -d for decompressing the files.

You can find more information about the gzip command & its options by running man gzip in a terminal.

Windows​

To be filled.

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 this StackOverflow answer

+ \ No newline at end of file diff --git a/docs/data/xz.html b/docs/data/xz.html index 0aff57128..3d15cdad7 100644 --- a/docs/data/xz.html +++ b/docs/data/xz.html @@ -11,13 +11,13 @@ - + - +

XZ

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

XZ is a data compression format based on the Lempel-Ziv-Markov Chain Algorithm (LZMA). The XZ format itself is an improvement on LZMA, allowing for preprocessing filters similar to 7-zip to increase the resulting archive's compression ratio.

XZ can only compress one file at a time, so making a tar archive of the files you'd like to compress (if there are multiple) is necessary when using XZ.

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.

+ \ No newline at end of file diff --git a/docs/data/zip.html b/docs/data/zip.html index 531fcd195..7f66bd221 100644 --- a/docs/data/zip.html +++ b/docs/data/zip.html @@ -11,13 +11,13 @@ - +
-

ZIP

Pending Review

The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.

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 gzip & PNG.

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.

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.

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 gzip and has been succeeded many times by formats & algorithms such as bzip2, XZ, 7-zip, brotli (to a degree), and Zstandard.

Format Breakdown​

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.

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.

ZIP files can also support other compression methods, such as Deflate64(tm), BZIP2, LZMA, & 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.

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.

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 7-zip compression format, though the two are related).

Encoding​

Linux & macOS​

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 7-zip's Download page. Here are some direct download links: Linux x86_64 | macOS Universal

Once you've downloaded the utility, remember whether you are choosing to use the 7zz binary or the static 7zzs binary. Commands run using 7zz should run using 7zzs as well, so please replace 7zz in our examples as appropriate if you choose not to use it. Additionally, please copy your choice of binary to your /usr/local/bin if you want to be able to use it everywhere.

  • To encode a ZIP file at the lowest effort setting using one thread:
7zz a -bso0 -tzip -mmt1 -mx1 "Output.zip" "Input"
  • To encode a ZIP file at the highest effort setting using eight threads:
7zz a -bso0 -tzip -mmt8 -mx9 "Output.zip" "Input"

Windows​

To be filled.

Conclusion​

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.

- +

ZIP

Pending Review

The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.

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 gzip & PNG.

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.

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.

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 gzip and has been succeeded many times by formats & algorithms such as bzip2, XZ, 7-zip, brotli (to a degree), and Zstandard.

Format Breakdown​

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.

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.

ZIP files can also support other compression methods, such as Deflate64(tm), BZIP2, LZMA, & 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.

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.

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 7-zip compression format, though the two are related).

History​

The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation, PKZIP, was shareware.

A 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.

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." (https://infozip.sourceforge.net/). They did this successfully, leading to increased adoption of the ZIP format.

In the early 1990s the gzip format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix 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.

Unlike .tar, .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 .zip file. A .tar file would have to be decompressed and scanned from start to end in order to build a directory.

The popular tar utility, which creates an archive of files, has an option to compress directly to the .tar.gz format and is a very popular use caze for gzip. Since the compression of a .tar can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. .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 XZ, bzip2, brotli, 7-zip, & Zstandard.

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 .zip file. A .tar file would have to be decompressed and scanned from start to end in order to build a directory.

Encoding​

Linux & macOS​

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 7-zip's Download page. Here are some direct download links: Linux x86_64 | macOS Universal

Once you've downloaded the utility, remember whether you are choosing to use the 7zz binary or the static 7zzs binary. Commands run using 7zz should run using 7zzs as well, so please replace 7zz in our examples as appropriate if you choose not to use it. Additionally, please copy your choice of binary to your /usr/local/bin if you want to be able to use it everywhere.

  • To encode a ZIP file at the lowest effort setting using one thread:
7zz a -bso0 -tzip -mmt1 -mx1 "Output.zip" "Input"
  • To encode a ZIP file at the highest effort setting using eight threads:
7zz a -bso0 -tzip -mmt8 -mx9 "Output.zip" "Input"

Windows​

To be filled.

Conclusion​

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.

+ \ No newline at end of file diff --git a/docs/data/zpaq.html b/docs/data/zpaq.html index 795d1012e..c478cb128 100644 --- a/docs/data/zpaq.html +++ b/docs/data/zpaq.html @@ -11,13 +11,13 @@ - + - +

ZPAQ

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

ZPAQ is a lossless data compression algorithm that combines several techniques to achieve high compression ratios. It was developed by Matt Mahoney.

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."

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.

+ \ No newline at end of file diff --git a/docs/data/zstd.html b/docs/data/zstd.html index a588b9a23..1c152535a 100644 --- a/docs/data/zstd.html +++ b/docs/data/zstd.html @@ -11,13 +11,13 @@ - + - +

Zstandard

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 ZIP or gzip while being faster overall. In practice, it is said to compress similarly to pure LZMA (part of XZ & 7-zip) while being much faster.

While .tar.zst archives aren't as popular as .tar.xz or .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.

The command line zstd utility can compress to Zstandard at compression levels 1 through 19 by default. The upper bound is raised to 22 when passing the --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 which was published in 2020. Content encoding using zstd is supported since Chromium 118 behind an experimental flag, meaning it might compete with Brotli on the web in the future. Apple's LZFSE algorithm is purportedly similar to Zstandard compression level 6.

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, .tar.zst could replace 7-zip, ZIP, or other archiving formats, making speedy decode a reality on systems featuring varying levels of compute horsepower.

+ \ No newline at end of file diff --git a/docs/encoders/AVM.html b/docs/encoders/AVM.html index d10d6d6a2..c3593bdd5 100644 --- a/docs/encoders/AVM.html +++ b/docs/encoders/AVM.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/encoders/Aurora1.html b/docs/encoders/Aurora1.html index 3c1126b21..a5bc0def7 100644 --- a/docs/encoders/Aurora1.html +++ b/docs/encoders/Aurora1.html @@ -11,13 +11,13 @@ - +
- + \ No newline at end of file diff --git a/docs/encoders/HM.html b/docs/encoders/HM.html index 8b144fd96..1e18259d0 100644 --- a/docs/encoders/HM.html +++ b/docs/encoders/HM.html @@ -11,13 +11,13 @@ - +

HM

Pending Review

The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.

HM is the original H.265 reference encoder, predating alternatives like x265. In the modern day, it joins other MPEG reference encoders such as JM & 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.

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 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.

Building​

git clone https://vcgit.hhi.fraunhofer.de/jvet/HM
cd HM/
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)

The binary TAppEncoderStatic or TAppEncoder can be found within the cloned directories, & can be copied to /usr/local/bin for encoding. Decoding & other functions of the reference codec implementation aren't covered in this entry.

Usage​

Here is a sample command: 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

Make sure only to use only YUV input when encoding with HM. Each parameter does the following:

  • -i input.yuv -b out.265

Specifies a raw YUV input file & an output raw h265 bitstream. To mux into an MP4 container, it is recommended that you use mp4box instead of muxing with FFmpeg.

  • -c [path/to/config]

Specifies the desired path to your HM configuration file. This makes it easier to encode without having to manually specify a plethora of settings.

  • -wdt 1280 -hgt 720

Sets the input & output width & height.

  • -fr 50 -f 500

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.

  • -q 27

Sets a quality target for the encoder.

  • -xPS 0

Zero clue what this does. If someone has an idea, please contribute!

- + \ No newline at end of file diff --git a/docs/encoders/JM.html b/docs/encoders/JM.html index 160710963..839d37fd8 100644 --- a/docs/encoders/JM.html +++ b/docs/encoders/JM.html @@ -11,13 +11,13 @@ - +

JM

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

JM is the original H.264 reference encoder, predating alternatives like x264. In the modern day, it joins other MPEG reference encoders such as HM & 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.

- + \ No newline at end of file diff --git a/docs/encoders/Kvazaar.html b/docs/encoders/Kvazaar.html index 84e59ddf5..01f05bece 100644 --- a/docs/encoders/Kvazaar.html +++ b/docs/encoders/Kvazaar.html @@ -11,13 +11,13 @@ - +
- + \ No newline at end of file diff --git a/docs/encoders/SVT-AV1.html b/docs/encoders/SVT-AV1.html index 5cc42b050..a382078ff 100644 --- a/docs/encoders/SVT-AV1.html +++ b/docs/encoders/SVT-AV1.html @@ -11,13 +11,13 @@ - +

SVT-AV1

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

SVT-AV1 (Scalable Video Technology for AV1) is an AV1-compliant software encoder/decoder library. Joint-developed by Intel and Netflix, written in C with some parts in C++ and Assembly.

This entry discusses the SVT-AV1 encoder, also known as the "Production" AV1 encoder (while 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 rav1e, so the use of tools like Av1an is less helpful.

FFmpeg​

SVT-AV1 is available in FFmpeg via libsvtav1, to check if you have it, run ffmpeg -h encoder=libsvtav1. You can input non-FFmpeg standard SVT-AV1 parameters via -svtav1-params.

Building​

(Linux/macOS)​

To build SVT-AV1 from source, clone the official SVT-AV1 repository from Gitlab & build from source.

git clone https://gitlab.com/AOMediaCodec/SVT-AV1/
cd SVT-AV1/Build/linux
./build.sh release

If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). Be aware that this particular script infers that you have a .y4m file (or multiple) in /dev/shm for transcoding. You can compile statically linked SVT-AV1 with PGO by following this script:

git clone https://gitlab.com/AOMediaCodec/SVT-AV1/
cd SVT-AV1/Build/linux
./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release

If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:

git clone https://gitlab.com/AOMediaCodec/SVT-AV1/
cd SVT-AV1/Build/linux
./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release
../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data
./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release

Windows​

To be filled.

Encoding​

Strengths​

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 standard 1080p video. This is while maintaining competitive coding efficiency to rav1e. Both are outperformed by well-tuned aomenc, as the reference encoder has a more complete AV1 implementation.

Weaknesses​

SVT-AV1 is strongest on x86 CPUs, & it doesn't have any ARM NEON assembly which makes it underperform 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).

Encoder Optimization​

Aside from build optimizations for speed, there is further tweaking to be done to the SvtAv1EncApp binary parameters when encoding.

  • --film-grain & --film-grain-denoise

Most live-action sources feature hard-to-compress CCD 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 --film-grain parameter to specify an amount of film grain to add to the encode (& --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 --film-grain is recommended in most cases. According to 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.

  • --input-depth 10

10-bit output from AV1 encoding is always desirable for coding efficiency, even if your source is 8-bit.

  • --tune 2

There are three tunes in SVT-AV1: Tune 1 is for PSNR RDO, Tune 2 is for SSIM RDO, & Tune 0 is a 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. This is anecdotal, & has yet to be meaningfully proven

  • --enable-overlays 1

Enables overlay pictures to be used as additional reference frames for the referenced picture, disabled by default. Improves coding efficiency.

  • --keyint [FPS*10]

Similar to --kf-max-dist in 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.

  • --irefresh-type 2

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 reference one another, but support for this feature is currently incomplete. Therefore, it is recommended to use Closed GOP for the time being via --irefresh-type 2 until this is rectified.

  • --preset X

SVT-AV1 can be used in 14 different presets, labeled 0 through 13. Preset 0 is the slowest, but provides the best coding efficiency; Preset 13 is the fastest. Using presets 2 through 8 is the best course of action for non-realtime applications.

  • --crf X

CRF is the best way to target quality for optimal visual fidelity. VBR & CBR lose efficiency due to their inherently limited rate control.

- + \ No newline at end of file diff --git a/docs/encoders/SVT-HEVC.html b/docs/encoders/SVT-HEVC.html index d0fad0d0e..07713ea4b 100644 --- a/docs/encoders/SVT-HEVC.html +++ b/docs/encoders/SVT-HEVC.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/encoders/SVT-VP9.html b/docs/encoders/SVT-VP9.html index b95e9ed62..0805ab15d 100644 --- a/docs/encoders/SVT-VP9.html +++ b/docs/encoders/SVT-VP9.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/encoders/VTM.html b/docs/encoders/VTM.html index e128e32fa..59d1b6a27 100644 --- a/docs/encoders/VTM.html +++ b/docs/encoders/VTM.html @@ -11,13 +11,13 @@ - +

VTM

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

VTM is the original H.266 (better known as VVC) reference encoder, in competition with alternatives like VVenC. In the modern day, it joins other MPEG reference encoders such as HM & 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.

- + \ No newline at end of file diff --git a/docs/encoders/VVenC.html b/docs/encoders/VVenC.html index 2ac137056..5b0afcb2c 100644 --- a/docs/encoders/VVenC.html +++ b/docs/encoders/VVenC.html @@ -11,7 +11,7 @@ - + @@ -19,7 +19,7 @@

VVenC

vvencapp spamming the terminal output with progress per-picture-order-count cause god knows why

VVenC is an open source command line application for encoding H.266/VVC written in C++ and developed by Fraunhofer Heinrich-Hertz-Institute (HHI).

General support

There is currently no need for encoding VVC unless you are into bleeding edge codecs, a developer, video engineer, experimentations, academic papers, or an employee at Fraunhofer HHI. The general public won't bother if they can't play it on their crappy TV set top boxes.

Installation​

Arch Linux users: Check AUR.

danger

Compilation requires CMake

tip

The following build procedure should work across all common operating systems

git clone https://github.com/fraunhoferhhi/vvenc.git
cd vvenc
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .

Binaries will be available in bin/release-static/

FFmpeg Integration​

Although not officially supported, you can compile your own FFmpeg binary with libvvenc and libvvdec. The tutorial can be found in the official VVenC wiki (archive), I do not want to include it here because some things change every so often and I'm not paid to keep them updated.

Usage​

There are two encoders, the simple encoder (vvencapp) and the full-featured expert mode encoder (vvencFFapp) which is based on the VTM configuration scheme (good luck figuring that out). VVenC used to only accept YUV files input until they added Y4M also (Thank the LORD)

!!! YUV vs Y4M YUV does not carry any of the original video's metadata, which means you'll have to manually input all the necessary parameters such as frame rates, resolution, bit depth, etc. Y4M takes care all of this !!!

A standard input would look like this:

vvencapp -i input.y4m --qp 20 -o output.266

Enhanced, preset slow + qpa + YUV420P10:

vvencapp -i input.y4m --preset slow --qpa on --qp 20 -c yuv420_10 -o output.266

With FFmpeg piping:

ffmpeg -hide_banner -loglevel error -i input.mkv -pix_fmt yuv420p10le -strict -1 -f yuv4mpegpipe - | vvencapp -i - --y4m --preset medium --qpa on --qp 20 -c yuv420_10 -o output.266
danger

For whatever reason, VVenC currently does not support input resolutions below 540p. Don't know why so ask the devs.

QPA

VVenC by default operates with QP (Quantization Parameter), which is basically fixed quality. To enable "CRF-like" mode you need to enable QPA

note for nerds: it modifies the QP both in a spatial and temporal manner combined with temporal RDO.

Muxing​

Since VVenC only outputs raw .266 bitstream files, you can't just shove audio and subtitle streams in there. Instead you can remux them using GPAC MP4Box nightly/beta/git.

You can find all pre-built binaries for Windows, MacOS, and Ubuntu (Linux) right here, Arch Linux users can find mp4box/GPAC in the AUR, and those who aren't listed here can find the build instructions here. It is recommended to do a minimal build since most of the time you don't really need the extra stuff.

VVdeC​

VVdeC is the software decoding implementation for decoding/playing VVC files developed by Fraunhofer HHI. All features of the VVC Main10 features are supported.

Installation​

Arch Linux users: Check AUR.

danger

Compilation requires CMake

tip

The following build procedure should work across all common operating systems

git clone https://github.com/fraunhoferhhi/vvdec.git
cd vvdec
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .

Binaries will be available in bin/release-static/

Decoding​

There are several ways to decode VVC. One of them made simple by the VVCEasy project by Martin Eesmaa. Or you can try the manual way by piping into several programs, MP4Box beta/nightly/git, VVdeC, and a video player of choice summonable via CLI (MPV, VLC, ffplay) is required

mp4box input.mp4 -raw vvc1:output=temp.266 && vvdecapp -v 0 -b temp.266 -o - | ffmpeg -video_size 1920x804 -framerate 24 -pixel_format yuv420p10le -f rawvideo -i - -i input.mp4 -c copy -map 0:v -map 1:a -f nut - | mpv -

Adjust the double input.mp4, -video_size for resolution, -framerate, -pixel_format, and mpv (Video player) accordingly, if not then your video will just play garbled glitches.

temp.266

You might see a new file appearing called temp.266 upon running the command, do not panic. This is completely normal as mp4box needs to output the raw bitstream so vvdec will be able to decode it properly.

- + \ No newline at end of file diff --git a/docs/encoders/aomenc.html b/docs/encoders/aomenc.html index 4021177e8..f9af1b294 100644 --- a/docs/encoders/aomenc.html +++ b/docs/encoders/aomenc.html @@ -11,13 +11,13 @@ - +

aomenc

aomenc or 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.

Choosing forks​

Mainline aomenc is unfortunately not good, as it suffers from bad defaults, heavy focus on PSNR which reduces its psycho-visual capabilities, settings that does X instead of Y, among others. Fortunately two forks were created to combat these, first there's aom-av1-psy which was created by BlueSwordM. But it is no longer maintained as of 13th January 2023, another fork called aom-av1-lavish was then created off of it by Clybius to continue on the legacy.

These forks fix up the horrid decisions made by the original AOM devs and most importantly introduce new parameters and tunes to help fine tune the encoder even more.

TL;DR use aom-av1-lavish.

FFmpeg​

aomenc is available in FFmpeg via libaom-av1, check if you have it by running ffmpeg -h encoder=libaom-av1. You can input non-FFmpeg standard aomenc parameters via -aom-params.

Mainline aomenc

Since FFmpeg encoder libraries come as the most default, barebones as possible (Therefore mainline aomenc), it is not recommended to use it. Unless you build it yourself.

Installation​

Microsoft Windows​

The Easy Way: Download the pre-built versions, which can be found below (Current as of Sept 6, 2023):

https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28

tip

Join the AV1 Discord server and head to #community-builds for updated versions, you can opt to compile it yourself with the instructions below.

The Compiling Route:

Credits

Full credits to u/Turbulent-Bend-7416 on Reddit for this post on how to compile aomenc.

This guide requires MSYS2, specifically MinGW-W64. Install it if you haven't yet.

First, install the required dependencies:

pacman -S cmake git perl yasm nasm python3 doxygen mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel

Now, clone the aom-av1-lavish repo in the Endless_Merging branch and create the folders:

git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging
cd aom-av1-lavish && mkdir -p aom_build && cd aom_build

Then we can start compiling with some build optimizations for your CPU:

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"
make -j$(nproc)

The resulting binary will be available within your home folder of the location where you installed MSYS2 (usually C:), navigate there and the to the aom-av1-lavish folder and it should be there.

Built files should be in the "Debug" folder

caution

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.

MacOS​

macOS is very similar to Linux. Note that some commands may have to be run with sudo, which I won't explicitly include for security reasons.

Homebrew

Installing the Homebrew package manager is a well documented process at this point:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Installing mainline libaom is as simple as running the following:

brew update && brew upgrade
brew install aom

FFmpeg can also be installed via brew.

Building From Source

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:

  • macOS sometimes doesn't have a /usr/local/bin by default. You can fix this by doing mkdir /usr/local/bin.
  • Homebrew installs 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 /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.
  • 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.

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:

git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging
cd aom-av1-lavish

Now, you need to make some manual changes to the source code until this commit is merged to fix build errors.

  • Add the line #include "aq_variance.h" at line 19 in av1/encoder/encodeframe_utils.c
  • 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 };.

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 aom-av1-lavish directory:

mkdir -p aom_build && cd aom_build
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"
make -j$(nproc)
# 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:
make install

Now 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:

% aomenc --help | grep AOMedia -C 3

Included encoders:

av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)

Use --codec to switch to a non-default encoder.

Notice 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.

Linux​

Linux has no prebuilt binaries so you'll have to compile yourself. CMake, Perl, GNU Make, and nasm (assuming x64, if x86 use yasm) will be needed for compilation.

Compiling aom-av1-lavish, all-in-one-command:

git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging
cd aom-av1-lavish && mkdir -p aom_build && cd aom_build
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"
make -j$(nproc)
sudo make install

Usage​

AV1 Encoding​

Simple Y4M input with CQ 22, 1 pass, and raw .ivf bitstream output:

aomenc --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf input.y4m

Pipe from FFmpeg:

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

Pipe from FFmpeg, 2-pass:

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
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
info

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.

AVIF Encoding​

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:

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

Where:

  • -c aom is the encoder
  • -s 4 is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times.
  • -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.
  • -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.
  • -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.
  • 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 -a because it is an aomenc option, not an avifenc one.
  • 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.

Recommendations​

aomenc unfortunately lacks the ability to take advantage of multiple threads, so therefore a tool like Av1an will be needed for parallelization. The parameters shown will be biased towards Av1an usage, so if you plan on using standalone aomenc then adjust as needed.

Here are some recommended parameters:

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

Now let's break it down shall we.

  • --bit-depth=10 We're using 10bit because it makes the video smaller and reduces banding.

  • --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).

  • --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.

  • --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):

    Tiling
Tile usage

Do NOT use tiles for 1080p and below, use 1 tile-columns at 1440p (2K), 2 tile-columns and 1 tile-rows for 2160p (4K)

  • --lag-in-frames=64 Knockoff of x264/x265 Group of Pictures (GOP), makes the encoder look into future frames for better compression decision making, do not go over 64 as it is pretty much useless.

  • --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.

  • --tune-content=psy --tune=ssim As the name suggests they are tunes that affect the video output, for the better, and for the worst.

    info

    Do not use tune-content=psy if you encode live action above cq-level=30.

    info

    If you use any of the VMAF tunes, you need to specify --vmaf-model-path= to where you put VMAF models in.

  • --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.

  • --sb-size=dynamic Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost.

  • --deltaq-mode=0 set to 0 b its better

  • --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.

  • --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.

  • --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

  • --enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1 Parameters that give you free efficiency boost, ignore it.

  • --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).

  • --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.

    Alternative

    You can use photon noise tables as an alternative, which is also conveniently available in Av1an as --photon-noise=X

Tips & Tricks​

  1. Use --butteraugli-resize-factor=2 if you use any of the butteraugli-based tunes to speed it up without much losses (lavish, butteraugli) and --butteraugli-intensity-target=250 to match the content light level.
  2. Use --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.
- + \ No newline at end of file diff --git a/docs/encoders/rav1e.html b/docs/encoders/rav1e.html index 770103bd8..de5189fa1 100644 --- a/docs/encoders/rav1e.html +++ b/docs/encoders/rav1e.html @@ -11,13 +11,13 @@ - +

rav1e

rav1e is a command line application for encoding AV1 written in Rust & Assembly co-developed by Xiph.org and Mozilla.

rav1e is available in FFmpeg via librav1e. You can check if you have it by running ffmpeg -h encoder=librav1e. You can input non-FFmpeg standard rav1e parameters via -rav1e-params. Please keep in mind that unless you build FFmpeg yourself, you are using the most vanilla version of rav1e.

Building​

Linux/macOS​

Pre-built binaries can be found in the releases page on Github. rav1e can also be installed with Cargo by running cargo install rav1e.

Warning

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, git reset --hard [commit hash]

Here are instructions for resetting to release 0.6.6. Omit the git reset command to use the latest git, if you have a specific reason to use the latest git instead of an official tagged release.

git clone https://github.com/xiph/rav1e.git
cd rav1e
git reset --hard 7c9db10494c2fffa98a572027d756e55bf754036
RUSTFLAGS="-C target-cpu=native" cargo build --release

When done, the binary can be found in /target/release. You can then cp /target/release/rav1e /usr/local/bin or wherever you desire the binary to go.

Windows​

git clone https://github.com/xiph/rav1e.git
cd rav1e
git reset --hard 7c9db10494c2fffa98a572027d756e55bf754036
set RUSTFLAGS=-C target-cpu=native
cargo build --release

When done, the binary can be found in target/release

Installation with HDR10+ support

rav1e currently has an unmerged pull request by quietvoid, the person behind hdr10plus_tool and dovi_tool. The PR adds a new parameter called --hdr10plus-json for HDR10+ JSON dynamic metadata input. To merge it locally, do the following:

git clone https://github.com/xiph/rav1e.git
cd rav1e
git reset --hard [release commit]
git fetch origin pull/3000/head:HDR10+

now the patch should be applied, build as usual

AV1​

For AV1 encoding, rav1e has very sane defaults. It is very hard to go wrong with parameters if you modify as few as possible.

Basic usage:

rav1e -i input.y4m -o output.ivf --quantizer 60 --photon-noise 8

Basic usage with FFmpeg piping, 10bit input:

ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 80 --photon-noise 8

Basic usage with FFmpeg piping, 10bit input and assuming 4K:

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
  1. Use 2x1 tiles or tile-columns 2 and tile-rows 1 for 4K (2160p) encoding, this will help with both encoding and decoding.
- + \ No newline at end of file diff --git a/docs/encoders/uvg266.html b/docs/encoders/uvg266.html index 604d17725..73909ff94 100644 --- a/docs/encoders/uvg266.html +++ b/docs/encoders/uvg266.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/encoders/vpxenc.html b/docs/encoders/vpxenc.html index 06c4d2a94..1d1a460ff 100644 --- a/docs/encoders/vpxenc.html +++ b/docs/encoders/vpxenc.html @@ -11,13 +11,13 @@ - +

vpxenc

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

vpxenc is part of the libvpx library for working with the VP9 & VP8 video codecs. It is capable of encoding & decoding both formats, where vpxenc is the multipurpose encoder. VP9 competes with HEVC (h265) & AVC (h264) in coding efficiency, and has been superseded by AV1. VP8 competes with AVC. 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 x265.

Building​

Linux & macOS

To build libvpx from source:

git clone https://chromium.googlesource.com/webm/libvpx
cd libvpx
./configure
make -j [# of CPU threads]

It may be worth digging through the configure options, which can be listed by running ./configure -h. Keeping in mind some flags might be redundant with defaults, here's an example of a tweaked configuration (without VP8 support) for efficient performance on an Apple Silicon Mac running macOS Ventura:

./configure --disable-vp8 --target=arm64-darwin22-gcc --disable-docs --enable-webm-io --enable-vp9-postproc --enable-vp9-highbitdepth --extra-cxxflags="-O3 -flto -march=native" --extra-cflags="-O3 -flto -march=native" --enable-postproc

From the build, a binary will be produced called vpxenc. You can copy this build to /usr/local/bin or execute it directly in the directory, shown below:

./vpxenc --help | grep vp9 -C 3

Included encoders:

vp9 - WebM Project VP9 Encoder v1.13.0 (default)

Use --codec to switch to a non-default encoder.

VP8​

Incomplete

VP9​

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 FFmpeg. This section covers the most important options libvpx-vp9 has to offer, recommended settings, & what they do.

Encoding​

  • --codec=vp9

Self-explanatory.

  • --passes=2

vpxenc's 2-pass mode is quite fast compared to 2-pass in 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.

  • --webm

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 --ivf for an ivf video stream.

  • --good

This is a sort of quality deadline, the minimum speed the encoder is allowed to go to. It isn't recommended to use -–best as it is slow for the quality uplift you get. Do not use RT for anything but real-time encoding.

  • --threads=8

Dictates the number of threads the encoder should spawn. It doesn’t mean it’ll 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.

  • --profile=2

VP9 profile 2 is obligatory if you want 10-bit & 12-bit support for HDR, and improved quality from 8-bit.

  • --lag-in-frames=25

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 –lag-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.

  • --end-usage=q

Q mode is the closest equivalent to CRF that libvpx-vp9 offers, so use it if maximum quality is desired.

  • --cq-level=25

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.

  • --kf-max-dist=[input FPS * 10]

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: --kf-max-dist=240 for 24FPS content, 300 for 30FPS content, 600 for 60FPS content, and so on.

  • --cpu-used=3

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 --cpu-used=3 & below enables RDO, which increases quality at the expense of speed. Another note: --cpu-used=5 and above are slower in the 1st pass, so it isn't recommended to use them anyway.

  • --auto-alt-ref=1

Activates alternate reference frames. Alternate reference frames are "invisible" frames which are used as references when creating the final display frames. This allows the encoder to be a lot more efficient, so always use it. It is the default in the latest standalone vpxenc libvpx-vp9 encoder. --auto-alt-ref=6 can also be used, but be aware that this does require --profile=2 be set as mentioned above.

  • --arnr-maxframes=7

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.

  • --arnr-strength=4

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.

  • --aq-mode=0

Adaptive quantization is the way for an encoder to spend more bits in certain areas to improve psychovisual fidelity. -–aq-mode=0 works well on clean content (animation, video games, screen content). --aq-mode=2 is recommended when you want to give more detail to more complex parts of a video.

  • --frame-boost=1

This flag lets the encoder periodically boost the bitrate of a scene/frame if it needs it. Leaving it at the default --frame-boost=0 is usually a good bet, & this isn't a particularly salient change.

  • --tune-content=default

This determines how the encoder is tuned. In libvpx-vp9, there are three options: default, screen, and 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. --tune-content=screen with --aq-mode=2 is not recommended, as it creates some odd artifacts. It is advised to use --aq-mode=0 if --tune-content=screen is activated, or if you want better perceptual quality, --aq-mode=1.

  • --row-mt=1

Enables row multi-threading in libvpx-vp9. Always enable it no matter what, as it does not hurt efficiency, but boosts speed considerably. This feature is disabled by default.

  • --bit-depth=10

Always use 10-bit for maximum efficiency & minimal banding, even with an 8-bit source. Make sure to enable -–profile=2 as mentioned above.

  • --tile-columns=1

This setting divides the video into tile columns for easier parallelization when encoding & decoding. Setting -–tile-columns=1, you will get 2¹ 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²) for 720p and 1080p, 8 tile columns (2⁴) 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.

  • --tile-rows=0

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’t 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 -–tile-rows=0 & –-tile-columns=0 will result in the highest overall coding efficiency possible with these options.

  • --enable-tpl=1

This option enables a temporal layer model, which helps with coding efficiency. It is the default in the standalone vpxenc libvpx-vp9 encoder.

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:

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 4 -auto-alt-ref 1 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 -f null -
ffmpeg -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 4 -auto-alt-ref 1 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 output.mkv

Alternatively, you can pass a raw .y4m stream to standalone vpxenc & encode that way.

VP9 section written based on work by BlueSwordM, who has granted written permission for this wiki page to exist in its current fashion

- + \ No newline at end of file diff --git a/docs/encoders/x264.html b/docs/encoders/x264.html index fa5824e45..ac36a2a25 100644 --- a/docs/encoders/x264.html +++ b/docs/encoders/x264.html @@ -11,13 +11,13 @@ - +

x264

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.

x264 has great fine detail retention which makes it perfect for high fidelity content.

FFmpeg​

x264 is available in FFmpeg via libx264, to check if you have it, run ffmpeg -h encoder=libx264. You can input non-FFmpeg standard x264 parameters via -x264-params.

Installation​

Pre-built binary [Recommended]:

Choose your operating system there, or you can try using your package manager.

Usage​

x264 has been praised for its simple, easy-to-use, and no fuss settings. Here are some examples:

Simple Y4M input with CRF 20 and raw 264 bitstream output:

x264 --crf 20 -o output.264 input.y4m

Preset slow, CRF 20, Y4M input:

x264 --preset slow --crf 20 -o output.264 input.y4m

FFmpeg piping:

ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.264

FFmpeg piping with MKV output:

ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.mkv
Output Containers

x264 can output 264, MKV, FLV (Flash Video), and MP4 (If compiled with GPAC or L-SMASH support).

caution

x264 will use Haali Matroska Muxer for MKV outputs, which has seeking issues. It is recommended to remux back using FFmpeg or mkvmerge/MKVToolNix.

Recommendations​

As x264 is made to "just work", so there is little to modify in terms of advanced parameters. The general guideline is to just make it as slow as you can bear it.

Lowering presets​

--preset veryslow

The most obvious option, set the preset to the slowest bearable option. You can use placebo if you have a beefy CPU.

Increase threads​

--threads X

By default, x264 uses 12 threads. If you have more than 12, increase it to your CPU's maximum and x264 will completely saturate it.

Open GOP​

--open-gop

Enables Open GOP (Group of Pictures), where each GOP can reference one another, thus improving compression with little speed loss. For unknown reasons it is disabled by default in x264.

AQ Mode 3​

--aq-mode 3

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.

Increasing reference frames​

--bframes 8 --ref 12

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.

Tips and tricks​

  1. x264 is a great alternative when you need to encode lossless video outside of using something like FFV1, utvideo, etc. To do that just encode with --qp 0, using slower presets will decrease the size even further.
Why not CRF 0?

Because CRF automatically adjusts the quantization parameters to achieve the desired quality. QP in the other hand, which stands for Quantization Parameter, you get full control over the quality you'll get. In this case, all-intra or lossless.

- + \ No newline at end of file diff --git a/docs/encoders/x265.html b/docs/encoders/x265.html index 42c4240a3..83eef1e94 100644 --- a/docs/encoders/x265.html +++ b/docs/encoders/x265.html @@ -11,13 +11,13 @@ - +

x265

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

x265 is a software library and command line application for encoding H.265 / HEVC developed by MulticoreWare, written in C++ and x86 assembly, and finally released in 2013.

By default it is not very good for high fidelity content due to the amount of filters it applies even with them disabled. Unlike x264, it is not recommended to do lossless with x265 - but on the other hand, the filters are fantastic for lower bitrate content, which makes x265 insanely popular for low-sized media.

FFmpeg​

x265 is available in FFmpeg via libx265, to check if you have it, run ffmpeg -h encoder=libx265.

Installation​

Pre-built binary [Recommended]:

- + \ No newline at end of file diff --git a/docs/filtering/deband.html b/docs/filtering/deband.html index 7b8eaefac..2d982a57f 100644 --- a/docs/filtering/deband.html +++ b/docs/filtering/deband.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/filtering/dehalo.html b/docs/filtering/dehalo.html index f6afd4e5e..6f409b37c 100644 --- a/docs/filtering/dehalo.html +++ b/docs/filtering/dehalo.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/filtering/deinterlace.html b/docs/filtering/deinterlace.html index 7115f0a60..7903c6726 100644 --- a/docs/filtering/deinterlace.html +++ b/docs/filtering/deinterlace.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/filtering/denoise.html b/docs/filtering/denoise.html index c6870b59c..4222fe4c9 100644 --- a/docs/filtering/denoise.html +++ b/docs/filtering/denoise.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/filtering/detelecine.html b/docs/filtering/detelecine.html index e718417bf..1f9ff6717 100644 --- a/docs/filtering/detelecine.html +++ b/docs/filtering/detelecine.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/filtering/intro.html b/docs/filtering/intro.html index fe5a92ba2..f9141f3a9 100644 --- a/docs/filtering/intro.html +++ b/docs/filtering/intro.html @@ -11,13 +11,13 @@ - +

Intro

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

In the future, you will definitely come into contact with less than ideal or even downright terrible media, like a ton of film grain/unwanted noise that explodes the bitrate because of their randomness, annoying banding, random halos. Or even in more extreme cases, Interlaced and telecined videos you might come across because they're old and nobody cared about restoring them.

This is where filtering comes into play, currently there are three players in the filtering game. FFmpeg, Vapoursynth, and Avisynth. This wiki will only cover Vapoursynth (and FFmpeg when relevant) as it is intended as a replacement to Avisynth, you will need to understand a bit of Python as filtering involves a bit of scripting.

Lore​

VapourSynth is supposed to be an upgrade and 21st century rewrite for Avisynth, created by Ben Rudiak-Gould, Edwin van Eggelen, Klaus Post, Richard Berg and Ian Brabham in May 2000. One of the most attractive feature from the full rewrite is better multithreading which Avisynth suffered a lot from due to it's very old infrastructure, despite this some Avisynth veterans refuse to move over because they're already used to their workflow (There is nothing inherently wrong with this).

- + \ No newline at end of file diff --git a/docs/filtering/vapoursynth.html b/docs/filtering/vapoursynth.html index ca74af932..90bc07540 100644 --- a/docs/filtering/vapoursynth.html +++ b/docs/filtering/vapoursynth.html @@ -11,13 +11,13 @@ - +

Vapoursynth

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

Vapoursynth script

"VapourSynth is an application for video manipulation. Or a plugin. Or a library. It’s hard to tell because it has a core library written in C++ and a Python module to allow video scripts to be created."

-- Fredrik Mellbin, creator of VapourSynth

Installation​

Microsoft Windows​

  • At the current time of writing, Python 3.11 is required. This will change in the future so consult from their website
  • Download the installer (.exe) unless you have a reason for using portable
  • Install it
- + \ No newline at end of file diff --git a/docs/images/AVIF.html b/docs/images/AVIF.html index a06335567..45f5f5805 100644 --- a/docs/images/AVIF.html +++ b/docs/images/AVIF.html @@ -11,14 +11,14 @@ - +

AVIF

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

AVIF, which stands for AV1 Image File Format, is a newer image codec that is based on the AV1 video codec. AVIF supersedes 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 WebP, HEIC, & JPEG. AVIF is often compared to JPEG-XL, though in practice, the two have very different strengths.

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.

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.

Performance Checklist​

Lossless? Poorly

Lossy? Yes

Supported Bit Depths: 8 BPC, 10 BPC, 12 BPC

HDR/Wide Gamut? Yes

Animation? Yes

Transparency? Yes

Progressive Decode? No

Royalty Free? Yes

Compatible Browsers (full support)

Pros​

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.

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.

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.

Cons​

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:

AVIF Encoding with aomenc through avifenc

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:

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

Where:

  • `-c aom` is the encoder
  • `-s 4` is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times.
  • `-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.
  • `-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.
  • `-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.
  • `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 `-a` because it is an aomenc option, not an avifenc one.
  • `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.

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.

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.

Finally, AVIF's lossless mode is incredibly underwhelming, often producing larger files than PNG. When compressing losslessly, avoid AVIF entirely.

Conclusion​

While AVIF is certainly promising, its shortcomings

- + \ No newline at end of file diff --git a/docs/images/GIF.html b/docs/images/GIF.html index 113bd274a..a3481585d 100644 --- a/docs/images/GIF.html +++ b/docs/images/GIF.html @@ -11,14 +11,14 @@ - +
-

GIF

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

Graphics Interchange Format (GIF) is an image file format first releasedby CompuServe in 1987. It remains popular due to it's widespread support for animated images despite it's obsolesence in efficency.

Performance Checklist​

Lossless? Yes

Lossy? No

Supported Bit Depth: +

GIF

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 AVIF & Animated WebP have since surpassed GIF in functionality, as has the animated PNG variant APNG.

Performance Checklist​

Lossless? Yes

Lossy? No

Supported Bit Depth: 256 colors

HDR/Wide Gamut? No

Animation? Yes

Transparency? Yes

Progressive Decode? No

Royalty Free? Yes

- + \ No newline at end of file diff --git a/docs/images/HEIC.html b/docs/images/HEIC.html index a0a6d437b..910f8b741 100644 --- a/docs/images/HEIC.html +++ b/docs/images/HEIC.html @@ -11,14 +11,14 @@ - +
-

HEIC

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

Performance Checklist​

Lossless? No

Lossy? Yes

Supported Bit Depths: +

HEIC

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 JPEG. HEIC files use 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 AVIF, which uses the same container to store AV1-compressed images.

Performance Checklist​

Lossless? No

Lossy? Yes

Supported Bit Depths: 8 BPC, 10 BPC

Higher bit depths not widely supported

HDR/Wide Gamut? Yes

Animation? Yes

Transparency? Yes

Progressive Decode? No

Royalty Free? No

- + \ No newline at end of file diff --git a/docs/images/JPEG.html b/docs/images/JPEG.html index cdeb338a9..2f704df97 100644 --- a/docs/images/JPEG.html +++ b/docs/images/JPEG.html @@ -11,14 +11,14 @@ - +
-

JPEG

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

Pending Review

The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.

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 compression.

Performance Checklist​

Lossless? No

Lossy? Yes

Supported Bit Depth: +

JPEG

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

Pending Review

The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.

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.

Performance Checklist​

Lossless? No

Lossy? Yes

Supported Bit Depth: 8 BPC

HDR/Wide Gamut? Kinda

Animation? No

Transparency? No

Progressive Decode? Yes

Royalty Free? Yes

Compression​

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:

Color Space Conversion​

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 4:2:0 subsampling.

Image Tiling​

The image is divided into smaller blocks or tiles, typically 8x8 pixels each. Each of these blocks will be processed separately.

Discrete Cosine Transform (DCT)​

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.

Quantization​

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.

Zigzag Scanning​

The quantized coefficients are then reordered using a zigzag pattern. This is done to prepare the data for the next step.

Run-Length Encoding​

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.

Entropy Encoding​

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.

Saving the File​

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.

Decoding​

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.

It's important to note that JPEG compression is 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 PNG, WebP's lossless mode, and 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.

While JPEG is certainly not the most state of the art lossy image codec compared to its newer and (usually) better successors like JPEG-XL (an actual direct successor) & 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.

- + \ No newline at end of file diff --git a/docs/images/JPEG2000.html b/docs/images/JPEG2000.html index b6b945b9c..af1772fb7 100644 --- a/docs/images/JPEG2000.html +++ b/docs/images/JPEG2000.html @@ -11,13 +11,13 @@ - + - +

JPEG 2000

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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.

+ \ No newline at end of file diff --git a/docs/images/JXL.html b/docs/images/JXL.html index 33a7eacad..ab2b4f6e9 100644 --- a/docs/images/JXL.html +++ b/docs/images/JXL.html @@ -11,14 +11,14 @@ - +
-

JPEG-XL

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

Performance Checklist​

Lossless? Yes

Lossy? Yes

Supported Bit Depths: +

JPEG-XL

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

JPEG-XL 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.

Performance Checklist​

Lossless? Yes

Lossy? Yes

Supported Bit Depths: Up to 32 BPC

HDR/Wide Gamut? Yes

Animation? Yes

Transparency? Yes

Progressive Decode? Yes

Royalty Free? Yes

- + \ No newline at end of file diff --git a/docs/images/PNG.html b/docs/images/PNG.html index 934cc1f37..81628b413 100644 --- a/docs/images/PNG.html +++ b/docs/images/PNG.html @@ -11,14 +11,14 @@ - +

PNG

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

Portable Network Graphics (PNG) is a free lossless image file format released in 1996. It was ceated as an alternative to GIF, which was at the time a proprietary format.

Performance Checklist​

Lossless? Yes

Lossy? No

Supported Bit Depths: 8 BPC, 16 BPC

HDR/Wide Gamut? Yes

Animation? Yes

Transparency? Yes

Progressive Decode? Kinda

Royalty Free? Yes

- + \ No newline at end of file diff --git a/docs/images/WebP.html b/docs/images/WebP.html index 45b7975f8..cb3387763 100644 --- a/docs/images/WebP.html +++ b/docs/images/WebP.html @@ -3,7 +3,7 @@ -WebP | Codec Wiki +WebP | Codec Wiki @@ -11,14 +11,14 @@ - +
-

WebP

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 [VP8] video codec, and a novel lossless mode added in 2011.

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

Performance Checklist​

Lossless? Yes

Lossy? Yes

Supported Bit Depth: +

WebP

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 VP8 video codec, and a novel lossless mode added in 2011.

Performance Checklist​

Lossless? Yes

Lossy? Yes

Supported Bit Depth: 8 BPC

HDR/Wide Gamut? No

Animation? Yes

Transparency? Yes

Progressive Decode? No

Royalty Free? Yes

- + \ No newline at end of file diff --git a/docs/introduction/high-dynamic-range.html b/docs/introduction/high-dynamic-range.html index 6b14824b6..2a06d5b13 100644 --- a/docs/introduction/high-dynamic-range.html +++ b/docs/introduction/high-dynamic-range.html @@ -11,13 +11,13 @@ - +

High Dynamic Range

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.

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.

HLG​

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.

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.

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.

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.

HDR10​

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.

HDR10+​

HDR10+ is basically an upgrade to the previous HDR10 by adding dynamic metadata support (in .json) to optimize each scene's content light level as the director intended.

Dolby Vision​

Dolby Vision is proprietary HDR format developed by Dolby Laboratories and a direct competitor to HDR10+.

- + \ No newline at end of file diff --git a/docs/introduction/prologue.html b/docs/introduction/prologue.html index ba9b87c3a..009884287 100644 --- a/docs/introduction/prologue.html +++ b/docs/introduction/prologue.html @@ -11,13 +11,13 @@ - +

Prologue

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.

What This Isn't​

The Codec Wiki is 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 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.

What is a Codec​

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 discarding less salient data using 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:

  • Video compression: Video codecs like H.264, VP9 & 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.
  • Audio compression: Audio codecs like MP3, AAC, and Opus compress audio files like songs & podcasts. This allows them to be easily distributed & stored.
  • Image Compression: Image codecs, whether tried and true like JPEG or brand new like 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.
  • Data Compression: General compression algorithms like ZIP & zstd are designed to compress any kind of data, not just multimedia specific data. This includes web assets, executables, text archives, and even entire filesystems.

In summary, 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.

What You Need​

A rather informal list of requirements follows.

You will benefit greatly from:

  • Patience.
  • A willingness to learn, engage in curiousity, & follow instructions
  • Basic to intermediate computer proficiency.

If you're only here to learn the tools, it will be very beneficial to have:

  • Higher-end CPU hardware, which will decrease wait times for some larger encoding workloads discussed here.
  • A level of comfort with CLI utilities, or enough motivation to engage with them in the absence of background knowledge.
  • A device running an Arch-based Linux distribution, excluding Manjaro
Why Arch?

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 like yay

- + \ No newline at end of file diff --git a/docs/introduction/psychovisual.html b/docs/introduction/psychovisual.html index e089c2f66..5b6a017df 100644 --- a/docs/introduction/psychovisual.html +++ b/docs/introduction/psychovisual.html @@ -11,13 +11,13 @@ - +

Psycho-visual

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

Pending Review

The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.

"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 “correct”, which is why they are disabled for research purposes, they should be enabled for content intended for “human eyes”. "

-- Kokomins' x265 guide

In English​

Encoders favor blurring out fine details whenever possible because that is what's mathematically correct, but the human eye prefers them to look sharp. Just like how Tiktok users say "16K quality" whenever an oversharpened image of a waifu upscaled using AI is posted. But the encoder says "hell no wtf" because it doesn't "fit" correctly with the other blocks. But "Psycho-visual" options that exist combat this by giving some needed "confidence" to the encoder that it's okay to put in the wrong blocks.

Although blurring also have their benefits especially at lower bitrates, because at that point there's not much detail to retain from the original source form, you do prefer to look at a blurry picture than a blocky DCT mess right? As always, setting psycho-visual options too high is also bad. Experiment and find the sweet spot for your type of content.

- + \ No newline at end of file diff --git a/docs/introduction/terminology.html b/docs/introduction/terminology.html index 87cd5f701..74ade5e83 100644 --- a/docs/introduction/terminology.html +++ b/docs/introduction/terminology.html @@ -11,13 +11,13 @@ - +

Terminology

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.

Bitstream​

A bitstream or bit stream is a media file, the kind that is played in a media player. It consists of a container wrapping multiple elementary streams

Elementary stream​

An elementary stream is an audio, video, or subtitle track. Basically, it's the compressed data you want to mux into the container.

Muxing​

Putting elementary streams into a container, which preserves them without making any changes to the data.

Codec​

A codec (coder/decoder) 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 in the prologue.

Filter​

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.

Muxer/Demuxer​

The pieces of code that mux or do the reverse, getting elementary streams from the container.

Bitstream filter​

A bitstream filter is a filter that is directly applied to the bitstream in order to change something about the container, for instance, convert frame types, or corrupt some packets.

Container​

A container is a format for putting one or more elementary streams into one file, which is then called a bitstream.

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.

Some kinds of containers:

MP4 / M4V​

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 H.264, H.265, H.266, DivX, Xvid, VP9 (Unofficial, hacky), and AV1 (Unofficial, hacky). For audio codecs it's many of the various flavors of AAC, MP3, FLAC (Unofficial), Opus (Unofficial, hacky). For subtitles only MPEG-4 Timed Text (TTXT) is supported.

The best tool to work with this container is MP4Box, but FFmpeg also works.

MOV​

Similar to MP4, but less supported. Made with Apple Quicktime in mind, supports ProRes.

MKV / MKA / MKS / MK3D​

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.

WebM​

A container made with web streaming in mind. WebM is stripped-down MKV that only allows free & open source codecs such as VP8, VP9 & AV1 for video, Vorbis & Opus for audio, and WebVTT for subtitles.

Transcoding​

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 FFV1 video to lossy AV1 using an encoder, let's say rav1e, I have transcoded this lossless video to AV1. Transcoding doesn't have anything to do with the container.

RDO​

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 PSNR or SSIM.

Perceputal / Psychovisual / Psychoacoustic​

"Psychovisual quality" (for videos), "Psychoacoustic quality" (for audio), or "perceptual quality" is a term used to describe the perception of quality of a distorted video by the human visual system. The goal of any multimedia codec is to minimize data while maintaining perceived quality, and optimizing around human perception theoretically yields the best performance even within a limited set of coding techniques (like when using an older codec). Our model of human perception continues to evolve, and there is currently no such thing as a perfect model of the human visual system available. The current best available options in the form of metrics appear to be SSIMULACRA2 & Butteraugli.

Discrete Cosine Transform (DCT)​

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 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.

- + \ No newline at end of file diff --git a/docs/introduction/video-artifacts.html b/docs/introduction/video-artifacts.html index e532a3532..311bb913d 100644 --- a/docs/introduction/video-artifacts.html +++ b/docs/introduction/video-artifacts.html @@ -11,13 +11,13 @@ - +

Spotting Video Artifacts

XKCD about compression artifacts

https://xkcd.com/2414

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’re time/sequence-based (temporal) or location-based (spatial). If you can see the artifact when the video is paused, then it’s probably a spatial artifact. If it’s much more visible while the video plays, then it’s likely temporal.

MoirÊ Pattern​

MoirÊ pattern on a brick building

MoirÊ 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

Staircase Effect​

Staircase Effect

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.

Color Bleed​

Color Bleed

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.

Ringing​

Ringing artifact on a star symbol

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.

Blocking​

Blocking artifacts on a cat

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.

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.

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.

Banding/Contouring​

Banding

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.

Mosquito Noise​

Mosquito noise surrounding an iron fence

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.

- + \ No newline at end of file diff --git a/docs/metrics/PSNR.html b/docs/metrics/PSNR.html index ff90fe50d..fe734a962 100644 --- a/docs/metrics/PSNR.html +++ b/docs/metrics/PSNR.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/metrics/SSIM.html b/docs/metrics/SSIM.html index c5bffa6c8..911f8a19f 100644 --- a/docs/metrics/SSIM.html +++ b/docs/metrics/SSIM.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/metrics/SSIMULACRA2.html b/docs/metrics/SSIMULACRA2.html index e2b71495b..e6c6b42d1 100644 --- a/docs/metrics/SSIMULACRA2.html +++ b/docs/metrics/SSIMULACRA2.html @@ -11,13 +11,13 @@ - +

SSIMULACRA2

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 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.

- + \ No newline at end of file diff --git a/docs/metrics/VMAF.html b/docs/metrics/VMAF.html index b0258c075..7a480b0bc 100644 --- a/docs/metrics/VMAF.html +++ b/docs/metrics/VMAF.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/metrics/butteraugli.html b/docs/metrics/butteraugli.html index 3d74fd762..a5940d827 100644 --- a/docs/metrics/butteraugli.html +++ b/docs/metrics/butteraugli.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/privacy-policy.html b/docs/privacy-policy.html index 6d892be2a..1d3c82926 100644 --- a/docs/privacy-policy.html +++ b/docs/privacy-policy.html @@ -11,13 +11,13 @@ - +

Privacy Policy

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.

Furthermore, this site uses a self-hosted instance of 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.

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.

We do not employ the use of cookies. The following information is collected:

  • Page URL
  • HTTP Referer
  • Browser & Browser Version
  • Operating System type & version
  • Device type
  • Country, region, & city

Given this information, we ensure:

  • 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 analytics page
  • Analytics data isn't explicitly sent to any third parties
  • Analytics data is not monetized

As a wiki dedicated to making multimedia codec knowledge more accessible, analytics information is made public via our analytics page.

You may opt out with various means of ad & tracker blocking. An example would be UBlock Origin, which blocks our analytics script.

If you have any questions, comments or concerns, you may reach out to site maintainer Gianni Rosato via grosatowork@proton.me.

Last updated 12 September 2023

- + \ No newline at end of file diff --git a/docs/resources.html b/docs/resources.html index 756af32d3..e253fa250 100644 --- a/docs/resources.html +++ b/docs/resources.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/subtitles/SRT.html b/docs/subtitles/SRT.html index 41cb17dd1..5f768cd3d 100644 --- a/docs/subtitles/SRT.html +++ b/docs/subtitles/SRT.html @@ -11,13 +11,13 @@ - +

SRT

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.

Format​

Subtitles are placed into sequentially ordered groups, with a starting and ending timestamp, encoded hours:minutes:seconds,milliseconds. Note the seperator for the millisecond value is a comma. The starting and ending value are seperated by -->.

Unoffical features​

Some basic HTML tags are supported by some viewers, such as:

  • <b>bold</b> bold
  • <i>italics</i> italics
  • <u></u> underlined
  • <font color="#0000FF">Blue</font> colored text.

Note these will be displayed verbatim on viewers that don't support these features.

Example​

1
00:00:00,000 --> 00:01:00,000
This subtitle will be visible for the first minute of the stream

2
00:01:00,000 --> 00:01:30,000
and this one for thirty seconds after that.
- + \ No newline at end of file diff --git a/docs/subtitles/webvtt.html b/docs/subtitles/webvtt.html index 0db0b0c14..3451e4d79 100644 --- a/docs/subtitles/webvtt.html +++ b/docs/subtitles/webvtt.html @@ -11,7 +11,7 @@ - + @@ -24,7 +24,7 @@ settings go here], then all the text to be displayed goes after it. That text can have some HTML-like formatting in it. To learn about them, see the documentation.

Example​

WEBVTT

00:01.000 --> 00:04.000
- Never drink liquid nitrogen.

00:05.000 --> 00:09.000
- It will perforate your stomach.
- You could die.
- + \ No newline at end of file diff --git a/docs/terms-of-use.html b/docs/terms-of-use.html index 036ead50f..d636dbb36 100644 --- a/docs/terms-of-use.html +++ b/docs/terms-of-use.html @@ -11,13 +11,13 @@ - +

Terms of Use

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.

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.

The following terminology applies to these Terms & Conditions & all other Agreements: “Client”, “You” & “Your” refers to you, the person log on this website & compliant to these terms & conditions. “Ourselves”, “We”, “Our” & “Us”, refers to the site's owner. “Party”, “Parties”, or “Us”, 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.

  1. Cookies

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.

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.

  1. Licensing

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: 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.

Under CC BY-SA 4.0, you may:

Share - copy and redistribute the material in any medium or format.

Adapt - remix, transform, and build upon the material for any purpose, even commercially.

No party can revoke these freedoms as long as you follow the license terms. The terms are as follows:

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.

ShareAlike - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.

Contributors may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.

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.

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.

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.

You warrant & represent that:

You are entitled to post the Comments/contributions on our website & have all necessary licenses & consents to do so;
The Comments/contributions do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party;
The Comments/contributions do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy
The Comments/contributions will not be used to promote unlawful activity.

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.

  1. iFrames

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.

  1. Content Liability

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.

  1. Your Privacy

Please read our Privacy Policy.

  1. Reservation of Rights

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.

  1. Removal of links from our website

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.

  1. Disclaimer

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:

limit or exclude our or your liability for death or personal injury;
limit or exclude our or your liability for fraud or fraudulent misrepresentation;
limit any of our or your liabilities in any way that is not permitted under applicable law; or
exclude any of our or your liabilities that may not be excluded under applicable law.

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.

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.

- + \ No newline at end of file diff --git a/docs/utilities/Aviator.html b/docs/utilities/Aviator.html index 45924a1c4..140cfdc92 100644 --- a/docs/utilities/Aviator.html +++ b/docs/utilities/Aviator.html @@ -11,13 +11,13 @@ - +

Aviator

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 smart defaults implemented via its SVT-AV1 encoder.

Aviator Splash

Installation​

Aviator is available on Flathub as a Flatpak. You can learn how to set up Flatpak on your distro of choice here.

Download on Flathub

Aviator's rationale behind using Flatpak is to ship its own dependencies & ensure users across every distro have a cohesive experience with the latest up-to-date SVT-AV1 implementation that is best for visual quality.

Aviator's Defaults​

Hovering over most user configurable options in Aviator will produce a helpful tooltip that you can look at to make things more clear.

Perceptual Optimization​

Aviator doesn't use mainline SVT-AV1, but rather uses a fork maintained for perceptual quality. It includes several unique changes, including a custom SSIM RDO tune that isn't included in mainline SVT-AV1.

Aviator's default FFmpeg command uses the following SVT-AV1 parameters:

-c:v libsvtav1 -crf X -preset X -pix_fmt yuv420p10le -svtav1-params film-grain=X:input-depth=10:tune=2:enable-qm=1:scd=1:enable-overlays=1:film-grain-denoise=X

Video​

Aviator Video Settings

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 here. Speed 6 offers a good balance between speed & compression efficiency at any CRF level.

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.

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.

Audio​

Aviator Audio Settings

The default bitrate for Opus audio is 48kb/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.

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.

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.

Output​

Aviator Output UI

The container your video is stored in is associated with the file extension. Aviator offers two options for video output: the Matroska video container & the 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 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.

Credits​

Actively developed by Gianni Rosato.

- + \ No newline at end of file diff --git a/docs/utilities/FFMetrics.html b/docs/utilities/FFMetrics.html index 155da7e24..6a3df9c58 100644 --- a/docs/utilities/FFMetrics.html +++ b/docs/utilities/FFMetrics.html @@ -11,13 +11,13 @@ - +

FFMetrics

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

FFMetrics is a graphical user interface (GUI) for FFmpeg that allows you to visualize video quality metrics. You can select files without using the command line, and FFMetrics will calculate and visualize the PSNR, SSIM, and VMAF quality metrics for all of them in one go using graphs and numbers.

- + \ No newline at end of file diff --git a/docs/utilities/MKVToolNix.html b/docs/utilities/MKVToolNix.html index 92fc4ceb1..b646619c6 100644 --- a/docs/utilities/MKVToolNix.html +++ b/docs/utilities/MKVToolNix.html @@ -11,13 +11,13 @@ - +

MKVToolNix

MKVToolNix is FOSS GUI frontend to a set of tools (mkvmerge, mkvinfo, mkvpropedit, mkvextract) to create, alter and inspect Matroska files under Linux, other *NIXes and Windows.

MKVToolNix Workload

Installation​

Fortunately, Moritz Bunkus (Creator) is sane enough to provide downloads for pretty much all popular desktop operating systems.

Usage​

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.

Tips and tricks​

  1. You can import unencrypted BDMV (index.bdmv) or Blu-ray playlist files into MKVToolNix and it will prompt you to select which stream you would want to import.
  2. You can set a WebM output in Output > Miscellaneous > "Create WebM compliant file"
  3. You can split videos in multiple ways in Output > Splitting. Best of all? No freeze frames unlike in FFmpeg and no re-encoding required.
  4. You can edit metadata without remuxing (Albeit rather limited) in the "Header Editor".
- + \ No newline at end of file diff --git a/docs/utilities/YUView.html b/docs/utilities/YUView.html index d6d090c88..b2b255847 100644 --- a/docs/utilities/YUView.html +++ b/docs/utilities/YUView.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/utilities/av1an.html b/docs/utilities/av1an.html index eb1f5f3c0..00a1fe9a3 100644 --- a/docs/utilities/av1an.html +++ b/docs/utilities/av1an.html @@ -11,13 +11,13 @@ - +

Av1an

Av1an with 96 workers

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.

Prerequisites​

Since Av1an is just a tool that helps with parallelization, you'll need to have the following installed for the entire thing to work:

Installation​

Microsoft Windows​

GUI:

  1. Install Nmkoder which is a GUI front-end to av1an with all dependencies installed
  2. You're done!
Outdated Software

Since Nmkoder already ships everything by default and it's last release was 29th March 2022. You need to manually update EVERYTHING (av1an.exe, aomenc.exe, etc) to get performance optimizations, better speeds, and more settings. Missing out on updates will result in your encodes being sub-optimal.

Pre-built binary, bleeding edge [Recommended]:

  • Download Av1an from here, select "Latest" and click the "Assets" dropdown. Put it in PATH

MacOS​

To be filled.

Linux​

The Easy Way:

Install rAV1ator, a GUI frontend for Av1an & the rust-based rav1e encoder.

note

Keep in mind Aviator only ships with SVT-AV1 and rAV1ator with rav1e instead of Aomenc/AOM-AV1.

The compiling route:

Prerequisites:

  • Vapoursynth
  • FFmpeg
  • MKVToolNix (mkvmerge)
  • Git
  • Perl
  • Nasm
  • Rust (Use rustup on Debian/Ubuntu, as the package manager version is horribly outdated)
  • Highway (libhwy)
git clone https://github.com/master-of-zen/Av1an.git
cd Av1an
RUSTFLAGS="-C target-cpu=native" cargo build --release

after done, the binary will be located in target/release, copy it to somewhere like /usr/bin or /usr/local/bin

Docker​

The following examples assume the file you want to encode is in your current working directory.

docker run --privileged -v "$(pwd):/videos" --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}
info

To specify a different directory to use you would replace $(pwd) with the directory

docker run --privileged -v "/c/Users/masterofzen/Videos":/videos --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}

The --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.

Troubleshooting​

  1. mkvmerge "Open file error" on Linux - Run ulimit -n 20000
  2. Gray screen flashing for a single frame in output - Create a lossless intermediary with x264 -qp 0
- + \ No newline at end of file diff --git a/docs/utilities/dovi_tool.html b/docs/utilities/dovi_tool.html index 379030f19..3074086cc 100644 --- a/docs/utilities/dovi_tool.html +++ b/docs/utilities/dovi_tool.html @@ -11,13 +11,13 @@ - +

dovi_tool

dovi_tool is a command line tool written in Rust combining multiple utilities for working with Dolby Vision.

Installation​

  • Download pre-built binaries from here

or

  • Compile yourself (Rust must be installed, minimum v1.64.0 at the time of writing)
git clone https://github.com/quietvoid/dovi_tool.git
cd dovi_tool
RUSTFLAGS="-C target-cpu=native" cargo build --release

on Windows:

git clone https://github.com/quietvoid/dovi_tool.git
cd dovi_tool
set RUSTFLAGS=-C target-cpu=native
cargo build --release

Usage​

dovi_tool [OPTIONS] <SUBCOMMAND>

To get more detailed options for a subcommand

dovi_tool <SUBCOMMAND> --help
- + \ No newline at end of file diff --git a/docs/utilities/eac3to.html b/docs/utilities/eac3to.html index fd98e9bf2..94fe8fc33 100644 --- a/docs/utilities/eac3to.html +++ b/docs/utilities/eac3to.html @@ -11,13 +11,13 @@ - +

eac3to

eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV).

Compatibility

This is a Windows only software, although usage with Wine is possible.

Avoid using when possible

There is absolutely no reason whatsoever to use this software unless required by paleolithic private trackers, due to a bajillion dependencies needed that aren't bundled with the download itself. Use something like FFmpeg instead.

Installation​

  • Download from VideoHelp, drag and drop into your designated folder, add to PATH when necessary.

Usage​

Audio conversion​

Examples:

eac3to source.pcm destination.flac

(Convert PCM audio to FLAC)

eac3to source.thd destination.flac destination.ac3

(Convert TrueHD to FLAC while also extracting the AC-3 compatibility layer)

Get BDMV info​

eac3to Movie.2024.Bluray/BDMV

Demux​

eac3to Movie.2024.Bluray/BDMV -demux

Delay audio​

eac3to input.eac3 output.eac3 1000ms
- + \ No newline at end of file diff --git a/docs/utilities/ffmpeg.html b/docs/utilities/ffmpeg.html index 628ba5e23..f6c97bb4a 100644 --- a/docs/utilities/ffmpeg.html +++ b/docs/utilities/ffmpeg.html @@ -11,13 +11,14 @@ - +
-

FFmpeg

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

FFmpeg is a multimedia framework that has utilities for transcoding, transmuxing, and filtering audio and video. It provides the ffmpeg, ffprobe, and ffplay command-line utilities. It also features the libav* libraries, which allow you to use the functionality of FFmpeg without the programs.

Installation

There are a number of ways to install FFmpeg depending on the operating system you're using.

Linux & macOS​

Package Manager

The easiest way to obtain FFmpeg is through your package manager. On most package managers, the package is simply named ffmpeg, however ffprobe and ffplay may have their own packages. Note that the packages may be outdated.

Compiling from source

A more complete guide is available at the FFmpeg Compilation Guide. Simplifying things a bit, what you need to do is:

  • grab the sources or clone from FFmpeg's git: git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
  • Enter the directory & run ./configure --help to see a list of features and libraries you can choose to build with.
  • Install all libraries you want to build FFmpeg with.
  • Run ./configure with all --enable- flags you want.
  • Run make, or make -j $(nproc) on Linux to properly make use of multiple cores. on macOS, this would be make -j $(sysctl -n hw.ncpu).
  • Run make install. May require root.

Windows​

To be filled.

Using FFmpeg

ffmpeg is the primary command-line tool of FFmpeg. It takes 0 or more bitstreams as inputs & outputs.

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, ffmpeg -r 24 -i file1 file2 applies the -r 24 option to the input file1, interpreting the video as having that frame rate, while ffmpeg -i file1 -r 24 file2 applies the -r 24 option to file2. To get a list of options, refer to the FFmpeg documentation.

Video Transcoding

ffmpeg -i input -c:v video_codec -b:v video_bitrate -c:a audio_codec -b:a audio_bitrate output

OptionMeaning
-c:v video_encodercodec for the automatically selected video stream
-b:v video_bitratebitrate for the automatically selected video stream
-c:a audio_codeccodec for the automatically selected audio stream
-b:a audio_bitratebitrate for the automatically selected audio stream

Transmux a video​

ffmpeg -i input -c copy output

OptionMeaning
-c copyset the codec to copy

Filter a video​

ffmpeg -i input -c:v video_encoder -c:a audio_codec (...) -vf filter_name output

OptionMeaning
-vf filter_nameset the video filter to filter_name

References​

Special thanks to 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.

- +

FFmpeg

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

FFmpeg is a multimedia framework that has utilities for transcoding, transmuxing, and filtering audio and video. It provides the ffmpeg, ffprobe, and ffplay command-line utilities. It also features the libav* libraries, which allow you to use the functionality of FFmpeg without the programs.

Installation

There are a number of ways to install FFmpeg depending on the operating system you're using.

Linux & macOS​

Package Manager

The easiest way to obtain FFmpeg is through your package manager. On most package managers, the package is simply named ffmpeg, however ffprobe and ffplay may have their own packages. Note that the packages may be outdated.

Compiling from source

A more complete guide is available at the FFmpeg Compilation Guide. Simplifying things a bit, what you need to do is:

  • grab the sources or clone from FFmpeg's git: git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
  • Enter the directory & run ./configure --help to see a list of features and libraries you can choose to build with.
  • Install all libraries you want to build FFmpeg with.
  • Run ./configure with all --enable- flags you want.
  • Run make, or make -j $(nproc) on Linux to properly make use of multiple cores. on macOS, this would be make -j $(sysctl -n hw.ncpu).
  • Run make install. May require root.

Windows​

To be filled.

Using FFmpeg

ffmpeg is the primary command-line tool of FFmpeg. It takes 0 or more bitstreams as inputs & outputs.

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, ffmpeg -r 24 -i file1 file2 applies the -r 24 option to the input file1, interpreting the video as having that frame rate, while ffmpeg -i file1 -r 24 file2 applies the -r 24 option to file2. To get a list of options, refer to the FFmpeg documentation.

Video Transcoding

ffmpeg -i input -c:v video_codec -b:v video_bitrate -c:a audio_codec -b:a audio_bitrate output

OptionMeaning
-c:v video_encodercodec for the automatically selected video stream
-b:v video_bitratebitrate for the automatically selected video stream
-c:a audio_codeccodec for the automatically selected audio stream
-b:a audio_bitratebitrate for the automatically selected audio stream

Transmux a video​

ffmpeg -i input -c copy output

OptionMeaning
-c copyset the codec to copy

Filter a video​

ffmpeg -i input -c:v video_encoder -c:a audio_codec (...) -vf filter_name output

OptionMeaning
-vf filter_nameset the video filter to filter_name

References: +multimediawiki-howtos: HOWTO Search Results - MultimediaWiki

Special thanks to 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.

+ \ No newline at end of file diff --git a/docs/utilities/hdr10plus_tool.html b/docs/utilities/hdr10plus_tool.html index 31353018c..661d8085a 100644 --- a/docs/utilities/hdr10plus_tool.html +++ b/docs/utilities/hdr10plus_tool.html @@ -11,13 +11,13 @@ - +

hdr10plus_tool

hdr10plus_tool is a command line tool written in Rust for working with HDR10+ in HEVC files. Previously named hdr10plus_parser, now it's more than just a parser.

Installation​

  • Download pre-built binaries from here

or

  • Compile yourself (Rust must be installed, minimum v1.57.0 at the time of writing)
git clone https://github.com/quietvoid/hdr10plus_tool.git
cd hdr10plus_tool
RUSTFLAGS="-C target-cpu=native" cargo build --release

on Windows:

git clone https://github.com/quietvoid/hdr10plus_tool.git
cd hdr10plus_tool
set RUSTFLAGS=-C target-cpu=native
cargo build --release

Usage​

hdr10plus_tool [OPTIONS] <SUBCOMMAND>

To get more detailed options for a subcommand

hdr10plus_tool <SUBCOMMAND> --help

Extracting​

Extract from raw bitstream

hdr10plus_tool extract video.hevc -o metadata.json

Extract using FFmpeg pipe (Recommended)

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 -

Injecting​

Inject to raw bitstream

hdr10plus_tool inject -i video.hevc -j metadata.json -o injected_output.hevc

Remove HDR10+ Metadata​

Remove from raw bitstream

hdr10plus_tool remove video.hevc -o hdr10plus_removed_output.hevc

Remove using FFmpeg pipe (Recommended)

ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool remove -
- + \ No newline at end of file diff --git a/docs/utilities/mp4box.html b/docs/utilities/mp4box.html index 8c941cdbf..a43b62f81 100644 --- a/docs/utilities/mp4box.html +++ b/docs/utilities/mp4box.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/utilities/nmkoder.html b/docs/utilities/nmkoder.html index f298d1672..75005b812 100644 --- a/docs/utilities/nmkoder.html +++ b/docs/utilities/nmkoder.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/utilities/rAV1ator.html b/docs/utilities/rAV1ator.html index eef0ceaec..5e7576c07 100644 --- a/docs/utilities/rAV1ator.html +++ b/docs/utilities/rAV1ator.html @@ -11,13 +11,13 @@ - +

rAV1ator

Under Maintenance

The content in this entry is incomplete & is in the process of being completed.

rAV1ator is a fork of Aviator designed to use Av1an & rav1e instead of 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:

flatpak --user remote-add --no-gpg-verify project-volo https://giannirosato.com/repo && flatpak --user install project-volo net.natesales.rAV1ator

Initially, Aviator was supposed to switch to using the Av1an + rav1e backend that currently serves rAV1ator now, 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 specifically Av1an & rav1e easier for interested codec enthusiasts. rAV1ator is actively maintained by Gianni Rosato & Trix.

- + \ No newline at end of file diff --git a/docs/utilities/rav1ator-cli.html b/docs/utilities/rav1ator-cli.html index e424515cc..7128f3720 100644 --- a/docs/utilities/rav1ator-cli.html +++ b/docs/utilities/rav1ator-cli.html @@ -11,13 +11,13 @@ - +

rAV1ator CLI

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, SVT-AV1, x265, and x264.

rAV1ator CLI can:

  • Check if it is installed & up to date on its own without a package manager

  • Download AVX2-optimized encoder binaries compiled with -O3 -flto in most cases & allow the user to install them with detailed instructions

  • Encode with x264, x265, aomenc, SVT-AV1, or rav1e, set a speed preset, CRF/quality value, FFmpeg parameters, and encoder parameters

  • Generate Av1an encoding commands with the user's chosen settings & run them to encode a provided input video to an MKV output

  • Encode from scratch, or resume a previous rav1ator-cli encode

  • Engage with rich interactivity featuring spinners, prompts, dropdowns, and the like

  • Error check downloads by checking SHA256 hashes on the downloaded binaries for security & convenience

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.

Installation​

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 AV1 for Dummies blog post on this site.

  1. Update your system before doing anything. On Arch:
sudo pacman -Syu
  1. Install yay (Arch only) by running the following commands:
sudo pacman -S --needed base-devel git
git clone https://aur.archlinux.org/yay.git
cd yay && makepkg -si
  1. Next, you'll want to install all of rav1ator-cli's dependencies. You can do that by running:
yay -Sy rust ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2
  1. Install rav1ator-cli:
curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli
sudo cp rav1ator-cli /usr/local/bin

Troubleshooting​

  • I've not tested if rAV1ator CLI's decision to run ulimit -n 20000 right away actually works. If you get the mkvmerge "Open file error" on Linux, just run ulimit -n 20000 before running rav1ator-cli.
  • If your encode features a grey screen flashing occaisonally in the output, create a lossless intermediary of your source with x264 -qp 0. This happens because of VC-1 decoding errors.
  • If you have any more questions, please join the AV1 for Dummies Discord server.

Demos​

rAV1ator-cli: Demo 1rAV1ator-cli: Demo 2
- + \ No newline at end of file diff --git a/docs/video-players.html b/docs/video-players.html index 8f449f956..7e6fb3c77 100644 --- a/docs/video-players.html +++ b/docs/video-players.html @@ -11,7 +11,7 @@ - + @@ -19,7 +19,7 @@

Video Players

Many different players exist for video, but here are a few recommended ones:

MPV​

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.

TODO: MPV keyboard shorcuts   

VLC​

VLC is an open source media player and toolkit. It supports almost all video and audio codecs in common use.

Download instructions for VLC on all relevant platforms can be found at VideoLAN's website   

MPC-HC​

- + \ No newline at end of file diff --git a/docs/video/AV1.html b/docs/video/AV1.html index 30a2bbdf6..59d7bc495 100644 --- a/docs/video/AV1.html +++ b/docs/video/AV1.html @@ -11,13 +11,13 @@ - +

AV1

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

AV1 is a royalty-free video compression format designed to succeed VP9. It presently competes with VP9, VVC, and 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 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.

There are a number of viable AV1 encoding solutions available today. The three best, most ubiquitous, and free implementations are aomenc, SVT-AV1, & rav1e.

- + \ No newline at end of file diff --git a/docs/video/AVC.html b/docs/video/AVC.html index d785551a2..99e6816f5 100644 --- a/docs/video/AVC.html +++ b/docs/video/AVC.html @@ -11,13 +11,13 @@ - +

H.264

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 x264 video encoder. Despite being over a decade old, H.264 remains relevant today. Newer codecs like H.265, VP9, and 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.

- + \ No newline at end of file diff --git a/docs/video/AVS3.html b/docs/video/AVS3.html index 0a5cbaa0e..fafd7bfb2 100644 --- a/docs/video/AVS3.html +++ b/docs/video/AVS3.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/video/FFV1.html b/docs/video/FFV1.html index 495bbcb6d..385671f1c 100644 --- a/docs/video/FFV1.html +++ b/docs/video/FFV1.html @@ -11,13 +11,13 @@ - +

FFV1

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

FFV1 is a lossless codec designed for archival use & preservation. it is intra-only, meaning it doesn't use any compression techniques that take more than one frame into account for prediction. It is part of the FFmpeg project.

- + \ No newline at end of file diff --git a/docs/video/HEVC.html b/docs/video/HEVC.html index 50b8ebf2b..635f4d5c0 100644 --- a/docs/video/HEVC.html +++ b/docs/video/HEVC.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/video/Theora.html b/docs/video/Theora.html index 235ae3399..652dc2c1b 100644 --- a/docs/video/Theora.html +++ b/docs/video/Theora.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/video/VC-1.html b/docs/video/VC-1.html index af1542015..df87b94c7 100644 --- a/docs/video/VC-1.html +++ b/docs/video/VC-1.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/video/VP8.html b/docs/video/VP8.html index 302bae350..0f5e11269 100644 --- a/docs/video/VP8.html +++ b/docs/video/VP8.html @@ -11,13 +11,13 @@ - +

VP8

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

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 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 VP9 & AV1, which both further improve video compression efficiency. VP8 has faced criticism for having a messy specification that many considered to be incomplete.

- + \ No newline at end of file diff --git a/docs/video/VP9.html b/docs/video/VP9.html index 743d429a6..d4339b861 100644 --- a/docs/video/VP9.html +++ b/docs/video/VP9.html @@ -11,13 +11,13 @@ - +

VP9

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

VP9, famous for being YouTube's codec of choice for many years, is a royalty free video compression format that competes with HEVC and 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 vpxenc or SVT-VP9 sections.

- + \ No newline at end of file diff --git a/docs/video/VVC.html b/docs/video/VVC.html index fba9c35f9..abfb52ef1 100644 --- a/docs/video/VVC.html +++ b/docs/video/VVC.html @@ -11,13 +11,13 @@ - +

H.266

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

H.266, or VVC (Versatile Video Coding), is a codec standardized in 2020 by the Joint Video Experts Team (JVET). It succeeds H.265, and claims to be 40% more efficient. In practice, it is currently about as efficient as AV1 when using the VVenC encoder, although it is inherently a more complex format which means it will be more difficult to decode. It is encumbered by royalties.

- + \ No newline at end of file diff --git a/docs/video/prores.html b/docs/video/prores.html index 0cdd1e21c..757da479c 100644 --- a/docs/video/prores.html +++ b/docs/video/prores.html @@ -11,13 +11,13 @@ - + - + \ No newline at end of file diff --git a/docs/video/utvideo.html b/docs/video/utvideo.html index 4d3960289..403d34bf4 100644 --- a/docs/video/utvideo.html +++ b/docs/video/utvideo.html @@ -11,14 +11,14 @@ - +

UT Video Codec Suite

Help Wanted

This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!

UT Video Codec Suite is a fast, lossless video codec, developed by Takeshi Umezawa (æĸ…枤 威åŋ—, Umezawa Takeshi) and released under the free GNU General Public License. The algorithm of UT video is based on the Huffman code.

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).

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.

There are various predction modes, which can be used via FFmpeg:

  • no prediction employed
  • left neighbour prediction (continuous for the whole slice)
  • gradient prediction
  • median prediction

You can use FFmpeg to encode utvideo as follows: ffmpeg -i [input] -c:v utvideo -pred [0,1,2,3] [output]

References: Wikipedia

- + \ No newline at end of file diff --git a/index.html b/index.html index a17463304..02545f5b3 100644 --- a/index.html +++ b/index.html @@ -11,13 +11,13 @@ - +

Codec Wiki

Your Guide to All Things Encoding

- + \ No newline at end of file diff --git a/markdown-page.html b/markdown-page.html index 10e03b402..e21497d61 100644 --- a/markdown-page.html +++ b/markdown-page.html @@ -11,13 +11,13 @@ - +

Markdown page example

You don't need React to write simple standalone pages.

- + \ No newline at end of file