diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 000000000..378aa3355 Binary files /dev/null and b/.DS_Store differ diff --git a/404.html b/404.html index d026c55c5..31448c5e8 100644 --- a/404.html +++ b/404.html @@ -2,22 +2,22 @@ - -Page Not Found | Codec Wiki + +Page Not Found | Codec Wiki + + - - - + + + + -
-
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.

- - +
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/assets/css/styles.22d15c80.css b/assets/css/styles.22d15c80.css new file mode 100644 index 000000000..02a9c7234 --- /dev/null +++ b/assets/css/styles.22d15c80.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.centered-text,.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}@font-face{font-family:Monaspace Neon;font-stretch:100% 100%;font-weight:200 900;src:url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2 supports variations"),url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2-variations")}html{font-family:Inter}h1,h2,h3,h4,h5,h6{font-family:Mona Sans}code{font-family:Monaspace Neon}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(46.74% 0.128 352.2);--ifm-color-primary-darker:oklch(49.46% 0.172 8.96);--ifm-color-primary-dark:oklch(50.79% 0.182 7.4);--ifm-color-primary:oklch(59.2% 0.264 7);--ifm-color-primary-light:oklch(57.97% 0.25 6.02);--ifm-color-primary-lighter:oklch(59.74% 0.25 5.67);--ifm-color-primary-lightest:oklch(61.68% 0.27 0.05)}.header-discord-link{height:24px}.header-discord-link:hover,.header-github-link:hover{opacity:.6}.header-discord-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 127.14 96.36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%235865F2' d='M107.7 8.07A105.15 105.15 0 0 0 81.47 0a72.06 72.06 0 0 0-3.36 6.83 97.68 97.68 0 0 0-29.11 0A72.37 72.37 0 0 0 45.64 0a105.89 105.89 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.73 105.73 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.42 68.42 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.68 68.68 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.25 105.25 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15ZM42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69Zm42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69Z'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;right:550px;width:24px}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;width:24px}html[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.hideAction_vcyE>svg,.navbarSearchContainer_Bca1:not(:has(>*)),.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.blogPostFooterDetailsFull_mRVl{flex-direction:column}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/css/styles.d682eda4.css b/assets/css/styles.d682eda4.css deleted file mode 100644 index 116702784..000000000 --- a/assets/css/styles.d682eda4.css +++ /dev/null @@ -1 +0,0 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.centered-text,.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_tbUL,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_S0QG>:last-child,.collapsibleContent_i85q>:last-child,.footer__items,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.sidebarItemTitle_pO2u,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}html{font-family:Inter}h1,h2,h3,h4,h5,h6{font-family:Mona Sans}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(46.74% 0.128 352.2);--ifm-color-primary-darker:oklch(49.46% 0.172 8.96);--ifm-color-primary-dark:oklch(50.79% 0.182 7.4);--ifm-color-primary:oklch(59.2% 0.264 7);--ifm-color-primary-light:oklch(57.97% 0.25 6.02);--ifm-color-primary-lighter:oklch(59.74% 0.25 5.67);--ifm-color-primary-lightest:oklch(61.68% 0.27 0.05)}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_b6E3,.sidebarLogo_isFc,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA,html:not([data-theme]) .themedComponent--light_NU7w{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.blogPostFooterDetailsFull_mRVl{flex-direction:column}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.title_f1Hy{font-size:2rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2 b/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2 new file mode 100644 index 000000000..74117fc74 Binary files /dev/null and b/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2 differ diff --git a/assets/js/0092d9fd.d8ada3bb.js b/assets/js/0092d9fd.d8ada3bb.js new file mode 100644 index 000000000..a32fb83af --- /dev/null +++ b/assets/js/0092d9fd.d8ada3bb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2522],{6523:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var i=n(5893),t=n(1151);const s={label:"FLAC",sidebar_position:7},a="FLAC",r={id:"audio/FLAC",title:"FLAC",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/FLAC.mdx",sourceDirName:"audio",slug:"/audio/FLAC",permalink:"/docs/audio/FLAC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/FLAC.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"FLAC",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Speex",permalink:"/docs/audio/Speex"},next:{title:"WavPack",permalink:"/docs/audio/WavPack"}},c={},d=[{value:"Software support",id:"software-support",level:2},{value:"WAV to FLAC using FFmpeg:",id:"wav-to-flac-using-ffmpeg",level:3},{value:"WAV to FLAC using FLAC command-line tool:",id:"wav-to-flac-using-flac-command-line-tool",level:3}];function l(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h1,{id:"flac",children:"FLAC"}),"\n",(0,i.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsx)(o.p,{children:"FLAC (Free Lossless Audio Coding) is an open-source lossless audio codec with widespread support & compatibility released in 2001. It represents the most efficent lossless audio format in common use today."}),"\n",(0,i.jsxs)(o.p,{children:["FLAC is commonly contained in a ogg container with either a ",(0,i.jsx)(o.code,{children:".flac"})," or ",(0,i.jsx)(o.code,{children:".ogg"})," extension. It can less commonly be used within a matroska container (",(0,i.jsx)(o.code,{children:".mkv"})," or ",(0,i.jsx)(o.code,{children:".mka"}),") for mixing with a video stream."]}),"\n",(0,i.jsx)(o.h2,{id:"software-support",children:"Software support"}),"\n",(0,i.jsx)(o.p,{children:"FLAC is supported by the majority of web browsers and media players in common use as of 2023."}),"\n",(0,i.jsxs)(o.h3,{id:"wav-to-flac-using-ffmpeg",children:["WAV to FLAC using ",(0,i.jsx)(o.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),":"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"ffmpeg -i example.wav -c:a flac example.flac\n"})}),"\n",(0,i.jsx)(o.h3,{id:"wav-to-flac-using-flac-command-line-tool",children:"WAV to FLAC using FLAC command-line tool:"}),"\n",(0,i.jsx)(o.p,{children:"You can include an argument of a number 0-8 to specify the compression effort, 0 being fastest and 8 having the highest compression."}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"flac example.wav -8 -o example.flac\n"})})]})}function u(e={}){const{wrapper:o}={...(0,t.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,o,n)=>{n.d(o,{Z:()=>r,a:()=>a});var i=n(7294);const t={},s=i.createContext(t);function a(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/015d9d66.acf46bf3.js b/assets/js/015d9d66.acf46bf3.js new file mode 100644 index 000000000..b7510c819 --- /dev/null +++ b/assets/js/015d9d66.acf46bf3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8172],{7521:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var i=n(5893),o=n(1151);const s={label:"PSNR",sidebar_position:1},r="PSNR",c={id:"metrics/PSNR",title:"PSNR",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/PSNR.mdx",sourceDirName:"metrics",slug:"/metrics/PSNR",permalink:"/docs/metrics/PSNR",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/PSNR.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"PSNR",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"FFmpeg",permalink:"/docs/utilities/ffmpeg"},next:{title:"SSIM",permalink:"/docs/metrics/SSIM"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"psnr",children:"PSNR"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var i=n(7294);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.410e35af.js b/assets/js/01a85c17.410e35af.js deleted file mode 100644 index 01efb118e..000000000 --- a/assets/js/01a85c17.410e35af.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4013],{9058:(e,t,a)=>{a.d(t,{Z:()=>E});var l=a(7294),r=a(6010),n=a(7961),s=a(7524),i=a(9960),c=a(5999);const m={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function o(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,r.Z)(m.sidebar,"thin-scrollbar"),"aria-label":(0,c.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,r.Z)(m.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,r.Z)(m.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:m.sidebarItem},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:m.sidebarItemLink,activeClassName:m.sidebarItemLinkActive},e.title)))))))}var u=a(3102);function g(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function d(e){return l.createElement(u.Zo,{component:g,props:e})}function b(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(d,{sidebar:t}):l.createElement(o,{sidebar:t}):null}function E(e){const{sidebar:t,toc:a,children:s,...i}=e,c=t&&t.items.length>0;return l.createElement(n.Z,i,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(b,{sidebar:t}),l.createElement("main",{className:(0,r.Z)("col",{"col--7":c,"col--9 col--offset-1":!c}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},1223:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var l=a(7294),r=a(6010),n=a(5999);const s=()=>(0,n.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var i=a(1944),c=a(5281),m=a(9058),o=a(3008);const u={tag:"tag_Nnez"};function g(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:u.tag},l.createElement(o.Z,e))))),l.createElement("hr",null))}function d(e){let{tags:t}=e;const a=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(g,{key:e.letter,letterEntry:e}))))}var b=a(197);function E(e){let{tags:t,sidebar:a}=e;const n=s();return l.createElement(i.FG,{className:(0,r.Z)(c.k.wrapper.blogPages,c.k.page.blogTagsListPage)},l.createElement(i.d,{title:n}),l.createElement(b.Z,{tag:"blog_tags_list"}),l.createElement(m.Z,{sidebar:a},l.createElement("h1",null,n),l.createElement(d,{tags:t})))}},3008:(e,t,a)=>{a.d(t,{Z:()=>i});var l=a(7294),r=a(6010),n=a(9960);const s={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function i(e){let{permalink:t,label:a,count:i}=e;return l.createElement(n.Z,{href:t,className:(0,r.Z)(s.tag,i?s.tagWithCount:s.tagRegular)},a,i&&l.createElement("span",null,i))}}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.72cf1c4a.js b/assets/js/01a85c17.72cf1c4a.js new file mode 100644 index 000000000..ee5e1fd38 --- /dev/null +++ b/assets/js/01a85c17.72cf1c4a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4013],{1460:(e,t,s)=>{s.d(t,{Z:()=>v});var a=s(7294),i=s(6010),r=s(179),l=s(7524),n=s(9960),c=s(5999),o=s(6550),m=s(8596);function d(e){const{pathname:t}=(0,o.TH)();return(0,a.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,m.Mg)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var g=s(5893);function h(e){let{sidebar:t}=e;const s=d(t.items);return(0,g.jsx)("aside",{className:"col col--3",children:(0,g.jsxs)("nav",{className:(0,i.Z)(u.sidebar,"thin-scrollbar"),"aria-label":(0,c.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,g.jsx)("div",{className:(0,i.Z)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,g.jsx)("ul",{className:(0,i.Z)(u.sidebarItemList,"clean-list"),children:s.map((e=>(0,g.jsx)("li",{className:u.sidebarItem,children:(0,g.jsx)(n.Z,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var b=s(3102);function p(e){let{sidebar:t}=e;const s=d(t.items);return(0,g.jsx)("ul",{className:"menu__list",children:s.map((e=>(0,g.jsx)("li",{className:"menu__list-item",children:(0,g.jsx)(n.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function j(e){return(0,g.jsx)(b.Zo,{component:p,props:e})}function x(e){let{sidebar:t}=e;const s=(0,l.i)();return t?.items.length?"mobile"===s?(0,g.jsx)(j,{sidebar:t}):(0,g.jsx)(h,{sidebar:t}):null}function v(e){const{sidebar:t,toc:s,children:a,...l}=e,n=t&&t.items.length>0;return(0,g.jsx)(r.Z,{...l,children:(0,g.jsx)("div",{className:"container margin-vert--lg",children:(0,g.jsxs)("div",{className:"row",children:[(0,g.jsx)(x,{sidebar:t}),(0,g.jsx)("main",{className:(0,i.Z)("col",{"col--7":n,"col--9 col--offset-1":!n}),itemScope:!0,itemType:"https://schema.org/Blog",children:a}),s&&(0,g.jsx)("div",{className:"col col--2",children:s})]})})})}},1223:(e,t,s)=>{s.r(t),s.d(t,{default:()=>p});s(7294);var a=s(6010),i=s(5999);const r=()=>(0,i.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var l=s(1944),n=s(5281),c=s(1460),o=s(3008),m=s(7955);const d={tag:"tag_Nnez"};var u=s(5893);function g(e){let{letterEntry:t}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(m.Z,{as:"h2",id:t.letter,children:t.letter}),(0,u.jsx)("ul",{className:"padding--none",children:t.tags.map((e=>(0,u.jsx)("li",{className:d.tag,children:(0,u.jsx)(o.Z,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function h(e){let{tags:t}=e;const s=function(e){const t={};return Object.values(e).forEach((e=>{const s=function(e){return e[0].toUpperCase()}(e.label);t[s]??=[],t[s].push(e)})),Object.entries(t).sort(((e,t)=>{let[s]=e,[a]=t;return s.localeCompare(a)})).map((e=>{let[t,s]=e;return{letter:t,tags:s.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return(0,u.jsx)("section",{className:"margin-vert--lg",children:s.map((e=>(0,u.jsx)(g,{letterEntry:e},e.letter)))})}var b=s(197);function p(e){let{tags:t,sidebar:s}=e;const i=r();return(0,u.jsxs)(l.FG,{className:(0,a.Z)(n.k.wrapper.blogPages,n.k.page.blogTagsListPage),children:[(0,u.jsx)(l.d,{title:i}),(0,u.jsx)(b.Z,{tag:"blog_tags_list"}),(0,u.jsxs)(c.Z,{sidebar:s,children:[(0,u.jsx)(m.Z,{as:"h1",children:i}),(0,u.jsx)(h,{tags:t})]})]})}},3008:(e,t,s)=>{s.d(t,{Z:()=>n});s(7294);var a=s(6010),i=s(9960);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=s(5893);function n(e){let{permalink:t,label:s,count:n}=e;return(0,l.jsxs)(i.Z,{href:t,className:(0,a.Z)(r.tag,n?r.tagWithCount:r.tagRegular),children:[s,n&&(0,l.jsx)("span",{children:n})]})}}}]); \ No newline at end of file diff --git a/assets/js/03398248.7b96acc6.js b/assets/js/03398248.7b96acc6.js deleted file mode 100644 index ab2af7933..000000000 --- a/assets/js/03398248.7b96acc6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3283],{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 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},l=function(e){var t=u(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,l=c(e,["components","mdxType","originalType","parentName"]),p=u(r),f=o,b=p["".concat(s,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(b,a(a({ref:t},l),{},{components:r})):n.createElement(b,a({ref:t},l))}));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 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:"HEVC / H.265",sidebar_position:2},a="H.265",c={unversionedId:"video/HEVC",id:"video/HEVC",title:"H.265",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/HEVC.md",sourceDirName:"video",slug:"/video/HEVC",permalink:"/docs/video/HEVC",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/HEVC.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"HEVC / H.265",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"H.264",permalink:"/docs/video/AVC"},next:{title:"H.266",permalink:"/docs/video/VVC"}},s={},u=[],l={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"h265"},"H.265"),(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/03af419f.d652c2fd.js b/assets/js/03af419f.d652c2fd.js new file mode 100644 index 000000000..7e52fb3e8 --- /dev/null +++ b/assets/js/03af419f.d652c2fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8600],{9255:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var t=i(5893),o=i(1151);const a={title:"VVenC",sidebar_position:9},r="VVenC",s={id:"encoders/VVenC",title:"VVenC",description:'{i.d(n,{Z:()=>s,a:()=>r});var t=i(7294);const o={},a=t.createContext(o);function r(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03e95fdf.8444ae80.js b/assets/js/03e95fdf.8444ae80.js new file mode 100644 index 000000000..0aa435010 --- /dev/null +++ b/assets/js/03e95fdf.8444ae80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4019],{2971:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var t=o(5893),n=o(1151);const s={label:"VP8",sidebar_position:4},r="VP8",c={id:"video/VP8",title:"VP8",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VP8.mdx",sourceDirName:"video",slug:"/video/VP8",permalink:"/docs/video/VP8",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VP8.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"VP8",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"H.266",permalink:"/docs/video/VVC"},next:{title:"VP9",permalink:"/docs/video/VP9"}},a={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"vp8",children:"VP8"}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(i.p,{children:["VP8 is a video compression format developed by On2 Technologies released in 2008. It was later released as a royalty free codec in 2010 by Google. Its efficiency is competitive with ",(0,t.jsx)(i.a,{href:"/docs/video/AVC",children:"AVC"}),". VP8 was a significant player in the royalty-free codec space and was used in various applications like web video delivery. It is the precursor to ",(0,t.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,t.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"}),", which both further improve video compression efficiency. VP8 has faced criticism for having a messy specification that many considered to be incomplete."]})]})}function u(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},1151:(e,i,o)=>{o.d(i,{Z:()=>c,a:()=>r});var t=o(7294);const n={},s=t.createContext(n);function r(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/059e36ab.968d063e.js b/assets/js/059e36ab.968d063e.js new file mode 100644 index 000000000..6bc17edab --- /dev/null +++ b/assets/js/059e36ab.968d063e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3110],{6277:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>s,metadata:()=>r,toc:()=>a});var t=o(5893),n=o(1151);const s={label:"UT Video",sidebar_position:13},d="UT Video Codec Suite",r={id:"video/utvideo",title:"UT Video Codec Suite",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/utvideo.mdx",sourceDirName:"video",slug:"/video/utvideo",permalink:"/docs/video/utvideo",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/utvideo.mdx",tags:[],version:"current",sidebarPosition:13,frontMatter:{label:"UT Video",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"FFV1",permalink:"/docs/video/FFV1"},next:{title:"ProRes",permalink:"/docs/video/prores"}},c={},a=[];function u(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"ut-video-codec-suite",children:"UT Video Codec Suite"}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsx)(i.p,{children:"UT Video Codec Suite is a fast, lossless video codec, developed by Takeshi Umezawa (\u6885\u6fa4 \u5a01\u5fd7, Umezawa Takeshi) and released under the free GNU General Public License. The algorithm of UT video is based on the Huffman code."}),"\n",(0,t.jsx)(i.p,{children:"UT Video was developed as an alternative to HuffYUV, in order to achieve better compression. It can handle color spaces such as YUV422 (ULY2), RGB (ULRG), RGBA (ULRA) and, most recently, YUV420 (ULY0)."}),"\n",(0,t.jsx)(i.p,{children:"It has both x86 and x64 builds. Due to its multithreading support, this codec is also capable of encoding HDTV material in real time. The codec requires support for the SSE2 instruction set because it is heavily used for speed optimizations."}),"\n",(0,t.jsxs)(i.p,{children:["There are various predction modes, which can be used via ",(0,t.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),":"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"no prediction employed"}),"\n",(0,t.jsx)(i.li,{children:"left neighbour prediction (continuous for the whole slice)"}),"\n",(0,t.jsx)(i.li,{children:"gradient prediction"}),"\n",(0,t.jsx)(i.li,{children:"median prediction"}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["You can use FFmpeg to encode utvideo as follows:\n",(0,t.jsx)(i.code,{children:"ffmpeg -i [input] -c:v utvideo -pred [0,1,2,3] [output]"})]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsxs)(i.em,{children:["References: ",(0,t.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Ut_Video_Codec_Suite",children:"Wikipedia"})]})})]})}function l(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},1151:(e,i,o)=>{o.d(i,{Z:()=>r,a:()=>d});var t=o(7294);const n={},s=t.createContext(n);function d(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06608fa3.0264dabc.js b/assets/js/06608fa3.0264dabc.js deleted file mode 100644 index 6c79b3be9..000000000 --- a/assets/js/06608fa3.0264dabc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7601],{4469:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/06ed4e86.8399e48a.js b/assets/js/06ed4e86.8399e48a.js new file mode 100644 index 000000000..7933f624b --- /dev/null +++ b/assets/js/06ed4e86.8399e48a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1932],{6407:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var t=o(5893),n=o(1151);const s={label:"Dolby Digital",sidebar_position:3},a="Dolby Digital",r={id:"audio/Dolby",title:"Dolby Digital",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/audio/Dolby.mdx",sourceDirName:"audio",slug:"/audio/Dolby",permalink:"/docs/audio/Dolby",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Dolby.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"Dolby Digital",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Opus",permalink:"/docs/audio/Opus"},next:{title:"MP3",permalink:"/docs/audio/MP3"}},l={},d=[{value:"Format Overview",id:"format-overview",level:2},{value:"AC-3",id:"ac-3",level:3},{value:"Dolby Digital Surround EX",id:"dolby-digital-surround-ex",level:4},{value:"E-AC-3",id:"e-ac-3",level:3},{value:"TrueHD",id:"truehd",level:3},{value:"AC-4",id:"ac-4",level:3},{value:"Atmos",id:"atmos",level:3}];function c(e){const i={admonition:"admonition",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"dolby-digital",children:"Dolby Digital"}),"\n",(0,t.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsx)(i.p,{children:"Dolby Digital is a family of both lossless and lossy audio compression algorithms and technologies."}),"\n",(0,t.jsx)(i.h2,{id:"format-overview",children:"Format Overview"}),"\n",(0,t.jsx)(i.h3,{id:"ac-3",children:"AC-3"}),"\n",(0,t.jsx)(i.p,{children:"Originally known as Dolby Digital, AC-3 was first released in 1991 to provide digital 5.1 sound in cinemas from 35mm film reels. AC-3 is notable for being the first audio codec to make use of the \u201cModified Discrete Cosine Transform\u201d algorithm. The codec has seen widespread use an adoption, due to its prevalence in DVDs, TV, and Blu-rays as a surround codec."}),"\n",(0,t.jsx)(i.h4,{id:"dolby-digital-surround-ex",children:"Dolby Digital Surround EX"}),"\n",(0,t.jsx)(i.p,{children:"Like Dolby\u2019s earlier Pro Logic technology, Dolby Digital Surround EX matrixes a sixth, centre back surround channel into the left and right surround channels of a 5.1 stream, allowing for a 6.1 mix to be unfolded when played on a 6.1 or 7.1 system with EX decoding. This technology is fully backwards compatible with existing AC-3 decoders, producing the standard 5.1 stream. Surround EX was first introduced in 1999 with the release of \u201cStar Wars: Episode I \u2013 The Phantom Menace\u201d."}),"\n",(0,t.jsx)(i.h3,{id:"e-ac-3",children:"E-AC-3"}),"\n",(0,t.jsx)(i.p,{children:"Often referred to as \u201cDolby Digital Plus\u201d, E-AC-3 is the successor to Dolby\u2019s earlier AC-3 codec, featuring support for higher bitrates (6,144kbps vs 640kbps), more channels (15 vs 5), and additional coding tools allowing for more efficient encoding. E-AC-3 can be found in the short-lived HD-DVD format, Blu-ray discs, and as the main surround codec for most streaming services, particularly if Dolby Atmos is used. Contrary to popular belief, E-AC-3 is not backwards compatible with AC-3, rather Dolby mandates that all E-AC-3 decoders can also decode standard AC-3 content. As E-AC-3 is an optional codec on Blu-ray, all discs encoded with E-AC-3 encode the first 5.1 channels as AC-3, with the additional rear channels/Atmos content being encoded as E-AC-3."}),"\n",(0,t.jsx)(i.h3,{id:"truehd",children:"TrueHD"}),"\n",(0,t.jsx)(i.p,{children:"Dolby\u2019s TrueHD is a lossless multi-channel audio codec based on Meridian\u2019s Lossless Packing (MLP) codec, although the two aren\u2019t compatible with each other. TrueHD is mainly used on Blu-ray and supports Dolby Atmos\u2019s spatial audio data. The TrueHD specification supports up to 16 audio channels (although the Blu-ray specification limits this to 7.1) with a sample rate of 192KHz and a bit depth of 24 bits. As TrueHD is an optional codec on Blu-ray, each TrueHD steam includes a backup AC-3 stream encoded alongside it for compatibility purposes. Since 2010, Dolby TrueHD has seen a decline in usage in favour of DTS-HD Master Audio on Blu-ray discs, but has seen a slight resurgence as the codec used for Dolby Atmos audio, but DTS-HD MA is still more common on non-Atmos titles."}),"\n",(0,t.jsx)(i.h3,{id:"ac-4",children:"AC-4"}),"\n",(0,t.jsx)(i.p,{children:"To be added."}),"\n",(0,t.jsx)(i.h3,{id:"atmos",children:"Atmos"}),"\n",(0,t.jsx)(i.p,{children:"To be added."})]})}function u(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,i,o)=>{o.d(i,{Z:()=>r,a:()=>a});var t=o(7294);const n={},s=t.createContext(n);function a(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/087cb829.f500f908.js b/assets/js/087cb829.f500f908.js deleted file mode 100644 index 5e585c7b0..000000000 --- a/assets/js/087cb829.f500f908.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6899],{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 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)}},f=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),f=o,m=p["".concat(l,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));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 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={title:"Dehalo",sidebar_position:6},a="Dehalo",c={unversionedId:"filtering/dehalo",id:"filtering/dehalo",title:"Dehalo",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/dehalo.md",sourceDirName:"filtering",slug:"/filtering/dehalo",permalink:"/docs/filtering/dehalo",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/dehalo.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Dehalo",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Detelecine / Inverse Telecine",permalink:"/docs/filtering/detelecine"},next:{title:"Aviator",permalink:"/docs/utilities/Aviator"}},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:"dehalo"},"Dehalo"),(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/09bc817a.8b8dcbae.js b/assets/js/09bc817a.8b8dcbae.js new file mode 100644 index 000000000..d46619d3b --- /dev/null +++ b/assets/js/09bc817a.8b8dcbae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[49],{4720:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>c});var i=s(5893),o=s(1151);const t={label:"Opus",sidebar_position:2},a="Opus",r={id:"audio/Opus",title:"Opus",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/audio/Opus.mdx",sourceDirName:"audio",slug:"/audio/Opus",permalink:"/docs/audio/Opus",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Opus.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"Opus",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"AAC",permalink:"/docs/audio/AAC"},next:{title:"Dolby Digital",permalink:"/docs/audio/Dolby"}},d={},c=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"SILK",id:"silk",level:3},{value:"CELT",id:"celt",level:3},{value:"Encoders",id:"encoders",level:2},{value:"Opusenc",id:"opusenc",level:3},{value:"FFopus",id:"ffopus",level:3},{value:"vac-enc",id:"vac-enc",level:3}];function l(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"opus",children:"Opus"}),"\n",(0,i.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsxs)(n.p,{children:["Opus is an open-source audio codec that has largely replaced ",(0,i.jsx)(n.a,{href:"/docs/audio/Vorbis",children:"Vorbis"})," as the standard open audio codec. It is the recommended codec for usage in WebM video containers in tandem with the ",(0,i.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"})," or ",(0,i.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"})," video codecs."]}),"\n",(0,i.jsxs)(n.p,{children:["Opus is known for its incredible coding efficiency and unique multi-channel optimizations. Stereo Opus audio reaches ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Transparency_(data_compression)",children:"transparency"})," (psychoacoustically lossless audio quality) at 128kb/s, compared to ",(0,i.jsx)(n.a,{href:"/docs/audio/AAC",children:"AAC"}),"'s generally agreed upon 256kb/s and ",(0,i.jsx)(n.a,{href:"/docs/audio/MP3",children:"MP3"}),"'s 320kb/s. Transparency varies based on the type of content & the encoding implementation used, especially for codecs other than Opus, and the values provided above may be debated to a degree."]}),"\n",(0,i.jsxs)(n.p,{children:["Opus is described on ",(0,i.jsx)(n.a,{href:"https://opus-codec.org/",children:"opus-codec.org"}),' as a "totally open, royalty-free, highly versatile audio codec. Opus is unmatched for interactive speech and music transmission over the Internet, but is also intended for storage and streaming applications. It is standardized by the Internet Engineering Task Force (IETF) as ',(0,i.jsx)(n.a,{href:"https://datatracker.ietf.org/doc/html/rfc6716",children:"RFC 6716"}),' which incorporated technology from Skype\u2019s SILK codec and Xiph.Org\u2019s CELT codec."']}),"\n",(0,i.jsx)(n.p,{children:"Opus supports the following features:"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Bitrates from 6 kb/s to 510 kb/s"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Sampling rates from 8 kHz (narrowband) to 48 kHz (fullband)"}),"\n",(0,i.jsx)(n.li,{children:"Frame sizes from 2.5 ms to 60 ms"}),"\n",(0,i.jsx)(n.li,{children:"Support for both constant bitrate (CBR) and variable bitrate (VBR)"}),"\n",(0,i.jsx)(n.li,{children:"Audio bandwidth from narrowband to fullband"}),"\n",(0,i.jsx)(n.li,{children:"Support for speech and music"}),"\n",(0,i.jsx)(n.li,{children:"Support for mono and stereo"}),"\n",(0,i.jsx)(n.li,{children:"Support for up to 255 channels (multistream frames)"}),"\n",(0,i.jsx)(n.li,{children:"Dynamically adjustable bitrate, audio bandwidth, and frame size"}),"\n",(0,i.jsx)(n.li,{children:"Good loss robustness and packet loss concealment (PLC)"}),"\n",(0,i.jsx)(n.li,{children:"Floating point and fixed-point implementation"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"via opus-codec.org"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,i.jsx)(n.p,{children:"Opus is a hybrid audio codec, composed of two codecs as mentioned above. These are Skype's SILK codec for voice & Xiph.Org's CELT codec. Opus's initial name, Harmony, may have been because of the \"harmony\" of these two codecs and the musical connotation of harmony."}),"\n",(0,i.jsx)(n.h3,{id:"silk",children:"SILK"}),"\n",(0,i.jsx)(n.p,{children:"SILK, initially from Skype, was designed to be used for voice calls on Microsoft products like Skype. The first stable release of the codec was in 2009, and since then it has been freely licensed under the BSD 2-Clause license which has allowed for its adoption into Opus. The version of SILK used in Opus is substantially modified from - and not compatible with - the standalone SILK codec previously described here."}),"\n",(0,i.jsx)(n.p,{children:"SILK is optimized for speech, and so has limited sample rates as follows:"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Narrowband: 3-4000hz\nMediumband: 3-6000hz\nWideband: 3-8000hz"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"SILK's latency is 10 to 60ms based on the desired framesize + 5ms lookahead to estimate noise shaping + (potentially) 1.5ms sampling rate conversion overhead if the input audio needs to be resampled."}),"\n",(0,i.jsx)(n.h3,{id:"celt",children:"CELT"}),"\n",(0,i.jsx)(n.p,{children:'Much like SILK, CELT is under the BSD 2-Clause license. The preview release came out in 2011. CELT stands for "Code-Excited Lapped Transform" and was designed to be the true successor to Vorbis, even being dubbed as "Vorbis II" during its initial development as part og Xiph.Org\'s "Ghost" project in 2005.'}),"\n",(0,i.jsxs)(n.p,{children:["CELT was designed to be a full-band general purpose codec without a particular specialization for a certain kind of audio, making it distinctly different from Xiph's ",(0,i.jsx)(n.a,{href:"/docs/audio/Speex",children:"Speex"})," codec & more similar to Vorbis. It is computationally simple relative to competing codec technologies like ",(0,i.jsx)(n.a,{href:"/docs/audio/AAC",children:"AAC"})," & even Vorbis, enabling extremely low latency that is competitive with ",(0,i.jsx)(n.a,{href:"/docs/audio/AAC#aac-ld--aac-eld",children:"AAC-LD"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"CELT can work with the following sample rates:"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Narrowband: 3-4000hz\nMediumband: 3-6000hz\nWideband: 3-8000hz\nSuperWideband: 3-12000hz\nFullband: 3-20000hz"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"encoders",children:"Encoders"}),"\n",(0,i.jsx)(n.h3,{id:"opusenc",children:"Opusenc"}),"\n",(0,i.jsxs)(n.p,{children:["Opus's reference encoder is ",(0,i.jsx)(n.a,{href:"https://github.com/xiph/opus",children:"opusenc"}),", which is known for its fantastic performance and versatility. It is licensed under the BSD 3-clause license as part of the reference libopus library. There are a myriad of options that may be used to encode with opusenc, but the utility is considered to have sane encoding defaults for local storage & playback. The best options will be outlined below."]}),"\n",(0,i.jsxs)(n.p,{children:["Usage: ",(0,i.jsx)(n.code,{children:"opusenc [options] input_file output_file.opus"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--bitrate #.###"})," Sets the overall target bitrate in kbit/s. Most encoders use ",(0,i.jsx)(n.em,{children:"bits"}),' per second, meaning you have to specify "128K" for 128kbit/s for example. Opus doesn\'t follow this, so you\'d just have to type "128" though keep in mind using efficient VBR encoding means the final bitrate may be different than the target. Opus supports bitrates from 6 kb/s to 510 kb/s.']}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--vbr"})," Tells the encoder to encode using a variable bit rate, allocating more or less bits when necessary to preserve overall fidelity per bit. This is the best option for local storage & playback, and is ",(0,i.jsx)(n.em,{children:"enabled by default."})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--cvbr"})," Tells the encoder that it is allowed to vary the bitrate like with VBR, but it must constrain the maximum bitrate at any given moment to the value provided."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--hard-cbr"})," Tells the encoder to use a constant bitrate the whole time."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--music"})," & ",(0,i.jsx)(n.code,{children:"--speech"})," Forces the AI content-detector built into opusenc to treat the input as either speech or music. The bitrate range where this is relevant is around 12-40kb/s."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--comp #"})," Sets the encoder complexity to a value from 0 to 10, 0 being the least complex & 10 being the most. ",(0,i.jsx)(n.em,{children:"The default is 10."})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--framesize #"})," Sets the maximum encoder frame size in milliseconds. Lowering this is useful for improving latency at the expense of audio quality per bit. It is worth noting that 40 & 60ms framesizes are just multiple 20ms frames stitched together via opusenc's default behavior, and are not considered useful as they just lower the encoder's adaptability which can worsen both latency & coding efficiency. ",(0,i.jsx)(n.em,{children:"The default value is 20."})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--expect-loss #"})," Percentage value for expected packet loss. Not useful for local encoding & playback, but useful for real-time applications. ",(0,i.jsx)(n.em,{children:"Default value is 0."})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--downmix-mono"})," Downmixes multiple channels into a single channel."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--downmix-stereo"})," Downmixes multiple channels into two channels, left & right, given more than two channels are provided to the encoder."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--no-phase-inv"})," Disables phase inversion. Helpful when downmixing stereo to mono, although this is the default behavior in that scenario since libopus 1.3. Slightly decreases stereo audio quality."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"--max-delay #"})," Sets maximum container delay in milliseconds, from 0-1000. ",(0,i.jsx)(n.em,{children:"Default is 1000."})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Looking at the default values for the encoder flags, opusenc almost always follows the best practices for every default value. This makes it very easy to use, and it is as simple as plugging in a source of some kind and using only the most basic commands to encode with opus."}),"\n",(0,i.jsx)(n.p,{children:"An example opusenc command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'opusenc "input.wav" "output.opus" --bitrate 96\n'})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," using libopus:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'ffmpeg -i "input.flac" -c:a libopus -b:a 128K "output.ogg"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["If you'd like to learn more about opusenc & its recommended default behavior, read this article on ",(0,i.jsx)(n.a,{href:"https://wiki.xiph.org/Opus_Recommended_Settings#Bandwidth_Transition_Thresholds",children:"Opus Recommended Settings"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"ffopus",children:"FFopus"}),"\n",(0,i.jsx)(n.p,{children:"FFopus is an experimental native opus encoder from FFmpeg. It is not widely regarded as providing any decent uplift in coding efficiency compared to libopus, and is usually considered worse; its only merit is being able to handle 5.1(side) streams while libopus in FFmpeg cannot. It only implements the CELT part of the Opus codec."}),"\n",(0,i.jsx)(n.p,{children:"FFopus usage:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'ffmpeg -i "input.wma" -c:a opus -b:a 128K -strict -2 "output.opus"\n'})}),"\n",(0,i.jsx)(n.h3,{id:"vac-enc",children:"vac-enc"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/gianni-rosato/vac-enc",children:"VAC"}),", or Value Added Codec, is a libopus encoder that uses SoX to resample inputs & supports output to ",(0,i.jsx)(n.code,{children:".ogg"})," rather than exclusively ",(0,i.jsx)(n.code,{children:".opus"}),". Better resampling theoretically leads to better coding efficiency, but vac-enc hasn't been thoroughly tested."]}),"\n",(0,i.jsxs)(n.p,{children:["Encoding a 16-bit signed little endian ",(0,i.jsx)(n.code,{children:"pcm_s16le"})," WAV to 128kbit/s Opus in an OGG container:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"vac-enc input.wav output.ogg 128\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>r,a:()=>a});var i=s(7294);const o={},t=i.createContext(o);function a(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0b185270.a1ca58dd.js b/assets/js/0b185270.a1ca58dd.js new file mode 100644 index 000000000..73fe56400 --- /dev/null +++ b/assets/js/0b185270.a1ca58dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4885],{7394:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var n=i(5893),o=i(1151);const s={title:"FAQ",sidebar_label:"\u2753 FAQ",position:14},r="FAQ",a={id:"FAQ",title:"FAQ",description:"Why are you doing this?",source:"@site/docs/FAQ.mdx",sourceDirName:".",slug:"/FAQ",permalink:"/docs/FAQ",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/FAQ.mdx",tags:[],version:"current",frontMatter:{title:"FAQ",sidebar_label:"\u2753 FAQ",position:14},sidebar:"tutorialSidebar",previous:{title:"\u2712\ufe0f Contribution Guide",permalink:"/docs/contribution-guide"},next:{title:"\ud83d\udd0f Privacy Policy",permalink:"/docs/privacy-policy"}},d={},c=[{value:"Why are you doing this?",id:"why-are-you-doing-this",level:2},{value:"But alternatives exist. Why not contribute there?",id:"but-alternatives-exist-why-not-contribute-there",level:3},{value:"How do I get started as a contributor?",id:"how-do-i-get-started-as-a-contributor",level:3},{value:"Why "Codec Wiki"?",id:"why-codec-wiki",level:3}];function l(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"faq",children:"FAQ"}),"\n",(0,n.jsx)(t.h2,{id:"why-are-you-doing-this",children:"Why are you doing this?"}),"\n",(0,n.jsx)(t.p,{children:"Multimedia encoding & the digital compression space is an incredible field that many tech enthusiasts, professionals, & laymen have no easy entry point to. Wikipedia has a vast amount of information on many of the individual topics covered here but doesn't offer a cohesive way to engage with the entire sphere of knowledge as a whole. While this site started as a lighthearted guide (you'll see the remnants of this strewn about the various wiki entries), it has quickly become an endeavor to unite digital compression aficionados to make the knowledge more accessible for all."}),"\n",(0,n.jsx)(t.h3,{id:"but-alternatives-exist-why-not-contribute-there",children:"But alternatives exist. Why not contribute there?"}),"\n",(0,n.jsx)(t.p,{children:"While this is true, this is easier said than done."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Multimedia Wiki is not as active as it used to be, & a new effort makes sense to carry past efforts forward."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://guide.encode.moe/",children:"guide.encode.moe"})," is stagnant and mostly focused on fansub, docs & personal experiences that are scattered around the Internet."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"There are sources littered about that explain pieces of the larger puzzle, but these serve as small drops in a bucket of vast incoherency & don't meaningfully remedy the steep learning curve for understanding multimedia compression without background knowledge."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"how-do-i-get-started-as-a-contributor",children:"How do I get started as a contributor?"}),"\n",(0,n.jsx)(t.p,{children:"See our Contribution Guide page in the sidebar."}),"\n",(0,n.jsx)(t.h3,{id:"why-codec-wiki",children:'Why "Codec Wiki"?'}),"\n",(0,n.jsx)(t.p,{children:'This wiki is mostly going to be focused on multimedia compression, & the term "Codec" is already widely recognized & understood. While other topics like video filtering & general compression algorithms may be covered, the main focus remains multimedia compression.'})]})}function h(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var n=i(7294);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0cc695c5.55af884a.js b/assets/js/0cc695c5.55af884a.js deleted file mode 100644 index c9a2e3b1b..000000000 --- a/assets/js/0cc695c5.55af884a.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 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/0e272b0d.30662d48.js b/assets/js/0e272b0d.30662d48.js deleted file mode 100644 index e5f1a66ef..000000000 --- a/assets/js/0e272b0d.30662d48.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9140],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});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 l(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 s=i.createContext({}),p=function(e){var t=i.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=r(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,h=d["".concat(s,".").concat(m)]||d[m]||u[m]||o;return n?i.createElement(h,l(l({ref:t},c),{},{components:n})):i.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r[d]="string"==typeof e?e:a,l[1]=r;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>p});var i=n(7462),a=(n(7294),n(3905));const o={title:"vpxenc",sidebar_position:3},l="vpxenc",r={unversionedId:"encoders/vpxenc",id:"encoders/vpxenc",title:"vpxenc",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/vpxenc.md",sourceDirName:"encoders",slug:"/encoders/vpxenc",permalink:"/docs/encoders/vpxenc",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/vpxenc.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"vpxenc",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"aomenc",permalink:"/docs/encoders/aomenc"},next:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"}},s={},p=[{value:"Building",id:"building",level:2},{value:"VP8",id:"vp8",level:2},{value:"VP9",id:"vp9",level:2},{value:"Encoding",id:"encoding",level:3}],c={toc:p},d="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,i.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"vpxenc"},"vpxenc"),(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)("p",null,"vpxenc is part of the libvpx library for working with the ",(0,a.kt)("a",{parentName:"p",href:"/docs/video/VP9"},"VP9")," & ",(0,a.kt)("a",{parentName:"p",href:"/docs/video/VP8"},"VP8")," video codecs. It is capable of encoding & decoding both formats, where vpxenc is the multipurpose encoder. VP9 competes with ",(0,a.kt)("a",{parentName:"p",href:"/docs/video/HEVC"},"HEVC")," (h265) & ",(0,a.kt)("a",{parentName:"p",href:"/docs/video/AVC"},"AVC")," (h264) in coding efficiency, and has been superseded by ",(0,a.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"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 ",(0,a.kt)("a",{parentName:"p",href:"/docs/encoders/x265"},"x265"),"."),(0,a.kt)("h2",{id:"building"},"Building"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Linux & macOS")),(0,a.kt)("p",null,"To build libvpx from source:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://chromium.googlesource.com/webm/libvpx\ncd libvpx\n./configure\nmake -j [# of CPU threads]\n")),(0,a.kt)("p",null,"It may be worth digging through the ",(0,a.kt)("inlineCode",{parentName:"p"},"configure")," options, which can be listed by running ",(0,a.kt)("inlineCode",{parentName:"p"},"./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:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'./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\n')),(0,a.kt)("p",null,"From the build, a binary will be produced called ",(0,a.kt)("inlineCode",{parentName:"p"},"vpxenc"),". You can copy this build to ",(0,a.kt)("inlineCode",{parentName:"p"},"/usr/local/bin")," or execute it directly in the directory, shown below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"./vpxenc --help | grep vp9 -C 3\n\nIncluded encoders:\n\n vp9 - WebM Project VP9 Encoder v1.13.0 (default)\n\n Use --codec to switch to a non-default encoder.\n")),(0,a.kt)("h2",{id:"vp8"},"VP8"),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},"Incomplete")),(0,a.kt)("h2",{id:"vp9"},"VP9"),(0,a.kt)("p",null,"For encoding VP9, vpxenc's default parameters are not considered optimal. There are a lot of options that are either disabled without reason or are simply misconfigured, hurting coding efficiency at little cost otherwise. As of mid-2021, some parameters (the TPL-model, lag-in-frames and auto-alt-ref frames) were changed (since libvpx 1.9.0 and libvpx 1.10.0) which means that there's not much use of setting these three parameters unless you're in ",(0,a.kt)("a",{parentName:"p",href:"/docs/utilities/ffmpeg"},"FFmpeg"),". This section covers the most important options libvpx-vp9 has to offer, recommended settings, & what they do."),(0,a.kt)("h3",{id:"encoding"},"Encoding"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--codec=vp9"))),(0,a.kt)("p",null,"Self-explanatory."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--passes=2"))),(0,a.kt)("p",null,"vpxenc's 2-pass mode is quite fast compared to 2-pass in ",(0,a.kt)("a",{parentName:"p",href:"/docs/encoders/x264"},"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."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--webm"))),(0,a.kt)("p",null,"Enables WebM output for the encoder, and passes the encoder flags set. It is not necessary to enable it, but since it passes the encoder flags, I would use it. Can be changed to ",(0,a.kt)("inlineCode",{parentName:"p"},"--ivf")," for an ivf video stream."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--good"))),(0,a.kt)("p",null,"This is a sort of quality deadline, the minimum speed the encoder is allowed to go to. It isn't recommended to use ",(0,a.kt)("inlineCode",{parentName:"p"},"-\u2013best")," as it is slow for the quality uplift you get. Do not use RT for anything but real-time encoding."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--threads=8")," ")),(0,a.kt)("p",null,"Dictates the number of threads the encoder should spawn. It doesn\u2019t mean it\u2019ll scale all that well over those 8 threads. On a 16 thread CPU with a single encoder instance, I would use 8 threads. With multiple encoder instance encoding(with qencoder/av1an/neav1e), I would set it to 2 threads."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--profile=2")," ")),(0,a.kt)("p",null,"VP9 profile 2 is obligatory if you want 10-bit & 12-bit support for HDR, and improved quality from 8-bit."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--lag-in-frames=25")," ")),(0,a.kt)("p",null,"Lag-in-frames is the libvpx equivalent of lookahead in x264. The higher the number, the slower the encoder will be, but at the upside of making it more efficient. Going above \u2013lag-in-frames=12 also activates another setting called alternate reference frames. 25 is the maximum you can get in libvpx-vp9. It is the default in the standalone vpxenc libvpx-vp9 encoder."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--end-usage=q")," ")),(0,a.kt)("p",null,"Q mode is the closest equivalent to CRF that libvpx-vp9 offers, so use it if maximum quality is desired."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--cq-level=25")," ")),(0,a.kt)("p",null,"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."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--kf-max-dist=[input FPS * 10]")," ")),(0,a.kt)("p",null,"This tells the encoder to have a maximum number of frames between keyframes. It will usually place a lower number of keyframes in content like movies, TV shows, or animated shows, so you can set it to a very high number or not set it at all if you want maximum efficiency for this kind of content. Otherwise, I would go with the 10-second rule: ",(0,a.kt)("inlineCode",{parentName:"p"},"--kf-max-dist=240")," for 24FPS content, 300 for 30FPS content, 600 for 60FPS content, and so on."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--cpu-used=3")," ")),(0,a.kt)("p",null,"This is where the biggest balance of quality to speed is with libvpx-vp9. This is similar to presets in x264 and x265, except the lower the number, the slower the encoder takes. Using ",(0,a.kt)("inlineCode",{parentName:"p"},"--cpu-used=3")," & below enables RDO, which increases quality at the expense of speed. Another note: --cpu-used=5 and above are ",(0,a.kt)("em",{parentName:"p"},"slower")," in the 1st pass, so it isn't recommended to use them anyway."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--auto-alt-ref=1"))),(0,a.kt)("p",null,'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. ',(0,a.kt)("inlineCode",{parentName:"p"},"--auto-alt-ref=6")," can also be used, but be aware that this does require ",(0,a.kt)("inlineCode",{parentName:"p"},"--profile=2")," be set as mentioned above."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--arnr-maxframes=7"))),(0,a.kt)("p",null,"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."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--arnr-strength=4"))),(0,a.kt)("p",null,"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."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--aq-mode=0"))),(0,a.kt)("p",null,"Adaptive quantization is the way for an encoder to spend more bits in certain areas to improve ",(0,a.kt)("a",{parentName:"p",href:"/docs/introduction/psychovisual"},"psychovisual fidelity"),". ",(0,a.kt)("inlineCode",{parentName:"p"},"-\u2013aq-mode=0")," works well on clean content (animation, video games, screen content). ",(0,a.kt)("inlineCode",{parentName:"p"},"--aq-mode=2")," is recommended when you want to give more detail to more complex parts of a video."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--frame-boost=1"))),(0,a.kt)("p",null,"This flag lets the encoder periodically boost the bitrate of a scene/frame if it needs it. Leaving it at the default ",(0,a.kt)("inlineCode",{parentName:"p"},"--frame-boost=0")," is usually a good bet, & this isn't a particularly salient change."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--tune-content=default"))),(0,a.kt)("p",null,"This determines how the encoder is tuned. In libvpx-vp9, there are three options: ",(0,a.kt)("inlineCode",{parentName:"p"},"default"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"screen"),", and ",(0,a.kt)("inlineCode",{parentName:"p"},"film"),". Default is for most scenarios, screen is for screen content(video games, live-streaming content like web pages & your screen), and film is for heavily dithered/grainy video. Leaving it at the default for about everything but screen content as described above is probably the best option. ",(0,a.kt)("inlineCode",{parentName:"p"},"--tune-content=screen")," with ",(0,a.kt)("inlineCode",{parentName:"p"},"--aq-mode=2")," is not recommended, as it creates some odd artifacts. It is advised to use ",(0,a.kt)("inlineCode",{parentName:"p"},"--aq-mode=0")," if ",(0,a.kt)("inlineCode",{parentName:"p"},"--tune-content=screen")," is activated, or if you want better perceptual quality, ",(0,a.kt)("inlineCode",{parentName:"p"},"--aq-mode=1"),"."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--row-mt=1"))),(0,a.kt)("p",null,"Enables row multi-threading in libvpx-vp9. ",(0,a.kt)("em",{parentName:"p"},"Always")," enable it no matter what, as it does not hurt efficiency, but boosts speed considerably. This feature is disabled by default."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--bit-depth=10"))),(0,a.kt)("p",null,"Always use 10-bit for maximum efficiency & minimal banding, even with an 8-bit source. Make sure to enable ",(0,a.kt)("inlineCode",{parentName:"p"},"-\u2013profile=2")," as mentioned above."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--tile-columns=1"))),(0,a.kt)("p",null,"This setting divides the video into tile columns for easier parallelization when encoding & decoding. Setting ",(0,a.kt)("inlineCode",{parentName:"p"},"-\u2013tile-columns=1"),", you will get 2\xb9 tile columns. Setting it higher is a trade-off between parallelization & coding efficiency, as more tiles means less information your encoder can work with, and this will result in decreased efficiency. Do note there is an upper threshold in regards to the number of tile columns you can get due to the fixed minimum tile width of 256 pixels. So, this means 4 tile columns (2\xb2) for 720p and 1080p, 8 tile columns (2\u2074) for 1440p/4k, and so on. If you set a tile column number that is too high, it will drop down to the lowest supported number of tile columns at the input resolution."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--tile-rows=0"))),(0,a.kt)("p",null,"This setting divides the video into tile rows. This option is different from columns because although it also makes decoding performance higher, it does not scale as well as tile columns & doesn\u2019t increase encoder threading nearly as much. Always use more tile-columns than rows, or leave the number of tile rows at default (0). Leaving the encoder defaults at ",(0,a.kt)("inlineCode",{parentName:"p"},"-\u2013tile-rows=0")," & ",(0,a.kt)("inlineCode",{parentName:"p"},"\u2013-tile-columns=0")," will result in the highest overall coding efficiency possible with these options."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"--enable-tpl=1"))),(0,a.kt)("p",null,"This option enables a temporal layer model, which helps with coding efficiency. It is the default in the standalone vpxenc libvpx-vp9 encoder."),(0,a.kt)("p",null,"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:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"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 -\nffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 2 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 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\n")),(0,a.kt)("p",null,"Alternatively, you can pass a raw .y4m stream to standalone vpxenc & encode that way."),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},"VP9 section written based on work by BlueSwordM, who has granted written permission for this wiki page to exist in its current fashion")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e7f53a8.2156cee0.js b/assets/js/0e7f53a8.2156cee0.js new file mode 100644 index 000000000..2f53bd7bd --- /dev/null +++ b/assets/js/0e7f53a8.2156cee0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7635],{4667:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=n(5893),t=n(1151);const r={label:"PNG",sidebar_position:2},o="PNG",a={id:"images/PNG",title:"PNG",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/PNG.mdx",sourceDirName:"images",slug:"/images/PNG",permalink:"/docs/images/PNG",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/PNG.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"PNG",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"JPEG",permalink:"/docs/images/JPEG"},next:{title:"GIF",permalink:"/docs/images/GIF"}},c={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2}];function l(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",p:"p",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"png",children:"PNG"}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(i.p,{children:["Portable Network Graphics (PNG) is a free lossless image file format released in 1996. It was ceated as an alternative to ",(0,s.jsx)(i.a,{href:"/docs/images/GIF",children:"GIF"}),", which was at the time a proprietary format. It gained animation support similar to GIF with the release of APNG in 2008, which is now supported by all popular web browsers."]}),"\n",(0,s.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,s.jsxs)(i.p,{children:["Lossless? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Lossy? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,s.jsx)(i.em,{children:"8 BPC, 16 BPC"})]}),"\n",(0,s.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Animation? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Transparency? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Progressive Decode? ",(0,s.jsx)(i.em,{children:"Kinda"})]}),"\n",(0,s.jsxs)(i.p,{children:["Royalty Free? ",(0,s.jsx)(i.em,{children:"Yes"})]})]})}function h(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>o});var s=n(7294);const t={},r=s.createContext(t);function o(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0f8cca8e.a1bcae2d.js b/assets/js/0f8cca8e.a1bcae2d.js deleted file mode 100644 index ff9ddb76e..000000000 --- a/assets/js/0f8cca8e.a1bcae2d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[909],{3905:(e,t,o)=>{o.d(t,{Zo:()=>c,kt:()=>f});var r=o(7294);function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function n(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function s(e){for(var t=1;t=0||(i[o]=e[o]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o])}return i}var l=r.createContext({}),u=function(e){var t=r.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):s(s({},t),e)),o},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var o=e.components,i=e.mdxType,n=e.originalType,l=e.parentName,c=a(e,["components","mdxType","originalType","parentName"]),p=u(o),h=i,f=p["".concat(l,".").concat(h)]||p[h]||m[h]||n;return o?r.createElement(f,s(s({ref:t},c),{},{components:o})):r.createElement(f,s({ref:t},c))}));function f(e,t){var o=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=o.length,s=new Array(n);s[0]=h;var a={};for(var l in t)hasOwnProperty.call(t,l)&&(a[l]=t[l]);a.originalType=e,a[p]="string"==typeof e?e:i,s[1]=a;for(var u=2;u{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>n,metadata:()=>a,toc:()=>u});var r=o(7462),i=(o(7294),o(3905));const n={title:"Terms of Use",sidebar_label:"\ud83e\udd1d Terms of Use",position:16},s="Terms of Use",a={unversionedId:"terms-of-use",id:"terms-of-use",title:"Terms of Use",description:"These terms & conditions outline the rules & regulations for the use of the Codec Wiki Website as a visitor, contributor, or any other party who falls under the jurisdiction of these terms.",source:"@site/docs/terms-of-use.md",sourceDirName:".",slug:"/terms-of-use",permalink:"/docs/terms-of-use",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/terms-of-use.md",tags:[],version:"current",frontMatter:{title:"Terms of Use",sidebar_label:"\ud83e\udd1d Terms of Use",position:16},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udd0f Privacy Policy",permalink:"/docs/privacy-policy"}},l={},u=[],c={toc:u},p="wrapper";function m(e){let{components:t,...o}=e;return(0,i.kt)(p,(0,r.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"terms-of-use"},"Terms of Use"),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"The following terminology applies to these Terms & Conditions & all other Agreements: \u201cClient\u201d, \u201cYou\u201d & \u201cYour\u201d refers to you, the person log on this website & compliant to these terms & conditions. \u201cOurselves\u201d, \u201cWe\u201d, \u201cOur\u201d & \u201cUs\u201d, refers to the site's owner. \u201cParty\u201d, \u201cParties\u201d, or \u201cUs\u201d, refers to both the Client & ourselves. Any use of the above terminology or other words in the singular, plural, capitalization and/or they/he/she, are taken as interchangeable & therefore as referring to the same."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Cookies")),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"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."),(0,i.kt)("ol",{start:2},(0,i.kt)("li",{parentName:"ol"},"Licensing")),(0,i.kt)("p",null,"Unless otherwise stated, the site's contributors and/or its licensors own the intellectual property rights for all material on the Codec Wiki. All intellectual property is distributed under CC BY-SA 4.0 unless it is specified otherwise. You may assess the terms & conditions of this Creative Commons license via this link: ",(0,i.kt)("a",{parentName:"p",href:"https://creativecommons.org/licenses/by-sa/4.0/"},"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."),(0,i.kt)("p",null,"Under CC BY-SA 4.0, you may:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Share - copy and redistribute the material in any medium or format.")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Adapt - remix, transform, and build upon the material for any purpose, even commercially.")),(0,i.kt)("p",null,"No party can revoke these freedoms as long as you follow the license terms. The terms are as follows:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"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.")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"ShareAlike - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.")),(0,i.kt)("p",null,"Contributors may not apply legal terms or technological measures that legally restrict others from doing anything the license permits."),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"You warrant & represent that:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"You are entitled to post the Comments/contributions on our website & have all necessary licenses & consents to do so;\nThe Comments/contributions do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party;\nThe Comments/contributions do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy\nThe Comments/contributions will not be used to promote unlawful activity.\n")),(0,i.kt)("p",null,"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."),(0,i.kt)("ol",{start:3},(0,i.kt)("li",{parentName:"ol"},"iFrames")),(0,i.kt)("p",null,"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."),(0,i.kt)("ol",{start:4},(0,i.kt)("li",{parentName:"ol"},"Content Liability")),(0,i.kt)("p",null,"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."),(0,i.kt)("ol",{start:5},(0,i.kt)("li",{parentName:"ol"},"Your Privacy")),(0,i.kt)("p",null,"Please read our Privacy Policy."),(0,i.kt)("ol",{start:6},(0,i.kt)("li",{parentName:"ol"},"Reservation of Rights")),(0,i.kt)("p",null,"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."),(0,i.kt)("ol",{start:7},(0,i.kt)("li",{parentName:"ol"},"Removal of links from our website")),(0,i.kt)("p",null,"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."),(0,i.kt)("ol",{start:8},(0,i.kt)("li",{parentName:"ol"},"Disclaimer")),(0,i.kt)("p",null,"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:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"limit or exclude our or your liability for death or personal injury;\nlimit or exclude our or your liability for fraud or fraudulent misrepresentation;\nlimit any of our or your liabilities in any way that is not permitted under applicable law; or\nexclude any of our or your liabilities that may not be excluded under applicable law.\n")),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"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."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/112763a5.b9895085.js b/assets/js/112763a5.b9895085.js new file mode 100644 index 000000000..53f19447c --- /dev/null +++ b/assets/js/112763a5.b9895085.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7767],{1825:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=o(5893),n=o(1151);const s={title:"Terms of Use",sidebar_label:"\ud83e\udd1d Terms of Use",position:16},r="Terms of Use",a={id:"terms-of-use",title:"Terms of Use",description:"These terms & conditions outline the rules & regulations for the use of the Codec Wiki Website as a visitor, contributor, or any other party who falls under the jurisdiction of these terms.",source:"@site/docs/terms-of-use.mdx",sourceDirName:".",slug:"/terms-of-use",permalink:"/docs/terms-of-use",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/terms-of-use.mdx",tags:[],version:"current",frontMatter:{title:"Terms of Use",sidebar_label:"\ud83e\udd1d Terms of Use",position:16},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udd0f Privacy Policy",permalink:"/docs/privacy-policy"}},l={},c=[];function h(e){const t={a:"a",blockquote:"blockquote",h1:"h1",li:"li",ol:"ol",p:"p",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"terms-of-use",children:"Terms of Use"}),"\n",(0,i.jsx)(t.p,{children:"These terms & conditions outline the rules & regulations for the use of the Codec Wiki Website as a visitor, contributor, or any other party who falls under the jurisdiction of these terms."}),"\n",(0,i.jsx)(t.p,{children:"By accessing this website we assume you accept these terms & conditions. Do not continue to use the site if you do not agree to all of the terms & conditions stated on this page."}),"\n",(0,i.jsx)(t.p,{children:"The following terminology applies to these Terms & Conditions & all other Agreements: \u201cClient\u201d, \u201cYou\u201d & \u201cYour\u201d refers to you, the person log on this website & compliant to these terms & conditions. \u201cOurselves\u201d, \u201cWe\u201d, \u201cOur\u201d & \u201cUs\u201d, refers to the site's owner. \u201cParty\u201d, \u201cParties\u201d, or \u201cUs\u201d, refers to both the Client & ourselves. Any use of the above terminology or other words in the singular, plural, capitalization and/or they/he/she, are taken as interchangeable & therefore as referring to the same."}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Cookies"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"We may employ the use of cookies in the future. At the time of writing, we do not. If accessing the site employs the use of cookies, you will be prompted to agree to use cookies in agreement with our Privacy Policy. As of writing, our Privacy Policy does not require users' consent to the use of cookies due to the fact that we do not use cookies."}),"\n",(0,i.jsx)(t.p,{children:"Some interactive websites use cookies to let them retrieve user details for each visit. Cookies may be used by our website to enable the functionality of certain areas to make it easier for people visiting our website."}),"\n",(0,i.jsxs)(t.ol,{start:"2",children:["\n",(0,i.jsx)(t.li,{children:"Licensing"}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Unless otherwise stated, the site's contributors and/or its licensors own the intellectual property rights for all material on the Codec Wiki. All intellectual property is distributed under CC BY-SA 4.0 unless it is specified otherwise. You may assess the terms & conditions of this Creative Commons license via this link: ",(0,i.jsx)(t.a,{href:"https://creativecommons.org/licenses/by-sa/4.0/",children:"https://creativecommons.org/licenses/by-sa/4.0/"}),". Using assets and/or intellectual property from the Codec Wiki site is subject to these terms unless otherwise specified."]}),"\n",(0,i.jsx)(t.p,{children:"Under CC BY-SA 4.0, you may:"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Share - copy and redistribute the material in any medium or format."}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Adapt - remix, transform, and build upon the material for any purpose, even commercially."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"No party can revoke these freedoms as long as you follow the license terms. The terms are as follows:"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Attribution - You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use."}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"ShareAlike - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Contributors may not apply legal terms or technological measures that legally restrict others from doing anything the license permits."}),"\n",(0,i.jsx)(t.p,{children:"Parts of this website may offer an opportunity for users to post & exchange opinions & information in certain areas of the site. We do not filter, edit, publish or review Comments prior to their presence on the website. Comments do not reflect the views & opinions of contributors, its agents and/or affiliates. Comments reflect the views & opinions of the person who posts their views & opinions. To the extent permitted by applicable laws, the site's host & wiki contributors shall not be liable for the Comments or any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the Comments on this website."}),"\n",(0,i.jsx)(t.p,{children:"Part of the nature of a community-developed wiki is the ability for members of the community to make contributions to the contents of the site. Contributors are responsible for their own contributions to the site, & we shall not be liable for the contributions or any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the contributions to this website."}),"\n",(0,i.jsx)(t.p,{children:"We reserve the right to monitor all Comments and/or contributions & to remove any Comments and/or contributions which can be considered inappropriate, offensive or causes a breach of these Terms & Conditions."}),"\n",(0,i.jsx)(t.p,{children:"You warrant & represent that:"}),"\n",(0,i.jsx)(t.p,{children:"You are entitled to post the Comments/contributions on our website & have all necessary licenses & consents to do so;\nThe Comments/contributions do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party;\nThe Comments/contributions do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy\nThe Comments/contributions will not be used to promote unlawful activity."}),"\n",(0,i.jsx)(t.p,{children:"You hereby grant the Codec Wiki a non-exclusive license to use, reproduce, edit & authorize others to use, reproduce & edit any of your Comments/contributions in any & all forms, formats or media."}),"\n",(0,i.jsxs)(t.ol,{start:"3",children:["\n",(0,i.jsx)(t.li,{children:"iFrames"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"You may not create frames around our Webpages that alter in any way the visual presentation or appearance of our Website without proper attribution per CC BY-SA 4.0 where the license applies. Elsewhere, written permission is required if an asset is not under the CC BY-SA 4.0 license."}),"\n",(0,i.jsxs)(t.ol,{start:"4",children:["\n",(0,i.jsx)(t.li,{children:"Content Liability"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"We shall not be held responsible for any content that appears on your Website. You agree to protect & defend us against all claims that arise on your Website. No link(s) should appear on any Website that may be interpreted as libelous, obscene, or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights."}),"\n",(0,i.jsxs)(t.ol,{start:"5",children:["\n",(0,i.jsx)(t.li,{children:"Your Privacy"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Please read our Privacy Policy."}),"\n",(0,i.jsxs)(t.ol,{start:"6",children:["\n",(0,i.jsx)(t.li,{children:"Reservation of Rights"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"We reserve the right to request that you remove all links or any particular link to our Website. You approve to immediately remove all links to our Website upon request. We also reserve the right to amend these terms & conditions & its linking policy at any time. By continuously linking to our Website, you agree to be bound to & follow these terms & conditions."}),"\n",(0,i.jsxs)(t.ol,{start:"7",children:["\n",(0,i.jsx)(t.li,{children:"Removal of links from our website"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"If you find any link on our Website that is offensive for any reason, you are free to contact & inform us at any moment. We will consider requests to remove links but we are not obligated to or so or to respond to you directly. We do not ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we promise to ensure that the website remains available or that the material on the website is kept up-to-date."}),"\n",(0,i.jsxs)(t.ol,{start:"8",children:["\n",(0,i.jsx)(t.li,{children:"Disclaimer"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"To the maximum extent permitted by applicable law, we exclude all representations, warranties & conditions relating to our website & the use of this website. Nothing in this disclaimer will:"}),"\n",(0,i.jsx)(t.p,{children:"limit or exclude our or your liability for death or personal injury;\nlimit or exclude our or your liability for fraud or fraudulent misrepresentation;\nlimit any of our or your liabilities in any way that is not permitted under applicable law; or\nexclude any of our or your liabilities that may not be excluded under applicable law."}),"\n",(0,i.jsx)(t.p,{children:"The limitations & prohibitions of liability set in this Section & elsewhere in this disclaimer: (a) are subject to the preceding paragraph; & (b) govern all liabilities arising under the disclaimer, including liabilities arising in contract, in tort & for breach of statutory duty."}),"\n",(0,i.jsx)(t.p,{children:"As long as the website & the information on the website are provided free of charge, we will not be liable for any loss or damage of any nature."})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>r});var i=o(7294);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12b076f3.46d6ab95.js b/assets/js/12b076f3.46d6ab95.js new file mode 100644 index 000000000..a0269e006 --- /dev/null +++ b/assets/js/12b076f3.46d6ab95.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9888],{3097:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>n,toc:()=>c});var o=s(5893),a=s(1151);const i={label:"zstd",sidebar_position:7},r="Zstandard",n={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.mdx",sourceDirName:"data",slug:"/data/zstd",permalink:"/docs/data/zstd",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zstd.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"zstd",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"ZPAQ",permalink:"/docs/data/zpaq"},next:{title:"JPEG",permalink:"/docs/images/JPEG"}},d={},c=[];function l(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"zstandard",children:"Zstandard"}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(t.p,{children:["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,o.jsx)(t.a,{href:"/docs/data/zip",children:"ZIP"})," or ",(0,o.jsx)(t.a,{href:"/docs/data/gzip",children:"gzip"})," while being faster overall. In practice, it is said to compress similarly to pure LZMA (part of ",(0,o.jsx)(t.a,{href:"/docs/data/xz",children:"XZ"})," & ",(0,o.jsx)(t.a,{href:"/docs/data/7z",children:"7-zip"}),") while being much faster."]}),"\n",(0,o.jsxs)(t.p,{children:["While ",(0,o.jsx)(t.code,{children:".tar.zst"})," archives aren't as popular as ",(0,o.jsx)(t.code,{children:".tar.xz"})," or ",(0,o.jsx)(t.code,{children:".tar.gz"}),", Zstandard is already a very popular tool for compression in the world of open-source software. It has been integrated into both the FreeBSD kernel & the Linux kernel and is available as a filesystem compression method for the btrfs, squashfs, bcachefs, & OpenZFS filesystems. Filesystem compression refers to a compression scheme that transparently compresses files stored on a filesystem at all times, leading to an overall reduction in storage used across the filesystem."]}),"\n",(0,o.jsxs)(t.p,{children:["The command line ",(0,o.jsx)(t.code,{children:"zstd"})," utility can compress to Zstandard at compression levels 1 through 19 by default. The upper bound is raised to 22 when passing the ",(0,o.jsx)(t.code,{children:"--ultra"})," flag. All Arch Linux packages are compressed at zstd level 20, allowing Arch packages to be decompressed 14 times faster compared to XZ at the cost of an average 0.8% filesize increase across all packages. It is popular in the game emulation scene as well, as many game file formats for emulating console games support zstd compression. The ZIP file format standard actually supports Zstandard in compression level 93 since version 6.3.8 which was published in 2020. Content encoding using zstd is supported since Chromium 118 behind an experimental flag, meaning it might compete with ",(0,o.jsx)(t.a,{href:"/docs/data/brotli",children:"Brotli"})," on the web in the future. Apple's LZFSE algorithm is purportedly similar to Zstandard compression level 6."]}),"\n",(0,o.jsxs)(t.p,{children:["Zstandard has the potential to effectively compete with nearly every modern compression method available across most modern use cases. In certain scenarios, if it takes off as a content delivery format, it could replace Brotli if the benefits of super-fast & super-light decode improve the responsiveness of web pages & are worth sacrificing a bit of compression ratio. When using the much higher effort settings, it often outcompetes Brotli for the archive size as well. In the future, ",(0,o.jsx)(t.code,{children:".tar.zst"})," could replace 7-zip, ZIP, or other archiving formats, making speedy decode a reality on systems featuring varying levels of compute horsepower."]})]})}function p(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>n,a:()=>r});var o=s(7294);const a={},i=o.createContext(a);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function n(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/13d564a8.43f8975b.js b/assets/js/13d564a8.43f8975b.js deleted file mode 100644 index 12d58e7ae..000000000 --- a/assets/js/13d564a8.43f8975b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3146],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(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||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(n),m=r,g=u["".concat(p,".").concat(m)]||u[m]||d[m]||i;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:r,o[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const i={label:"rav1e",sidebar_position:5,date:new Date("2023-05-09T00:00:00.000Z")},o="rav1e",l={unversionedId:"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.",source:"@site/docs/encoders/rav1e.md",sourceDirName:"encoders",slug:"/encoders/rav1e",permalink:"/docs/encoders/rav1e",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/rav1e.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"rav1e",sidebar_position:5,date:"2023-05-09T00:00:00.000Z"},sidebar:"tutorialSidebar",previous:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"},next:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"}},p={},s=[{value:"Building",id:"building",level:2},{value:"Linux/macOS",id:"linuxmacos",level:3},{value:"Windows",id:"windows",level:3},{value:"AV1",id:"av1",level:3}],c={toc:s},u="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"rav1e"},"rav1e"),(0,r.kt)("p",null,"rav1e is a command line application for encoding AV1 written in Rust & Assembly co-developed by Xiph.org and Mozilla."),(0,r.kt)("p",null,"rav1e is available in FFmpeg via ",(0,r.kt)("inlineCode",{parentName:"p"},"librav1e"),". You can check if you have it by running ",(0,r.kt)("inlineCode",{parentName:"p"},"ffmpeg -h encoder=librav1e"),". You can input non-FFmpeg standard rav1e parameters via ",(0,r.kt)("inlineCode",{parentName:"p"},"-rav1e-params"),". Please keep in mind that unless you build FFmpeg yourself, you are using the most vanilla version of rav1e."),(0,r.kt)("h2",{id:"building"},"Building"),(0,r.kt)("h3",{id:"linuxmacos"},"Linux/macOS"),(0,r.kt)("p",null,"Pre-built binaries can be found in the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/xiph/rav1e/releases"},"releases page")," on Github. rav1e can also be installed with Cargo by running ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo install rav1e"),". "),(0,r.kt)("admonition",{title:"Warning",type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,r.kt)("inlineCode",{parentName:"p"},"git reset --hard [commit hash]"))),(0,r.kt)("p",null,"Here are instructions for resetting to release 0.6.6. Omit the git reset command to use the latest git, if you have a ",(0,r.kt)("em",{parentName:"p"},"specific")," reason to use the latest git instead of an official tagged release."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard 7c9db10494c2fffa98a572027d756e55bf754036\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n')),(0,r.kt)("p",null,"When done, the binary can be found in ",(0,r.kt)("inlineCode",{parentName:"p"},"/target/release"),". You can then ",(0,r.kt)("inlineCode",{parentName:"p"},"cp /target/release/rav1e /usr/local/bin")," or wherever you desire the binary to go."),(0,r.kt)("h3",{id:"windows"},"Windows"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-powershell"},"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard 7c9db10494c2fffa98a572027d756e55bf754036\nset RUSTFLAGS=-C target-cpu=native\ncargo build --release\n")),(0,r.kt)("p",null,"When done, the binary can be found in ",(0,r.kt)("inlineCode",{parentName:"p"},"target/release")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Installation with HDR10+ support")),(0,r.kt)("p",null,"rav1e currently has an ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/xiph/rav1e/pull/3000"},"unmerged pull request")," by quietvoid, the person behind ",(0,r.kt)("inlineCode",{parentName:"p"},"hdr10plus_tool")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"dovi_tool"),". The PR adds a new parameter called ",(0,r.kt)("inlineCode",{parentName:"p"},"--hdr10plus-json")," for HDR10+ JSON dynamic metadata input. To merge it locally, do the following:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard [release commit]\ngit fetch origin pull/3000/head:HDR10+\n")),(0,r.kt)("p",null,"now the patch should be applied, build as usual"),(0,r.kt)("h3",{id:"av1"},"AV1"),(0,r.kt)("p",null,"For AV1 encoding, rav1e has very sane defaults. It is very hard to go wrong with parameters if you modify as few as possible."),(0,r.kt)("p",null,"Basic usage:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"rav1e -i input.y4m -o output.ivf --quantizer 60 --photon-noise 8\n")),(0,r.kt)("p",null,"Basic usage with FFmpeg piping, 10bit input:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 80 --photon-noise 8\n")),(0,r.kt)("p",null,"Basic usage with FFmpeg piping, 10bit input and assuming 4K:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 68 --tile-columns 2 --tile-rows 1 --photon-noise 8\n")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Use 2x1 tiles or ",(0,r.kt)("inlineCode",{parentName:"li"},"tile-columns 2")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"tile-rows 1")," for 4K (2160p) encoding, this will help with both encoding and decoding.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/146621ac.71181485.js b/assets/js/146621ac.71181485.js deleted file mode 100644 index a499890b6..000000000 --- a/assets/js/146621ac.71181485.js +++ /dev/null @@ -1 +0,0 @@ -"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/1506.048e9ec4.js b/assets/js/1506.048e9ec4.js deleted file mode 100644 index d6441a26a..000000000 --- a/assets/js/1506.048e9ec4.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1506],{3905:(e,t,n)=>{"use strict";n.d(t,{Zo:()=>u,kt:()=>f});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=o.createContext({}),s=function(e){var t=o.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=s(e.components);return o.createElement(i.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(n),p=r,f=m["".concat(i,".").concat(p)]||m[p]||d[p]||a;return n?o.createElement(f,c(c({ref:t},u),{},{components:n})):o.createElement(f,c({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,c=new Array(a);c[0]=p;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[m]="string"==typeof e?e:r,c[1]=l;for(var s=2;s{"use strict";n.d(t,{Z:()=>u});var o=n(7462),r=n(7294),a=n(6010),c=n(5999),l=n(6668),i=n(9960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:m}}=(0,l.L)();if("h1"===t||!n)return r.createElement(t,(0,o.Z)({},u,{id:void 0}));const d=(0,c.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return r.createElement(t,(0,o.Z)({},u,{className:(0,a.Z)("anchor",m?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n}),u.children,r.createElement(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d},"\u200b"))}},1506:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ye});var o=n(7294),r=n(3905),a=n(7462),c=n(5742);var l=n(2389),i=n(6010),s=n(2949),u=n(6668);function m(){const{prism:e}=(0,u.L)(),{colorMode:t}=(0,s.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var d=n(5281),p=n(7594),f=n.n(p);const h=/title=(?["'])(?.*?)\1/,g=/\{(?<range>[\d,-]+)\}/,y={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function b(e,t){const n=e.map((e=>{const{start:n,end:o}=y[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:r,metastring:a}=t;if(a&&g.test(a)){const e=a.match(g).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=r[0].className,o=f()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return b(["js","jsBlock"],t);case"jsx":case"tsx":return b(["js","jsBlock","jsx"],t);case"html":return b(["js","jsBlock","html"],t);case"python":case"py":case"bash":return b(["bash"],t);case"markdown":case"md":return b(["html","jsx","bash"],t);default:return b(Object.keys(y),t)}}(o,r),l=n.split("\n"),i=Object.fromEntries(r.map((e=>[e.className,{start:0,range:""}]))),s=Object.fromEntries(r.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<l.length;){const e=l[p].match(c);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));s[t]?i[s[t]].range+=`${p},`:u[t]?i[u[t]].start=p:m[t]&&(i[m[t]].range+=`${i[m[t]].start}-${p-1},`),l.splice(p,1)}n=l.join("\n");const d={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;f()(n).forEach((e=>{d[e]??=[],d[e].push(t)}))})),{lineClassNames:d,code:n}}const E={codeBlockContainer:"codeBlockContainer_Ckt0"};function k(e){let{as:t,...n}=e;const r=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,r]=e;const a=t[o];a&&"string"==typeof r&&(n[a]=r)})),n}(m());return o.createElement(t,(0,a.Z)({},n,{style:r,className:(0,i.Z)(n.className,E.codeBlockContainer,d.k.common.codeBlock)}))}const N={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function C(e){let{children:t,className:n}=e;return o.createElement(k,{as:"pre",tabIndex:0,className:(0,i.Z)(N.codeBlockStandalone,"thin-scrollbar",n)},o.createElement("code",{className:N.codeBlockLines},t))}var w=n(902);const B={attributes:!0,characterData:!0,childList:!0,subtree:!0};function T(e,t){const[n,r]=(0,o.useState)(),a=(0,o.useCallback)((()=>{r(e.current?.closest("[role=tabpanel][hidden]"))}),[e,r]);(0,o.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=B);const r=(0,w.zX)(t),a=(0,w.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(r);return e&&t.observe(e,a),()=>t.disconnect()}),[e,r,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const L={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]};var j={Prism:n(7410).Z,theme:L};function Z(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(){return O=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},O.apply(this,arguments)}var x=/\r\n|\r|\n/,S=function(e){0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},_=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function P(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&-1===t.indexOf(o)&&(n[o]=e[o]);return n}var z=function(e){function t(){for(var t=this,n=[],o=arguments.length;o--;)n[o]=arguments[o];e.apply(this,n),Z(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?function(e,t){var n=e.plain,o=Object.create(null),r=e.styles.reduce((function(e,n){var o=n.languages,r=n.style;return o&&!o.includes(t)||n.types.forEach((function(t){var n=O({},e[t],r);e[t]=n})),e}),o);return r.root=n,r.plain=O({},n,{backgroundColor:null}),r}(e.theme,e.language):void 0;return t.themeDict=n})),Z(this,"getLineProps",(function(e){var n=e.key,o=e.className,r=e.style,a=O({},P(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(a.style=c.plain),void 0!==r&&(a.style=void 0!==a.style?O({},a.style,r):r),void 0!==n&&(a.key=n),o&&(a.className+=" "+o),a})),Z(this,"getStyleForToken",(function(e){var n=e.types,o=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return o?{display:"inline-block"}:void 0;if(1===r&&!o)return a[n[0]];var c=o?{display:"inline-block"}:{},l=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[c].concat(l))}})),Z(this,"getTokenProps",(function(e){var n=e.key,o=e.className,r=e.style,a=e.token,c=O({},P(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(c.style=void 0!==c.style?O({},c.style,r):r),void 0!==n&&(c.key=n),o&&(c.className+=" "+o),c})),Z(this,"tokenize",(function(e,t,n,o){var r={code:t,grammar:n,language:o,tokens:[]};e.hooks.run("before-tokenize",r);var a=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),a}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,o=e.code,r=e.children,a=this.getThemeDict(this.props),c=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],o=[0],r=[e.length],a=0,c=0,l=[],i=[l];c>-1;){for(;(a=o[c]++)<r[c];){var s=void 0,u=t[c],m=n[c][a];if("string"==typeof m?(u=c>0?u:["plain"],s=m):(u=_(u,m.type),m.alias&&(u=_(u,m.alias)),s=m.content),"string"==typeof s){var d=s.split(x),p=d.length;l.push({types:u,content:d[0]});for(var f=1;f<p;f++)S(l),i.push(l=[]),l.push({types:u,content:d[f]})}else c++,t.push(u),n.push(s),o.push(0),r.push(s.length)}c--,t.pop(),n.pop(),o.pop(),r.pop()}return S(l),i}(void 0!==c?this.tokenize(t,o,c,n):[o]),className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(o.Component);const A=z,I={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function M(e){let{line:t,classNames:n,showLineNumbers:r,getLineProps:c,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const s=c({line:t,className:(0,i.Z)(n,r&&I.codeLine)}),u=t.map(((e,t)=>o.createElement("span",(0,a.Z)({key:t},l({token:e,key:t})))));return o.createElement("span",s,r?o.createElement(o.Fragment,null,o.createElement("span",{className:I.codeLineNumber}),o.createElement("span",{className:I.codeLineContent},u)):u,o.createElement("br",null))}var D=n(5999);function H(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"}))}function W(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const V={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function R(e){let{code:t,className:n}=e;const[r,a]=(0,o.useState)(!1),c=(0,o.useRef)(void 0),l=(0,o.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const o=document.createElement("textarea"),r=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}o.remove(),c&&(a.removeAllRanges(),a.addRange(c)),r&&r.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),o.createElement("button",{type:"button","aria-label":r?(0,D.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,D.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,D.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.Z)("clean-btn",n,V.copyButton,r&&V.copyButtonCopied),onClick:l},o.createElement("span",{className:V.copyButtonIcons,"aria-hidden":"true"},o.createElement(H,{className:V.copyButtonIcon}),o.createElement(W,{className:V.copyButtonSuccessIcon})))}function $(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"}))}const F={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function q(e){let{className:t,onClick:n,isEnabled:r}=e;const a=(0,D.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return o.createElement("button",{type:"button",onClick:n,className:(0,i.Z)("clean-btn",t,r&&F.wordWrapButtonEnabled),"aria-label":a,title:a},o.createElement($,{className:F.wordWrapButtonIcon,"aria-hidden":"true"}))}function G(e){let{children:t,className:n="",metastring:r,title:c,showLineNumbers:l,language:s}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,u.L)(),f=s??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d,g=m(),y=function(){const[e,t]=(0,o.useState)(!1),[n,r]=(0,o.useState)(!1),a=(0,o.useRef)(null),c=(0,o.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),l=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return T(a,l),(0,o.useEffect)((()=>{l()}),[e,l]),(0,o.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),b=function(e){return e?.match(h)?.groups.title??""}(r)||c,{lineClassNames:E,code:C}=v(t,{metastring:r,language:f,magicComments:p}),w=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(r);return o.createElement(k,{as:"div",className:(0,i.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},b&&o.createElement("div",{className:N.codeBlockTitle},b),o.createElement("div",{className:N.codeBlockContent},o.createElement(A,(0,a.Z)({},j,{theme:g,code:C,language:f??"text"}),(e=>{let{className:t,tokens:n,getLineProps:r,getTokenProps:a}=e;return o.createElement("pre",{tabIndex:0,ref:y.codeBlockRef,className:(0,i.Z)(t,N.codeBlock,"thin-scrollbar")},o.createElement("code",{className:(0,i.Z)(N.codeBlockLines,w&&N.codeBlockLinesWithNumbering)},n.map(((e,t)=>o.createElement(M,{key:t,line:e,getLineProps:r,getTokenProps:a,classNames:E[t],showLineNumbers:w})))))})),o.createElement("div",{className:N.buttonGroup},(y.isEnabled||y.isCodeScrollable)&&o.createElement(q,{className:N.codeButton,onClick:()=>y.toggle(),isEnabled:y.isEnabled}),o.createElement(R,{className:N.codeButton,code:C}))))}function U(e){let{children:t,...n}=e;const r=(0,l.Z)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof c?G:C;return o.createElement(i,(0,a.Z)({key:String(r)},n),c)}var Y=n(9960);var Q=n(6043);const X={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function J(e){return!!e&&("SUMMARY"===e.tagName||J(e.parentElement))}function K(e,t){return!!e&&(e===t||K(e.parentElement,t))}function ee(e){let{summary:t,children:n,...r}=e;const c=(0,l.Z)(),s=(0,o.useRef)(null),{collapsed:u,setCollapsed:m}=(0,Q.u)({initialState:!r.open}),[d,p]=(0,o.useState)(r.open),f=o.isValidElement(t)?t:o.createElement("summary",null,t??"Details");return o.createElement("details",(0,a.Z)({},r,{ref:s,open:d,"data-collapsed":u,className:(0,i.Z)(X.details,c&&X.isBrowser,r.className),onMouseDown:e=>{J(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;J(t)&&K(t,s.current)&&(e.preventDefault(),u?(m(!1),p(!0)):m(!0))}}),f,o.createElement(Q.z,{lazy:!1,collapsed:u,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{m(e),p(!e)}},o.createElement("div",{className:X.collapsibleContent},n)))}const te={details:"details_b_Ee"},ne="alert alert--info";function oe(e){let{...t}=e;return o.createElement(ee,(0,a.Z)({},t,{className:(0,i.Z)(ne,te.details,t.className)}))}var re=n(2503);function ae(e){return o.createElement(re.Z,e)}const ce={containsTaskList:"containsTaskList_mC6p"};function le(e){if(void 0!==e)return(0,i.Z)(e,e?.includes("contains-task-list")&&ce.containsTaskList)}const ie={img:"img_ev3q"};const se="admonition_LlT9",ue="admonitionHeading_tbUL",me="admonitionIcon_kALy",de="admonitionContent_S0QG";const pe={note:{infimaClassName:"secondary",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:o.createElement(D.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:o.createElement(D.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:o.createElement(D.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:o.createElement(D.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 16 16"},o.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:o.createElement(D.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},fe={secondary:"note",important:"info",success:"tip",warning:"danger"};function he(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:r}}(e.children);return{...e,title:e.title??t,children:n}}const ge={head:function(e){const t=o.Children.map(e.children,(e=>o.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...r}=e.props;return o.createElement(e.props.originalType,r)}return e}(e):e));return o.createElement(c.Z,e,t)},code:function(e){const t=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return o.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,o.isValidElement)(e)&&t.includes(e.props?.mdxType)))?o.createElement("code",e):o.createElement(U,e)},a:function(e){return o.createElement(Y.Z,e)},pre:function(e){return o.createElement(U,(0,o.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=o.Children.toArray(e.children),n=t.find((e=>o.isValidElement(e)&&"summary"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return o.createElement(oe,(0,a.Z)({},e,{summary:n}),r)},ul:function(e){return o.createElement("ul",(0,a.Z)({},e,{className:le(e.className)}))},img:function(e){return o.createElement("img",(0,a.Z)({loading:"lazy"},e,{className:(t=e.className,(0,i.Z)(t,ie.img))}));var t},h1:e=>o.createElement(ae,(0,a.Z)({as:"h1"},e)),h2:e=>o.createElement(ae,(0,a.Z)({as:"h2"},e)),h3:e=>o.createElement(ae,(0,a.Z)({as:"h3"},e)),h4:e=>o.createElement(ae,(0,a.Z)({as:"h4"},e)),h5:e=>o.createElement(ae,(0,a.Z)({as:"h5"},e)),h6:e=>o.createElement(ae,(0,a.Z)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:r,icon:a}=he(e),c=function(e){const t=fe[e]??e,n=pe[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),pe.info)}(n),l=r??c.label,{iconComponent:s}=c,u=a??o.createElement(s,null);return o.createElement("div",{className:(0,i.Z)(d.k.common.admonition,d.k.common.admonitionType(e.type),"alert",`alert--${c.infimaClassName}`,se)},o.createElement("div",{className:ue},o.createElement("span",{className:me},u),l),o.createElement("div",{className:de},t))},mermaid:n(1875).Z};function ye(e){let{children:t}=e;return o.createElement(r.Zo,{components:ge},t)}},7594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,r,a]=t;if(o&&a){o=parseInt(o),a=parseInt(a);const e=o<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=e);for(let t=o;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file diff --git a/assets/js/16a2ecb1.78c8b22d.js b/assets/js/16a2ecb1.78c8b22d.js deleted file mode 100644 index d1cfbe5e0..000000000 --- a/assets/js/16a2ecb1.78c8b22d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1810],{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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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)},d="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,i=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),d=u(r),f=o,m=d["".concat(s,".").concat(f)]||d[f]||l[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 c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[d]="string"==typeof e?e:o,a[1]=c;for(var u=2;u<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},2601:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={title:"VTM",sidebar_position:11},a="VTM",c={unversionedId:"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!",source:"@site/docs/encoders/VTM.md",sourceDirName:"encoders",slug:"/encoders/VTM",permalink:"/docs/encoders/VTM",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/VTM.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"VTM",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"uvg266",permalink:"/docs/encoders/uvg266"},next:{title:"AVM",permalink:"/docs/encoders/AVM"}},s={},u=[],p={toc:u},d="wrapper";function l(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"vtm"},"VTM"),(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,"VTM is the original ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/VVC"},"H.266")," (better known as VVC) reference encoder, in competition with alternatives like ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/VVenC"},"VVenC"),". In the modern day, it joins other MPEG reference encoders such as ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/HM"},"HM")," & ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/JM"},"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."))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/170db0a5.96c14a4c.js b/assets/js/170db0a5.96c14a4c.js deleted file mode 100644 index 224218bbc..000000000 --- a/assets/js/170db0a5.96c14a4c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6301],{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 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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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},l=function(e){var t=u(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,l=c(e,["components","mdxType","originalType","parentName"]),p=u(r),f=o,b=p["".concat(s,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(b,a(a({ref:t},l),{},{components:r})):n.createElement(b,a({ref:t},l))}));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 u=2;u<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},5449:(e,t,r)=>{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:"AVS3",sidebar_position:7},a="AVS3",c={unversionedId:"video/AVS3",id:"video/AVS3",title:"AVS3",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/AVS3.md",sourceDirName:"video",slug:"/video/AVS3",permalink:"/docs/video/AVS3",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AVS3.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"AVS3",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AV1",permalink:"/docs/video/AV1"},next:{title:"VC-1",permalink:"/docs/video/VC-1"}},s={},u=[],l={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"avs3"},"AVS3"),(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/1772.a91a0965.js b/assets/js/1772.a91a0965.js new file mode 100644 index 000000000..4483944a6 --- /dev/null +++ b/assets/js/1772.a91a0965.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1772],{5658:(e,t,i)=>{i.d(t,{Z:()=>a});i(7294);var n=i(6010),o=i(5999),s=i(7955),r=i(5893);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,n.Z)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.Z,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},1772:(e,t,i)=>{i.r(t),i.d(t,{default:()=>d});i(7294);var n=i(5999),o=i(1944),s=i(179),r=i(5658),a=i(5893);function d(){const e=(0,n.I)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.d,{title:e}),(0,a.jsx)(s.Z,{children:(0,a.jsx)(r.Z,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/1776fc83.0cbe1638.js b/assets/js/1776fc83.0cbe1638.js deleted file mode 100644 index b36495d23..000000000 --- a/assets/js/1776fc83.0cbe1638.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6326],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});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<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,i=function(e,t){if(null==e)return{};var n,a,i={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(s.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 n=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=p(n),u=i,g=d["".concat(s,".").concat(u)]||d[u]||m[u]||r;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,o=new Array(r);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:i,o[1]=l;for(var p=2;p<r;p++)o[p]=n[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}u.displayName="MDXCreateElement"},8222:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>p});var a=n(7462),i=(n(7294),n(3905));const r={label:"JPEG-XL",sidebar_position:7},o="JPEG-XL",l={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:"Usage",id:"usage",level:2},{value:"Decoding",id:"decoding",level:3},{value:"Encoding",id:"encoding",level:3},{value:"Distance and quality",id:"distance-and-quality",level:4},{value:"Effort",id:"effort",level:4},{value:"Performance Checklist",id:"performance-checklist",level:2}],c={toc:p},d="wrapper";function m(e){let{components:t,...n}=e;return(0,i.kt)(d,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"jpeg-xl"},"JPEG-XL"),(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-XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional ",(0,i.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. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG."),(0,i.kt)("h2",{id:"usage"},"Usage"),(0,i.kt)("p",null,"While it has support by many image viewers, editors, and other software, such as GIMP, Krita, Safari, ImageMagick, and many more, the most complete set of tools for encoding, manipulating, and decoding ",(0,i.kt)("inlineCode",{parentName:"p"},".jxl")," files is libjxl, the reference library for the format."),(0,i.kt)("h3",{id:"decoding"},"Decoding"),(0,i.kt)("p",null,"Decoding a ",(0,i.kt)("inlineCode",{parentName:"p"},".jxl")," image is straightforward with libjxl's decoder, ",(0,i.kt)("inlineCode",{parentName:"p"},"djxl"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"djxl example.jxl example.png\n")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"djxl")," can decode to pixels via pipes, png, apng for animated jxl, jpg, ppm, and pfm."),(0,i.kt)("p",null,"By default, if the ",(0,i.kt)("inlineCode",{parentName:"p"},".jxl")," file was encoded with lossless jpeg recompression, ",(0,i.kt)("inlineCode",{parentName:"p"},"djxl")," will rebuild the exact jpeg file that was originally compressed. To avoid this, and create a new jpeg file:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"djxl -j example.jxl example.jpg\n")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Keep in mind this is now a lossy process as ",(0,i.kt)("inlineCode",{parentName:"strong"},"djxl")," will decode to pixels, then encode a new ",(0,i.kt)("inlineCode",{parentName:"strong"},".jpg")," with those pixels.")),(0,i.kt)("h3",{id:"encoding"},"Encoding"),(0,i.kt)("p",null,"libjxl's encoder ",(0,i.kt)("inlineCode",{parentName:"p"},"cjxl")," has more options to play around with. It takes a few primary arguments, distance (",(0,i.kt)("inlineCode",{parentName:"p"},"-d"),"), quality (",(0,i.kt)("inlineCode",{parentName:"p"},"-q"),"), and effort (",(0,i.kt)("inlineCode",{parentName:"p"},"-e"),")."),(0,i.kt)("h4",{id:"distance-and-quality"},"Distance and quality"),(0,i.kt)("p",null,"Distance and quality are two ways of specifying ",(0,i.kt)("em",{parentName:"p"},"how much loss")," you are willing to tolerate, and as such, they are mutually exclusive, as they pull the same levers under the hood."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Distance is designed to map to how 'close' one must be to the source to notice any loss. It is represented as a scale between 0.0 & 25.0. 0.0 is ",(0,i.kt)("strong",{parentName:"li"},"mathematically lossless"),", every pixel will have the exact same value as the source. 1.0 is designed to be ",(0,i.kt)("strong",{parentName:"li"},"visually lossless"),", look the same at a normal viewing distance, and higher values have more loss."),(0,i.kt)("li",{parentName:"ul"},"Quality is designed to roughly map to ",(0,i.kt)("a",{parentName:"li",href:"/docs/images/JPEG"},"JPEG"),"'s quality argument. A range 0-100, where 100 is ",(0,i.kt)("strong",{parentName:"li"},"mathematically lossless"),", 90 is intended to be ",(0,i.kt)("strong",{parentName:"li"},"visually lossless"),", and 0 is almost unrecognizable as the original image.")),(0,i.kt)("h4",{id:"effort"},"Effort"),(0,i.kt)("p",null,"Effort is similar to ",(0,i.kt)("inlineCode",{parentName:"p"},"cpu-used")," in video encoding. It specifies the amount of effort the encoder will make in order to get the smallest file size it can. It takes the form of a range 1-9, where higher numbers will spend more resources to get diminishing returns in terms of smaller size, while lower values do the opposite, leaving file size on the table for faster encoding."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"cjxl -e 9 -d 0.3 example.png example.jxl\n")),(0,i.kt)("p",null,"Encoding with effort 9 and distance 0.3"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"cjxl example.jpg example.jxl\n")),(0,i.kt)("p",null,"This, by default uses lossless JPEG compression."),(0,i.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,i.kt)("p",null,"Lossless? ",(0,i.kt)("em",{parentName:"p"},"Yes")),(0,i.kt)("p",null,"Lossy? ",(0,i.kt)("em",{parentName:"p"},"Yes")),(0,i.kt)("p",null,"Supported Bit Depths:\n",(0,i.kt)("em",{parentName:"p"},"Up to 32 BPC")),(0,i.kt)("p",null,"HDR/Wide Gamut? ",(0,i.kt)("em",{parentName:"p"},"Yes")),(0,i.kt)("p",null,"Animation? ",(0,i.kt)("em",{parentName:"p"},"Yes")),(0,i.kt)("p",null,"Transparency? ",(0,i.kt)("em",{parentName:"p"},"Yes")),(0,i.kt)("p",null,"Progressive Decode? ",(0,i.kt)("em",{parentName:"p"},"Yes")),(0,i.kt)("p",null,"Royalty Free? ",(0,i.kt)("em",{parentName:"p"},"Yes")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/17896441.3f58c921.js b/assets/js/17896441.3f58c921.js new file mode 100644 index 000000000..60315bff8 --- /dev/null +++ b/assets/js/17896441.3f58c921.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7918],{8945:(e,t,n)=>{n.r(t),n.d(t,{default:()=>de});var s=n(7294),a=n(1944),i=n(902),l=n(5893);const o=s.createContext(null);function r(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,l.jsx)(o.Provider,{value:a,children:t})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new i.i6("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=c();return(0,l.jsx)(a.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(6010),m=n(7524),h=n(5999),v=n(2244);function x(e){const{previous:t,next:n}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,l.jsx)(v.Z,{...t,subLabel:(0,l.jsx)(h.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,l.jsx)(v.Z,{...n,subLabel:(0,l.jsx)(h.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function p(){const{metadata:e}=c();return(0,l.jsx)(x,{previous:e.previous,next:e.next})}var b=n(2263),g=n(9960),f=n(143),j=n(5281),L=n(373),N=n(4477);const C={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function _(e){const t=C[e.versionMetadata.banner];return(0,l.jsx)(t,{...e})}function Z(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,l.jsx)(h.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(g.Z,{to:n,onClick:s,children:(0,l.jsx)(h.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function k(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,b.Z)(),{pluginId:a}=(0,f.gA)({failfast:!0}),{savePreferredVersionName:i}=(0,L.J)(a),{latestDocSuggestion:o,latestVersionSuggestion:r}=(0,f.Jo)(a),c=o??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,l.jsxs)("div",{className:(0,u.Z)(t,j.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(_,{siteTitle:s,versionMetadata:n})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(Z,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function T(e){let{className:t}=e;const n=(0,N.E)();return n.banner?(0,l.jsx)(k,{className:t,versionMetadata:n}):null}function U(e){let{className:t}=e;const n=(0,N.E)();return n.badge?(0,l.jsx)("span",{className:(0,u.Z)(t,j.k.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}function H(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return(0,l.jsx)(h.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,l.jsx)("b",{children:(0,l.jsx)("time",{dateTime:new Date(1e3*t).toISOString(),children:n})})},children:" on {date}"})}function w(e){let{lastUpdatedBy:t}=e;return(0,l.jsx)(h.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,l.jsx)("b",{children:t})},children:" by {user}"})}function y(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:s}=e;return(0,l.jsxs)("span",{className:j.k.common.lastUpdated,children:[(0,l.jsx)(h.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?(0,l.jsx)(H,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:s?(0,l.jsx)(w,{lastUpdatedBy:s}):""},children:"Last updated{atDate}{byUser}"}),!1]})}var A=n(4881),M=n(1526);const E={lastUpdated:"lastUpdated_vwxv"};function I(e){return(0,l.jsx)("div",{className:(0,u.Z)(j.k.docs.docFooterTagsRow,"row margin-bottom--sm"),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(M.Z,{...e})})})}function B(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,formattedLastUpdatedAt:a}=e;return(0,l.jsxs)("div",{className:(0,u.Z)(j.k.docs.docFooterEditMetaRow,"row"),children:[(0,l.jsx)("div",{className:"col",children:t&&(0,l.jsx)(A.Z,{editUrl:t})}),(0,l.jsx)("div",{className:(0,u.Z)("col",E.lastUpdated),children:(n||s)&&(0,l.jsx)(y,{lastUpdatedAt:n,formattedLastUpdatedAt:a,lastUpdatedBy:s})})]})}function O(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:s,lastUpdatedBy:a,tags:i}=e,o=i.length>0,r=!!(t||n||a);return o||r?(0,l.jsxs)("footer",{className:(0,u.Z)(j.k.docs.docFooter,"docusaurus-mt-lg"),children:[o&&(0,l.jsx)(I,{tags:i}),r&&(0,l.jsx)(B,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:a,formattedLastUpdatedAt:s})]}):null}var S=n(6043),V=n(3743);const P={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function R(e){let{collapsed:t,...n}=e;return(0,l.jsx)("button",{type:"button",...n,className:(0,u.Z)("clean-btn",P.tocCollapsibleButton,!t&&P.tocCollapsibleButtonExpanded,n.className),children:(0,l.jsx)(h.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const D={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function F(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:o}=(0,S.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.Z)(D.tocCollapsible,!i&&D.tocCollapsibleExpanded,n),children:[(0,l.jsx)(R,{collapsed:i,onClick:o}),(0,l.jsx)(S.z,{lazy:!0,className:D.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(V.Z,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const z={tocMobile:"tocMobile_ITEo"};function q(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(F,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.Z)(j.k.docs.docTocMobile,z.tocMobile)})}var G=n(9407);function W(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(G.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:j.k.docs.docTocDesktop})}var $=n(7955),J=n(2459);function Q(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.Z)(j.k.docs.docMarkdown,"markdown"),children:[n&&(0,l.jsx)("header",{children:(0,l.jsx)($.Z,{as:"h1",children:n})}),(0,l.jsx)(J.Z,{children:t})]})}var X=n(3438),Y=n(8596),K=n(4996);function ee(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const te={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function ne(){const e=(0,K.Z)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(g.Z,{"aria-label":(0,h.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,l.jsx)(ee,{className:te.breadcrumbHomeIcon})})})}const se={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function ae(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,l.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,l.jsx)(g.Z,{className:a,href:n,itemProp:"item",children:(0,l.jsx)("span",{itemProp:"name",children:t})}):(0,l.jsx)("span",{className:a,children:t})}function ie(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,l.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,l.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function le(){const e=(0,X.s1)(),t=(0,Y.Ns)();return e?(0,l.jsx)("nav",{className:(0,u.Z)(j.k.docs.docBreadcrumbs,se.breadcrumbsContainer),"aria-label":(0,h.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,l.jsx)(ne,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,l.jsx)(ie,{active:s,index:n,addMicrodata:!!a,children:(0,l.jsx)(ae,{href:a,isLast:s,children:t.label})},n)}))]})}):null}var oe=n(2212);const re={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function ce(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,l.jsx)(q,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,l.jsx)(W,{})}}(),{metadata:{unlisted:s}}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.Z)("col",!n.hidden&&re.docItemCol),children:[s&&(0,l.jsx)(oe.Z,{}),(0,l.jsx)(T,{}),(0,l.jsxs)("div",{className:re.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(le,{}),(0,l.jsx)(U,{}),n.mobile,(0,l.jsx)(Q,{children:t}),(0,l.jsx)(O,{})]}),(0,l.jsx)(p,{})]})]}),n.desktop&&(0,l.jsx)("div",{className:"col col--3",children:n.desktop})]})}function de(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(a.FG,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(ce,{children:(0,l.jsx)(n,{})})]})})}},4881:(e,t,n)=>{n.d(t,{Z:()=>d});n(7294);var s=n(5999),a=n(5281),i=n(9960),l=n(6010);const o={iconEdit:"iconEdit_Z9Sw"};var r=n(5893);function c(e){let{className:t,...n}=e;return(0,r.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,l.Z)(o.iconEdit,t),"aria-hidden":"true",...n,children:(0,r.jsx)("g",{children:(0,r.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,r.jsxs)(i.Z,{to:t,className:a.k.common.editThisPage,children:[(0,r.jsx)(c,{}),(0,r.jsx)(s.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}},2244:(e,t,n)=>{n.d(t,{Z:()=>l});n(7294);var s=n(6010),a=n(9960),i=n(5893);function l(e){const{permalink:t,title:n,subLabel:l,isNext:o}=e;return(0,i.jsxs)(a.Z,{className:(0,s.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},9407:(e,t,n)=>{n.d(t,{Z:()=>c});n(7294);var s=n(6010),a=n(3743);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=n(5893);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,l.jsx)("div",{className:(0,s.Z)(i.tableOfContents,"thin-scrollbar",t),children:(0,l.jsx)(a.Z,{...n,linkClassName:o,linkActiveClassName:r})})}},3743:(e,t,n)=>{n.d(t,{Z:()=>x});var s=n(7294),a=n(6668);function i(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function o(e){const t=e.getBoundingClientRect();return t.top===t.bottom?o(e.parentNode):t}function r(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>o(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(o(s))?s:e[e.indexOf(s)-1]??null}return e[e.length-1]??null}function c(){const e=(0,s.useRef)(0),{navbar:{hideOnScroll:t}}=(0,a.L)();return(0,s.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:l}),c=r(o,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}var u=n(9960),m=n(5893);function h(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.Z,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function x(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const x=(0,a.L)(),p=c??x.tableOfContents.minHeadingLevel,b=u??x.tableOfContents.maxHeadingLevel,g=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>l({toc:i(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:b});return d((0,s.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:p,maxHeadingLevel:b}}),[o,r,p,b])),(0,m.jsx)(v,{toc:g,className:n,linkClassName:o,...h})}},3008:(e,t,n)=>{n.d(t,{Z:()=>o});n(7294);var s=n(6010),a=n(9960);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=n(5893);function o(e){let{permalink:t,label:n,count:o}=e;return(0,l.jsxs)(a.Z,{href:t,className:(0,s.Z)(i.tag,o?i.tagWithCount:i.tagRegular),children:[n,o&&(0,l.jsx)("span",{children:o})]})}},1526:(e,t,n)=>{n.d(t,{Z:()=>r});n(7294);var s=n(6010),a=n(5999),i=n(3008);const l={tags:"tags_jXut",tag:"tag_QGVx"};var o=n(5893);function r(e){let{tags:t}=e;return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("b",{children:(0,o.jsx)(a.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,o.jsx)("ul",{className:(0,s.Z)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:n}=e;return(0,o.jsx)("li",{className:l.tag,children:(0,o.jsx)(i.Z,{label:t,permalink:n})},n)}))})]})}},2212:(e,t,n)=>{n.d(t,{Z:()=>h});n(7294);var s=n(6010),a=n(5999),i=n(5742),l=n(5893);function o(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.Z,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(5281),u=n(9047);function m(e){let{className:t}=e;return(0,l.jsx)(u.Z,{type:"caution",title:(0,l.jsx)(o,{}),className:(0,s.Z)(t,d.k.common.unlistedBanner),children:(0,l.jsx)(r,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/17896441.5b235d7f.js b/assets/js/17896441.5b235d7f.js deleted file mode 100644 index fbff033e1..000000000 --- a/assets/js/17896441.5b235d7f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7918],{8945:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ie});var a=n(7294),l=n(1944),r=n(902);const o=a.createContext(null);function s(e){let{children:t,content:n}=e;const l=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(o.Provider,{value:l},t)}function c(){const e=(0,a.useContext)(o);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:n}=c();return a.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(6010),m=n(7524),u=n(7462),v=n(5999),b=n(2244);function p(e){const{previous:t,next:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,v.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&a.createElement(b.Z,(0,u.Z)({},t,{subLabel:a.createElement(v.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&a.createElement(b.Z,(0,u.Z)({},n,{subLabel:a.createElement(v.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}function h(){const{metadata:e}=c();return a.createElement(p,{previous:e.previous,next:e.next})}var g=n(2263),E=n(9960),f=n(143),L=n(5281),N=n(373),C=n(4477);const _={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(v.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(v.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function k(e){const t=_[e.versionMetadata.banner];return a.createElement(t,e)}function Z(e){let{versionLabel:t,to:n,onClick:l}=e;return a.createElement(v.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(E.Z,{to:n,onClick:l},a.createElement(v.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function x(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:l}}=(0,g.Z)(),{pluginId:r}=(0,f.gA)({failfast:!0}),{savePreferredVersionName:o}=(0,N.J)(r),{latestDocSuggestion:s,latestVersionSuggestion:c}=(0,f.Jo)(r),i=s??(m=c).docs.find((e=>e.id===m.mainDocId));var m;return a.createElement("div",{className:(0,d.Z)(t,L.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(k,{siteTitle:l,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(Z,{versionLabel:c.label,to:i.path,onClick:()=>o(c.name)})))}function T(e){let{className:t}=e;const n=(0,C.E)();return n.banner?a.createElement(x,{className:t,versionMetadata:n}):null}function H(e){let{className:t}=e;const n=(0,C.E)();return n.badge?a.createElement("span",{className:(0,d.Z)(t,L.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(v.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}function U(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(v.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function w(e){let{lastUpdatedBy:t}=e;return a.createElement(v.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function y(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:l}=e;return a.createElement("span",{className:L.k.common.lastUpdated},a.createElement(v.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(U,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:l?a.createElement(w,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var A=n(4881),M=n(1526);const I={lastUpdated:"lastUpdated_vwxv"};function B(e){return a.createElement("div",{className:(0,d.Z)(L.k.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(M.Z,e)))}function O(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:l,formattedLastUpdatedAt:r}=e;return a.createElement("div",{className:(0,d.Z)(L.k.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(A.Z,{editUrl:t})),a.createElement("div",{className:(0,d.Z)("col",I.lastUpdated)},(n||l)&&a.createElement(y,{lastUpdatedAt:n,formattedLastUpdatedAt:r,lastUpdatedBy:l})))}function V(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:l,lastUpdatedBy:r,tags:o}=e,s=o.length>0,i=!!(t||n||r);return s||i?a.createElement("footer",{className:(0,d.Z)(L.k.docs.docFooter,"docusaurus-mt-lg")},s&&a.createElement(B,{tags:o}),i&&a.createElement(O,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:r,formattedLastUpdatedAt:l})):null}var P=n(6043),S=n(3743);const R={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function D(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,u.Z)({type:"button"},n,{className:(0,d.Z)("clean-btn",R.tocCollapsibleButton,!t&&R.tocCollapsibleButtonExpanded,n.className)}),a.createElement(v.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const F={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function z(e){let{toc:t,className:n,minHeadingLevel:l,maxHeadingLevel:r}=e;const{collapsed:o,toggleCollapsed:s}=(0,P.u)({initialState:!0});return a.createElement("div",{className:(0,d.Z)(F.tocCollapsible,!o&&F.tocCollapsibleExpanded,n)},a.createElement(D,{collapsed:o,onClick:s}),a.createElement(P.z,{lazy:!0,className:F.tocCollapsibleContent,collapsed:o},a.createElement(S.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:r})))}const q={tocMobile:"tocMobile_ITEo"};function j(){const{toc:e,frontMatter:t}=c();return a.createElement(z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(L.k.docs.docTocMobile,q.tocMobile)})}var G=n(9407);function W(){const{toc:e,frontMatter:t}=c();return a.createElement(G.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:L.k.docs.docTocDesktop})}var $=n(2503),J=n(1506);function Q(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.Z)(L.k.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement($.Z,{as:"h1"},n)),a.createElement(J.Z,null,t))}var X=n(3438),Y=n(8596),K=n(4996);function ee(e){return a.createElement("svg",(0,u.Z)({viewBox:"0 0 24 24"},e),a.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const te={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function ne(){const e=(0,K.Z)("/");return a.createElement("li",{className:"breadcrumbs__item"},a.createElement(E.Z,{"aria-label":(0,v.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},a.createElement(ee,{className:te.breadcrumbHomeIcon})))}const ae={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function le(e){let{children:t,href:n,isLast:l}=e;const r="breadcrumbs__link";return l?a.createElement("span",{className:r,itemProp:"name"},t):n?a.createElement(E.Z,{className:r,href:n,itemProp:"item"},a.createElement("span",{itemProp:"name"},t)):a.createElement("span",{className:r},t)}function re(e){let{children:t,active:n,index:l,addMicrodata:r}=e;return a.createElement("li",(0,u.Z)({},r&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,d.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,a.createElement("meta",{itemProp:"position",content:String(l+1)}))}function oe(){const e=(0,X.s1)(),t=(0,Y.Ns)();return e?a.createElement("nav",{className:(0,d.Z)(L.k.docs.docBreadcrumbs,ae.breadcrumbsContainer),"aria-label":(0,v.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},a.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&a.createElement(ne,null),e.map(((t,n)=>{const l=n===e.length-1;return a.createElement(re,{key:n,active:l,index:n,addMicrodata:!!t.href},a.createElement(le,{href:t.href,isLast:l},t.label))})))):null}const se={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function ce(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),l=e.hide_table_of_contents,r=!l&&t.length>0;return{hidden:l,mobile:r?a.createElement(j,null):void 0,desktop:!r||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(W,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.Z)("col",!n.hidden&&se.docItemCol)},a.createElement(T,null),a.createElement("div",{className:se.docItemContainer},a.createElement("article",null,a.createElement(oe,null),a.createElement(H,null),n.mobile,a.createElement(Q,null,t),a.createElement(V,null)),a.createElement(h,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function ie(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(s,{content:e.content},a.createElement(l.FG,{className:t},a.createElement(i,null),a.createElement(ce,null,a.createElement(n,null))))}},4881:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(7294),l=n(5999),r=n(5281),o=n(7462),s=n(6010);const c={iconEdit:"iconEdit_Z9Sw"};function i(e){let{className:t,...n}=e;return a.createElement("svg",(0,o.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.Z)(c.iconEdit,t),"aria-hidden":"true"},n),a.createElement("g",null,a.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function d(e){let{editUrl:t}=e;return a.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:r.k.common.editThisPage},a.createElement(i,null),a.createElement(l.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},2244:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(7294),l=n(6010),r=n(9960);function o(e){const{permalink:t,title:n,subLabel:o,isNext:s}=e;return a.createElement(r.Z,{className:(0,l.Z)("pagination-nav__link",s?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},o&&a.createElement("div",{className:"pagination-nav__sublabel"},o),a.createElement("div",{className:"pagination-nav__label"},n))}},9407:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(7462),l=n(7294),r=n(6010),o=n(3743);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",i="table-of-contents__link--active";function d(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,r.Z)(s.tableOfContents,"thin-scrollbar",t)},l.createElement(o.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:i})))}},3743:(e,t,n)=>{n.d(t,{Z:()=>b});var a=n(7462),l=n(7294),r=n(6668);function o(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function s(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=s({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function i(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(c(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function d(){const e=(0,l.useRef)(0),{navbar:{hideOnScroll:t}}=(0,r.L)();return(0,l.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,l.useRef)(void 0),n=d();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:o}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:o}),c=i(s,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===d)}))}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:r}=e;return t.length?l.createElement("ul",{className:r?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const v=l.memo(u);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:i,minHeadingLevel:d,maxHeadingLevel:u,...b}=e;const p=(0,r.L)(),h=d??p.tableOfContents.minHeadingLevel,g=u??p.tableOfContents.maxHeadingLevel,E=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>s({toc:o(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:h,maxHeadingLevel:g});return m((0,l.useMemo)((()=>{if(c&&i)return{linkClassName:c,linkActiveClassName:i,minHeadingLevel:h,maxHeadingLevel:g}}),[c,i,h,g])),l.createElement(v,(0,a.Z)({toc:E,className:n,linkClassName:c},b))}},3008:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(7294),l=n(6010),r=n(9960);const o={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function s(e){let{permalink:t,label:n,count:s}=e;return a.createElement(r.Z,{href:t,className:(0,l.Z)(o.tag,s?o.tagWithCount:o.tagRegular)},n,s&&a.createElement("span",null,s))}},1526:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(7294),l=n(6010),r=n(5999),o=n(3008);const s={tags:"tags_jXut",tag:"tag_QGVx"};function c(e){let{tags:t}=e;return a.createElement(a.Fragment,null,a.createElement("b",null,a.createElement(r.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),a.createElement("ul",{className:(0,l.Z)(s.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:n}=e;return a.createElement("li",{key:n,className:s.tag},a.createElement(o.Z,{label:t,permalink:n}))}))))}},4477:(e,t,n)=>{n.d(t,{E:()=>s,q:()=>o});var a=n(7294),l=n(902);const r=a.createContext(null);function o(e){let{children:t,version:n}=e;return a.createElement(r.Provider,{value:n},t)}function s(){const e=(0,a.useContext)(r);if(null===e)throw new l.i6("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/18c4b02f.92a4cdfa.js b/assets/js/18c4b02f.92a4cdfa.js deleted file mode 100644 index ffa5a8c56..000000000 --- a/assets/js/18c4b02f.92a4cdfa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1777],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}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)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(r),m=i,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;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,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[p]="string"==typeof e?e:i,a[1]=c;for(var l=2;l<o;l++)a[l]=r[l];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},3167:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var n=r(7462),i=(r(7294),r(3905));const o={label:"SSIMULACRA2",sidebar_position:1},a="SSIMULACRA2",c={unversionedId:"metrics/SSIMULACRA2",id:"metrics/SSIMULACRA2",title:"SSIMULACRA2",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/SSIMULACRA2.md",sourceDirName:"metrics",slug:"/metrics/SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIMULACRA2.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"SSIMULACRA2",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIM",permalink:"/docs/metrics/SSIM"},next:{title:"VMAF",permalink:"/docs/metrics/VMAF"}},s={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,i.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"ssimulacra2"},"SSIMULACRA2"),(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,"SSIMULACRA 2 is a visual fidelity metric based on the concept of the multi-scale structural similarity index measure (MS-SSIM), computed in a perceptually relevant color space, adding two other (asymmetric) error maps, and aggregating using two different norms. It is currently the most reputable visual quality metric according to its correlation with subjective results, and is considered a very robust means of comparing encoders. It is debatable whether ",(0,i.kt)("a",{parentName:"p",href:"/docs/metrics/butteraugli"},"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."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/195e296c.d6739c70.js b/assets/js/195e296c.d6739c70.js deleted file mode 100644 index e621e09df..000000000 --- a/assets/js/195e296c.d6739c70.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<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,i,a=function(e,t){if(null==e)return{};var n,i,a={},o=Object.keys(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=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<o;c++)r[c]=n[c];return i.createElement.apply(null,r)}return i.createElement.apply(null,n)}h.displayName="MDXCreateElement"},7019:(e,t,n)=>{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/19839cd1.1e966039.js b/assets/js/19839cd1.1e966039.js deleted file mode 100644 index 8f2b2e230..000000000 --- a/assets/js/19839cd1.1e966039.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3958],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),c=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(l.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 n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),m=r,f=u["".concat(l,".").concat(m)]||u[m]||d[m]||a;return n?o.createElement(f,i(i({ref:t},p),{},{components:n})):o.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:r,i[1]=s;for(var c=2;c<a;c++)i[c]=n[c];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},1383:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var o=n(7462),r=(n(7294),n(3905));const a={label:"FLAC",sidebar_position:7},i="FLAC",s={unversionedId:"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!",source:"@site/docs/audio/FLAC.md",sourceDirName:"audio",slug:"/audio/FLAC",permalink:"/docs/audio/FLAC",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/FLAC.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"FLAC",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Speex",permalink:"/docs/audio/Speex"},next:{title:"WavPack",permalink:"/docs/audio/WavPack"}},l={},c=[{value:"Software support",id:"software-support",level:2},{value:"WAV to FLAC using FFmpeg:",id:"wav-to-flac-using-ffmpeg",level:3},{value:"WAV to FLAC using FLAC command-line tool:",id:"wav-to-flac-using-flac-command-line-tool",level:3}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,o.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"flac"},"FLAC"),(0,r.kt)("admonition",{title:"Help Wanted",type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"This section is in need of contributions. If you believe you can help, please see our ",(0,r.kt)("a",{parentName:"p",href:"/docs/contribution-guide"},"Contribution Guide")," to get started as a contributor!")),(0,r.kt)("p",null,"FLAC (Free Lossless Audio Coding) is an open-source lossless audio codec with widespread support & compatibility released in 2001. It represents the most efficent lossless audio format in common use today."),(0,r.kt)("p",null,"FLAC is commonly contained in a ogg container with either a ",(0,r.kt)("inlineCode",{parentName:"p"},".flac")," or ",(0,r.kt)("inlineCode",{parentName:"p"},".ogg")," extension. It can less commonly be used within a matroska container (",(0,r.kt)("inlineCode",{parentName:"p"},".mkv")," or ",(0,r.kt)("inlineCode",{parentName:"p"},".mka"),") for mixing with a video stream."),(0,r.kt)("h2",{id:"software-support"},"Software support"),(0,r.kt)("p",null,"FLAC is supported by the majority of web browsers and media players in common use as of 2023."),(0,r.kt)("h3",{id:"wav-to-flac-using-ffmpeg"},"WAV to FLAC using ",(0,r.kt)("a",{parentName:"h3",href:"/docs/utilities/ffmpeg"},"FFmpeg"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -i example.wav -c:a flac example.flac\n")),(0,r.kt)("h3",{id:"wav-to-flac-using-flac-command-line-tool"},"WAV to FLAC using FLAC command-line tool:"),(0,r.kt)("p",null,"You can include an argument of a number 0-8 to specify the compression effort, 0 being fastest and 8 having the highest compression."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"flac example.wav -8 -o example.flac\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.70a37883.js b/assets/js/1a4e3797.70a37883.js new file mode 100644 index 000000000..6a791b4b0 --- /dev/null +++ b/assets/js/1a4e3797.70a37883.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7920],{8824:(e,t,r)=>{r.d(t,{c:()=>u});var s=r(7294),a=r(2263);const n=["zero","one","two","few","many","other"];function c(e){return n.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:c(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,a.Z)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:c(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function u(){const e=o();return{selectMessage:(t,r)=>function(e,t,r){const s=e.split("|");if(1===s.length)return s[0];s.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const a=r.select(t),n=r.pluralForms.indexOf(a);return s[Math.min(n,s.length-1)]}(r,t,e)}}},1473:(e,t,r)=>{r.r(t),r.d(t,{default:()=>P});var s=r(7294),a=r(2263),n=r(179),c=r(5742),l=r(9960),o=r(5999),u=r(8824),h=r(6010),i=r(6550),m=r(2389);const d=function(){const e=(0,m.Z)(),t=(0,i.k6)(),r=(0,i.TH)(),{siteConfig:{baseUrl:s}}=(0,a.Z)(),n=e?new URLSearchParams(r.search):null,c=n?.get("q")||"",l=n?.get("ctx")||"",o=n?.get("version")||"",u=e=>{const t=new URLSearchParams(r.search);return e?t.set("q",e):t.delete("q"),t};return{searchValue:c,searchContext:l,searchVersion:o,updateSearchPath:e=>{const r=u(e);t.replace({search:r.toString()})},updateSearchContext:e=>{const s=new URLSearchParams(r.search);s.set("ctx",e),t.replace({search:s.toString()})},generateSearchPageLink:e=>{const t=u(e);return`${s}search?${t.toString()}`}}};var p=r(22),g=r(8202),x=r(2539),f=r(726),y=r(1073),S=r(311),C=r(3926),j=r(1029);const I={searchContextInput:"searchContextInput_mXoe",searchQueryInput:"searchQueryInput_CFBF",searchResultItem:"searchResultItem_U687",searchResultItemPath:"searchResultItemPath_uIbk",searchResultItemSummary:"searchResultItemSummary_oZHr",searchQueryColumn:"searchQueryColumn_q7nx",searchContextColumn:"searchContextColumn_oWAF"};var v=r(5893);function w(){const{siteConfig:{baseUrl:e}}=(0,a.Z)(),{selectMessage:t}=(0,u.c)(),{searchValue:r,searchContext:n,searchVersion:l,updateSearchPath:i,updateSearchContext:m}=d(),[x,f]=(0,s.useState)(r),[y,C]=(0,s.useState)(),[w,P]=(0,s.useState)(),_=`${e}${l}`,b=(0,s.useMemo)((()=>x?(0,o.I)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:x}):(0,o.I)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})),[x]);(0,s.useEffect)((()=>{i(x),y&&(x?y(x,(e=>{P(e)})):P(void 0))}),[x,y]);const F=(0,s.useCallback)((e=>{f(e.target.value)}),[]);return(0,s.useEffect)((()=>{r&&r!==x&&f(r)}),[r]),(0,s.useEffect)((()=>{!async function(){const{wrappedIndexes:e,zhDictionary:t}=await(0,p.w)(_,n);C((()=>(0,g.v)(e,t,100)))}()}),[n,_]),(0,v.jsxs)(s.Fragment,{children:[(0,v.jsxs)(c.Z,{children:[(0,v.jsx)("meta",{property:"robots",content:"noindex, follow"}),(0,v.jsx)("title",{children:b})]}),(0,v.jsxs)("div",{className:"container margin-vert--lg",children:[(0,v.jsx)("h1",{children:b}),(0,v.jsxs)("div",{className:"row",children:[(0,v.jsx)("div",{className:(0,h.Z)("col",{[I.searchQueryColumn]:Array.isArray(j.Kc),"col--9":Array.isArray(j.Kc),"col--12":!Array.isArray(j.Kc)}),children:(0,v.jsx)("input",{type:"search",name:"q",className:I.searchQueryInput,"aria-label":"Search",onChange:F,value:x,autoComplete:"off",autoFocus:!0})}),Array.isArray(j.Kc)?(0,v.jsx)("div",{className:(0,h.Z)("col","col--3","padding-left--none",I.searchContextColumn),children:(0,v.jsxs)("select",{name:"search-context",className:I.searchContextInput,id:"context-selector",value:n,onChange:e=>m(e.target.value),children:[(0,v.jsx)("option",{value:"",children:j.pQ?(0,o.I)({id:"theme.SearchPage.searchContext.everywhere",message:"everywhere"}):""}),j.Kc.map((e=>(0,v.jsx)("option",{value:e,children:e},e)))]})}):null]}),!y&&x&&(0,v.jsx)("div",{children:(0,v.jsx)(S.Z,{})}),w&&(w.length>0?(0,v.jsx)("p",{children:t(w.length,(0,o.I)({id:"theme.SearchPage.documentsFound.plurals",message:"1 document found|{count} documents found",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)'},{count:w.length}))}):(0,v.jsx)("p",{children:(0,o.I)({id:"theme.SearchPage.noResultsText",message:"No documents were found",description:"The paragraph for empty search result"})})),(0,v.jsx)("section",{children:w&&w.map((e=>(0,v.jsx)(R,{searchResult:e},e.document.i)))})]})]})}function R(e){let{searchResult:{document:t,type:r,page:s,tokens:a,metadata:n}}=e;const c=0===r,o=2===r,u=(c?t.b:s.b).slice(),h=o?t.s:t.t;c||u.push(s.t);let i="";if(j.vc&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append("_highlight",t);i=`?${e.toString()}`}return(0,v.jsxs)("article",{className:I.searchResultItem,children:[(0,v.jsx)("h2",{children:(0,v.jsx)(l.Z,{to:t.u+i+(t.h||""),dangerouslySetInnerHTML:{__html:o?(0,x.C)(h,a):(0,f.o)(h,(0,y.m)(n,"t"),a,100)}})}),u.length>0&&(0,v.jsx)("p",{className:I.searchResultItemPath,children:(0,C.e)(u)}),o&&(0,v.jsx)("p",{className:I.searchResultItemSummary,dangerouslySetInnerHTML:{__html:(0,f.o)(t.t,(0,y.m)(n,"t"),a,100)}})]})}const P=function(){return(0,v.jsx)(n.Z,{children:(0,v.jsx)(w,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1b4147b1.3760f7ac.js b/assets/js/1b4147b1.3760f7ac.js deleted file mode 100644 index ad5dfc52c..000000000 --- a/assets/js/1b4147b1.3760f7ac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5715],{3905:(e,t,i)=>{i.d(t,{Zo:()=>p,kt:()=>m});var a=i(7294);function o(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function r(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function n(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?r(Object(i),!0).forEach((function(t){o(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function s(e,t){if(null==e)return{};var i,a,o=function(e,t){if(null==e)return{};var i,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)i=r[a],t.indexOf(i)>=0||(o[i]=e[i]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)i=r[a],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(o[i]=e[i])}return o}var l=a.createContext({}),u=function(e){var t=a.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):n(n({},t),e)),i},p=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var i=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=u(i),h=o,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||r;return i?a.createElement(m,n(n({ref:t},p),{},{components:i})):a.createElement(m,n({ref:t},p))}));function m(e,t){var i=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=i.length,n=new Array(r);n[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,n[1]=s;for(var u=2;u<r;u++)n[u]=i[u];return a.createElement.apply(null,n)}return a.createElement.apply(null,i)}h.displayName="MDXCreateElement"},6506:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>n,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>u});var a=i(7462),o=(i(7294),i(3905));const r={label:"Aviator",sidebar_position:1},n="Aviator",s={unversionedId:"utilities/Aviator",id:"utilities/Aviator",title:"Aviator",description:"Aviator is a GUI application designed for encoding AV1 video & Opus audio with SVT-AV1, libopus, & ffmpeg on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through smart defaults implemented via its SVT-AV1 encoder.",source:"@site/docs/utilities/Aviator.md",sourceDirName:"utilities",slug:"/utilities/Aviator",permalink:"/docs/utilities/Aviator",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Aviator.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"Aviator",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Dehalo",permalink:"/docs/filtering/dehalo"},next:{title:"Av1an",permalink:"/docs/utilities/av1an"}},l={},u=[{value:"Installation",id:"installation",level:2},{value:"Aviator's Defaults",id:"aviators-defaults",level:2},{value:"Perceptual Optimization",id:"perceptual-optimization",level:3},{value:"Video",id:"video",level:3},{value:"Audio",id:"audio",level:3},{value:"Output",id:"output",level:3},{value:"Credits",id:"credits",level:2}],p={toc:u},c="wrapper";function d(e){let{components:t,...i}=e;return(0,o.kt)(c,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"aviator"},"Aviator"),(0,o.kt)("p",null,"Aviator is a GUI application designed for encoding ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"AV1")," video & Opus audio with ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/SVT-AV1"},"SVT-AV1"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/Opus"},"libopus"),", & ",(0,o.kt)("a",{parentName:"p",href:"/docs/utilities/ffmpeg"},"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."),(0,o.kt)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_splash2.avif",alt:"Aviator Splash"}),(0,o.kt)("h2",{id:"installation"},"Installation"),(0,o.kt)("p",null,"Aviator is available on Flathub as a Flatpak. You can learn how to set up Flatpak on your distro of choice ",(0,o.kt)("a",{parentName:"p",href:"https://flatpak.org/setup/"},"here"),"."),(0,o.kt)("a",{href:"https://flathub.org/apps/details/net.natesales.Aviator"},(0,o.kt)("img",{width:"200",alt:"Download on Flathub",src:"https://flathub.org/assets/badges/flathub-badge-en.png"})),(0,o.kt)("p",null,"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."),(0,o.kt)("h2",{id:"aviators-defaults"},"Aviator's Defaults"),(0,o.kt)("p",null,"Hovering over most user configurable options in Aviator will produce a helpful tooltip that you can look at to make things more clear."),(0,o.kt)("h3",{id:"perceptual-optimization"},"Perceptual Optimization"),(0,o.kt)("p",null,"Aviator doesn't use mainline SVT-AV1, but rather uses ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/BlueSwordM/SVT-AV1"},"a fork")," maintained for perceptual quality. It includes several unique changes, including a custom ",(0,o.kt)("a",{parentName:"p",href:"/docs/metrics/SSIM"},"SSIM")," ",(0,o.kt)("a",{parentName:"p",href:"/docs/introduction/psychovisual"},"RDO")," tune that isn't included in mainline SVT-AV1."),(0,o.kt)("p",null,"Aviator's default FFmpeg command uses the following SVT-AV1 parameters:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"-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\n")),(0,o.kt)("h3",{id:"video"},"Video"),(0,o.kt)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_video.webp",alt:"Aviator Video Settings",loading:"lazy"}),(0,o.kt)("p",null,"By default, output resolution will match your source's resolution. Manually changing one resolution value will automatically calculate the other based on the video's aspect ratio. Aviator's SVT-AV1 speed preset is set to 6 by default, with a CRF (Constant Rate Factor) level of 32. You can set CRF from 0 to 63 using the slider, with larger numerical values indicating smaller filesize at the expense of visual quality. You can look at the detailed specifications behind each speed preset ",(0,o.kt)("a",{parentName:"p",href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.md#what-presets-do"},"here"),". Speed 6 offers a good balance between speed & compression efficiency at any CRF level."),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"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."),(0,o.kt)("h3",{id:"audio"},"Audio"),(0,o.kt)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_audio.webp",alt:"Aviator Audio Settings",loading:"lazy"}),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,'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.'),(0,o.kt)("p",null,"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."),(0,o.kt)("h3",{id:"output"},"Output"),(0,o.kt)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_output.webp",alt:"Aviator Output UI",loading:"lazy"}),(0,o.kt)("p",null,"The container your video is stored in is associated with the file extension. Aviator offers two options for video output: the ",(0,o.kt)("a",{parentName:"p",href:"/docs/introduction/terminology#mkv--mka--mks--mk3d"},"Matroska")," video container & the ",(0,o.kt)("a",{parentName:"p",href:"/docs/introduction/terminology#webm"},"WebM")," container. The open-source Matroska container (.MKV) is used by default in Aviator & is a universal multimedia container with broad video & audio support. WebM is designed for web compatibility. Aviator won't copy subtitles to WebM outputs because WebM is only officially compatible with ",(0,o.kt)("a",{parentName:"p",href:"/docs/subtitles/webvtt"},"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."),(0,o.kt)("h2",{id:"credits"},"Credits"),(0,o.kt)("p",null,"Actively developed by ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/gianni-rosato/"},"Gianni Rosato"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1b67d0f3.48e647c7.js b/assets/js/1b67d0f3.48e647c7.js new file mode 100644 index 000000000..fbfabe5ff --- /dev/null +++ b/assets/js/1b67d0f3.48e647c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9625],{3385:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=s(5893),n=s(1151);const o={label:"gzip",sidebar_position:2},r="gzip",a={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.mdx",sourceDirName:"data",slug:"/data/gzip",permalink:"/docs/data/gzip",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/gzip.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"gzip",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"ZIP",permalink:"/docs/data/zip"},next:{title:"bzip2",permalink:"/docs/data/bzip2"}},c={},d=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"History",id:"history",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Linux & macOS",id:"linux--macos",level:3},{value:"Windows",id:"windows",level:3}];function l(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"gzip",children:"gzip"}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,t.jsxs)(i.p,{children:["Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with ",(0,t.jsx)(i.code,{children:"tar"})," to create ",(0,t.jsx)(i.code,{children:".tar.gz"})," archives. Formats like ",(0,t.jsx)(i.a,{href:"/docs/data/zip",children:"ZIP"})," & ",(0,t.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"})," also use Deflate to different effects."]}),"\n",(0,t.jsx)(i.p,{children:"While ZIP is a multi-file format that can compress multiple files into a single compressed file, Gzip is a single-file format that compresses a single file into a single compressed file. Both use DEFLATE for compression. ZIP supports encryption, while Gzip does not. ZIP also stores more extensive header information."}),"\n",(0,t.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,t.jsx)(i.p,{children:"In order to properly understand the gzip format, we must first talk about ZIP. A lot of similar or identical information is covered in our ZIP entry."}),"\n",(0,t.jsx)(i.p,{children:"The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation PKZIP was shareware."}),"\n",(0,t.jsxs)(i.p,{children:["A ",(0,t.jsx)(i.a,{href:"http://www.digitalpreservation.gov/formats/fdd/fdd000361.shtml",children:"restricted ZIP format"})," exists and is used in other filetypes such as Java .jar archives, a slew of Microsoft Office file formats, Office Document Format files (.odt, .ods, .odp), and EPUB files for e-readers."]}),"\n",(0,t.jsxs)(i.p,{children:['In around 1990, Info-ZIP came onto the scene. "Info-ZIP\'s purpose is to provide free, portable, high-quality versions of the Zip and UnZip compressor-archiver utilities that are compatible with the DOS-based PKZIP by PKWARE, Inc." (',(0,t.jsx)(i.a,{href:"https://infozip.sourceforge.net/",children:"https://infozip.sourceforge.net/"}),"). They did this successfully, leading to increased adoption of the ZIP format."]}),"\n",(0,t.jsxs)(i.p,{children:["In the early 1990s the ",(0,t.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix ",(0,t.jsx)(i.code,{children:"compress"})," utility, which used the (at the time) patented LZW compression algorithm which threatened its free use. Though some specific implementations of Deflate were patented by Phil Katz, the format was not, so a Deflate implementation that did not infringe on any patents was written."]}),"\n",(0,t.jsxs)(i.p,{children:["As a ",(0,t.jsx)(i.code,{children:"compress"})," replacement, the Unix gzip utility can decompress data that was compressed using ",(0,t.jsx)(i.code,{children:"compress"}),". Gzip compresses quite a bit better than Unix compress due to its use of DEFLATE, and it has very fast decompression. It also adds a CRC-32 checksum as an integrity check for the archived data. The header format permits the storage of more information than the compress format allowed, such as the original file name & the file modification time."]}),"\n",(0,t.jsxs)(i.p,{children:["The popular ",(0,t.jsx)(i.code,{children:"tar"})," utility, which creates an archive of files, has an option to compress directly to the ",(0,t.jsx)(i.code,{children:".tar.gz"})," format and is a very popular use caze for gzip. Since the compression of a ",(0,t.jsx)(i.code,{children:".tar"})," can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. ",(0,t.jsx)(i.code,{children:".tar.gz"})," is the most common archive format in use on Unix due to its very high portability, but there are better compression methods available. Some of these include ",(0,t.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),", ",(0,t.jsx)(i.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,t.jsx)(i.a,{href:"/docs/data/brotli",children:"brotli"}),", ",(0,t.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"}),", & ",(0,t.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsx)(i.h3,{id:"linux--macos",children:"Linux & macOS"}),"\n",(0,t.jsxs)(i.p,{children:["Chances are, you have gzip already available on your system. You can encode gzip archives using the ",(0,t.jsx)(i.code,{children:"gzip"})," command."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:"Open a terminal window."}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:"Navigate to the directory where you want to create the gzip archive."}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsxs)(i.p,{children:["Use the ",(0,t.jsx)(i.code,{children:"gzip"})," command followed by the name of the file you want to compress. For example:"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gzip -7 myfile.txt\n"})}),"\n",(0,t.jsxs)(i.p,{children:["This will create a compressed file called ",(0,t.jsx)(i.code,{children:"myfile.txt.gz"})," in the current directory using compression level 7. Compression levels span from 1 through 9 (",(0,t.jsx)(i.code,{children:"-1 .. -9"}),"; shortcuts are ",(0,t.jsx)(i.code,{children:"--fast"})," for ",(0,t.jsx)(i.code,{children:"-1"}),", ",(0,t.jsx)(i.code,{children:"--best"})," for ",(0,t.jsx)(i.code,{children:"-9"}),")."]}),"\n",(0,t.jsxs)(i.ol,{start:"4",children:["\n",(0,t.jsxs)(i.li,{children:["If you want to compress multiple files at once, you can use the ",(0,t.jsx)(i.code,{children:"-a"})," option followed by the names of the files you want to compress. For example:"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gzip -a myfile1.txt myfile2.txt\n"})}),"\n",(0,t.jsxs)(i.p,{children:["This will create compressed files called ",(0,t.jsx)(i.code,{children:"myfile1.txt.gz"})," & ",(0,t.jsx)(i.code,{children:"myfile2.txt.gz"})," in the current directory."]}),"\n",(0,t.jsxs)(i.ol,{start:"5",children:["\n",(0,t.jsxs)(i.li,{children:["If you want to compress a directory and all its contents, you can use the ",(0,t.jsx)(i.code,{children:"-r"})," option followed by the name of the directory. For example:"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gzip -r mydirectory/\n"})}),"\n",(0,t.jsx)(i.p,{children:"This will create compressed versions of each file in the specified directory."}),"\n",(0,t.jsxs)(i.ol,{start:"6",children:["\n",(0,t.jsxs)(i.li,{children:["If you want to encode the gzip archive with a different extension, you can use the ",(0,t.jsx)(i.code,{children:"-S"})," option followed by the suffix ",(0,t.jsx)(i.code,{children:".suf"}),". For example:"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gzip -S .suf myfile.txt\n"})}),"\n",(0,t.jsxs)(i.p,{children:["This will create a gzip-compressed file called ",(0,t.jsx)(i.code,{children:"myfile.txt.suf"})," in the current directory."]}),"\n",(0,t.jsxs)(i.p,{children:["Also, you can use other options like ",(0,t.jsx)(i.code,{children:"-v"})," for verbose mode, ",(0,t.jsx)(i.code,{children:"-f"})," to force overwriting & compress links, ",(0,t.jsx)(i.code,{children:"-l"})," for listing the files and ",(0,t.jsx)(i.code,{children:"-d"})," for decompressing the files."]}),"\n",(0,t.jsxs)(i.p,{children:["You can find more information about the ",(0,t.jsx)(i.code,{children:"gzip"})," command & its options by running ",(0,t.jsx)(i.code,{children:"man gzip"})," in a terminal."]}),"\n",(0,t.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,t.jsx)(i.p,{children:"To be filled."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsxs)(i.em,{children:["References: Mark Adler is an American software engineer best known for his work in the field of data compression as the author of the Adler-32 checksum function, and a co-author of the zlib compression library and gzip. He has contributed to Info-ZIP, and has participated in developing the Portable Network Graphics (PNG) image format. Much of this post is based on his writing in ",(0,t.jsx)(i.a,{href:"https://stackoverflow.com/questions/20762094/how-are-zlib-gzip-and-zip-related-what-do-they-have-in-common-and-how-are-they",children:"this StackOverflow answer"})]})})]})}function h(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},1151:(e,i,s)=>{s.d(i,{Z:()=>a,a:()=>r});var t=s(7294);const n={},o=t.createContext(n);function r(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1be78505.2f986172.js b/assets/js/1be78505.2f986172.js deleted file mode 100644 index 1a6268e13..000000000 --- a/assets/js/1be78505.2f986172.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9514,4972],{9963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ge});var a=n(7294),o=n(6010),l=n(1944),r=n(5281),c=n(3320),i=n(3438),s=n(4477),d=n(1116),m=n(7961),u=n(5999),b=n(2466),p=n(5936);const h={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};function E(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),l=(0,a.useRef)(!1),{startScroll:r,cancelScroll:c}=(0,b.Ct)();return(0,b.RF)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(l.current?l.current=!1:a>=r?(c(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,p.S)((e=>{e.location.hash&&(l.current=!0,o(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var f=n(1442),g=n(6550),v=n(7524),k=n(6668),_=n(1327),C=n(7462);function S(e){return a.createElement("svg",(0,C.Z)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),a.createElement("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})))}const I={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function N(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.Z)("button button--secondary button--outline",I.collapseSidebarButton),onClick:t},a.createElement(S,{className:I.collapseSidebarButtonIcon}))}var T=n(9689),x=n(902);const Z=Symbol("EmptyContext"),B=a.createContext(Z);function w(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),l=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return a.createElement(B.Provider,{value:l},t)}var y=n(6043),L=n(8596),A=n(9960),M=n(2389);function F(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function H(e){let{item:t,onItemClick:n,activePath:l,level:c,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,k.L)(),f=function(e){const t=(0,M.Z)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,i.Wl)(e):void 0),[e,t])}(t),g=(0,i._F)(t,l),v=(0,L.Mg)(h,l),{collapsed:_,setCollapsed:S}=(0,y.u)({initialState:()=>!!b&&(!g&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===Z)throw new x.i6("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!_),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const l=(0,x.D9)(t);(0,a.useEffect)((()=>{t&&!l&&n&&o(!1)}),[t,l,n,o])}({isActive:g,collapsed:_,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,o.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":_},p)},a.createElement("div",{className:(0,o.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v})},a.createElement(A.Z,(0,C.Z)({className:(0,o.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":g}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":v?"page":void 0,"aria-expanded":b?!_:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(F,{categoryLabel:u,onClick:e=>{e.preventDefault(),T()}})),a.createElement(y.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:_},a.createElement(j,{items:m,tabIndex:_?-1:0,onItemClick:n,activePath:l,level:c+1})))}var P=n(3919),W=n(9471);const D={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:l,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,l),E=(0,P.Z)(m);return a.createElement("li",{className:(0,o.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(c),"menu__list-item",b),key:u},a.createElement(A.Z,(0,C.Z)({className:(0,o.Z)("menu__link",!E&&D.menuExternalLink,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(W.Z,null)))}const V={menuHtmlItem:"menuHtmlItem_M9Kj"};function U(e){let{item:t,level:n,index:l}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,o.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[V.menuHtmlItem,"menu__list-item"],s),key:l,dangerouslySetInnerHTML:{__html:c}})}function z(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(H,(0,C.Z)({item:t},n));case"html":return a.createElement(U,(0,C.Z)({item:t},n));default:return a.createElement(R,(0,C.Z)({item:t},n))}}function K(e){let{items:t,...n}=e;return a.createElement(w,null,t.map(((e,t)=>a.createElement(z,(0,C.Z)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(K),q={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function G(e){let{path:t,sidebar:n,className:l}=e;const c=function(){const{isActive:e}=(0,T.nT)(),[t,n]=(0,a.useState)(e);return(0,b.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{"aria-label":(0,u.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.Z)("menu thin-scrollbar",q.menu,c&&q.menuWithAnnouncementBar,l)},a.createElement("ul",{className:(0,o.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const Y="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",J="sidebarLogo_isFc";function Q(e){let{path:t,sidebar:n,onCollapse:l,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,k.L)();return a.createElement("div",{className:(0,o.Z)(Y,c&&O,r&&X)},c&&a.createElement(_.Z,{tabIndex:-1,className:J}),a.createElement(G,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:l}))}const $=a.memo(Q);var ee=n(3102),te=n(3163);const ne=e=>{let{sidebar:t,path:n}=e;const l=(0,te.e)();return a.createElement("ul",{className:(0,o.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&l.toggle(),"link"===e.type&&l.toggle()},level:1}))};function ae(e){return a.createElement(ee.Zo,{component:ne,props:e})}const oe=a.memo(ae);function le(e){const t=(0,v.i)(),n="desktop"===t||"ssr"===t,o="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement($,e),o&&a.createElement(oe,e))}const re={expandButton:"expandButton_m80_",expandButtonIcon:"expandButtonIcon_BlDH"};function ce(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:re.expandButton,title:(0,u.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t},a.createElement(S,{className:re.expandButtonIcon}))}const ie={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry",sidebarViewport:"sidebarViewport_Xe31"};function se(e){let{children:t}=e;const n=(0,d.V)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function de(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:l}=e;const{pathname:c}=(0,g.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,f.n)()&&s(!0),l((e=>!e))}),[l,i]);return a.createElement("aside",{className:(0,o.Z)(r.k.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&s(!0)}},a.createElement(se,null,a.createElement("div",{className:(0,o.Z)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(le,{sidebar:t,path:c,onCollapse:d,isHidden:i}),i&&a.createElement(ce,{toggleSidebar:d}))))}const me={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const l=(0,d.V)();return a.createElement("main",{className:(0,o.Z)(me.docMainContainer,(t||!l)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,o.Z)("container padding-top--md padding-bottom--lg",me.docItemWrapper,t&&me.docItemWrapperEnhanced)},n))}const be={docPage:"docPage__5DB",docsWrapper:"docsWrapper_BCFX","themedComponent--light":"themedComponent--light_NU7w"};function pe(e){let{children:t}=e;const n=(0,d.V)(),[o,l]=(0,a.useState)(!1);return a.createElement(m.Z,{wrapperClassName:be.docsWrapper},a.createElement(E,null),a.createElement("div",{className:be.docPage},n&&a.createElement(de,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:l}),a.createElement(ue,{hiddenSidebarContainer:o},t)))}var he=n(4972),Ee=n(197);function fe(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(Ee.Z,{version:t.version,tag:(0,c.os)(t.pluginId,t.version)}),a.createElement(l.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function ge(e){const{versionMetadata:t}=e,n=(0,i.hI)(e);if(!n)return a.createElement(he.default,null);const{docElement:c,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(fe,e),a.createElement(l.FG,{className:(0,o.Z)(r.k.wrapper.docsPages,r.k.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.q,{version:t},a.createElement(d.b,{name:m,items:u},a.createElement(pe,null,c)))))}},4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(7294),o=n(5999),l=n(1944),r=n(7961);function c(){return a.createElement(a.Fragment,null,a.createElement(l.d,{title:(0,o.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}},4477:(e,t,n)=>{n.d(t,{E:()=>c,q:()=>r});var a=n(7294),o=n(902);const l=a.createContext(null);function r(e){let{children:t,version:n}=e;return a.createElement(l.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(l);if(null===e)throw new o.i6("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/1cb05ddd.faa467e9.js b/assets/js/1cb05ddd.faa467e9.js deleted file mode 100644 index 3bc05e7f2..000000000 --- a/assets/js/1cb05ddd.faa467e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3899],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});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 l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=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):l(l({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},c="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,a=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(r),m=o,h=c["".concat(s,".").concat(m)]||c[m]||d[m]||a;return r?n.createElement(h,l(l({ref:t},u),{},{components:r})):n.createElement(h,l({ref:t},u))}));function h(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:o,l[1]=i;for(var p=2;p<a;p++)l[p]=r[p];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},7396:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const a={label:"hdr10plus_tool",sidebar_position:7},l="hdr10plus_tool",i={unversionedId:"utilities/hdr10plus_tool",id:"utilities/hdr10plus_tool",title:"hdr10plus_tool",description:"hdr10plus_tool is a command line tool written in Rust for working with HDR10+ in HEVC files. Previously named `hdr10plus_parser`, now it's more than just a parser.",source:"@site/docs/utilities/hdr10plus_tool.md",sourceDirName:"utilities",slug:"/utilities/hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/hdr10plus_tool.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"hdr10plus_tool",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"mp4box",permalink:"/docs/utilities/mp4box"},next:{title:"eac3to",permalink:"/docs/utilities/eac3to"}},s={},p=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Extracting",id:"extracting",level:3},{value:"Injecting",id:"injecting",level:3},{value:"Remove HDR10+ Metadata",id:"remove-hdr10-metadata",level:3}],u={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"hdr10plus_tool"},"hdr10plus_tool"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"hdr10plus_tool")," is a command line tool written in Rust for working with HDR10+ in HEVC files. Previously named ",(0,o.kt)("inlineCode",{parentName:"p"},"hdr10plus_parser"),", now it's more than just a parser."),(0,o.kt)("h2",{id:"installation"},"Installation"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Download pre-built binaries from ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/quietvoid/hdr10plus_tool/releases"},"here"))),(0,o.kt)("p",null,"or"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Compile yourself (Rust must be installed, minimum v1.57.0 at the time of writing)")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n')),(0,o.kt)("p",null,"on Windows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n")),(0,o.kt)("h2",{id:"usage"},"Usage"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"hdr10plus_tool [OPTIONS] <SUBCOMMAND>\n")),(0,o.kt)("p",null,"To get more detailed options for a subcommand"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"hdr10plus_tool <SUBCOMMAND> --help\n")),(0,o.kt)("h3",{id:"extracting"},"Extracting"),(0,o.kt)("p",null,"Extract from raw bitstream"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"hdr10plus_tool extract video.hevc -o metadata.json\n")),(0,o.kt)("p",null,"Extract using FFmpeg pipe (Recommended)"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool extract -o metadata.json -\n")),(0,o.kt)("h3",{id:"injecting"},"Injecting"),(0,o.kt)("p",null,"Inject to raw bitstream"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"hdr10plus_tool inject -i video.hevc -j metadata.json -o injected_output.hevc\n")),(0,o.kt)("h3",{id:"remove-hdr10-metadata"},"Remove HDR10+ Metadata"),(0,o.kt)("p",null,"Remove from raw bitstream"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"hdr10plus_tool remove video.hevc -o hdr10plus_removed_output.hevc\n")),(0,o.kt)("p",null,"Remove using FFmpeg pipe (Recommended)"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool remove -\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1cb64385.504ae67a.js b/assets/js/1cb64385.504ae67a.js deleted file mode 100644 index 7ace1b2f2..000000000 --- a/assets/js/1cb64385.504ae67a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[774],{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 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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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,m=p["".concat(l,".").concat(b)]||p[b]||d[b]||i;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));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]=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<i;s++)a[s]=r[s];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}b.displayName="MDXCreateElement"},1651:(e,t,r)=>{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:"mp4box",sidebar_position:6},a=void 0,c={unversionedId:"utilities/mp4box",id:"utilities/mp4box",title:"mp4box",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/utilities/mp4box.md",sourceDirName:"utilities",slug:"/utilities/mp4box",permalink:"/docs/utilities/mp4box",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/mp4box.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"mp4box",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"dovi_tool",permalink:"/docs/utilities/dovi_tool"},next:{title:"hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool"}},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)("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/1d129381.8c43c86b.js b/assets/js/1d129381.8c43c86b.js deleted file mode 100644 index b3ad5f432..000000000 --- a/assets/js/1d129381.8c43c86b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5302],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var i=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 i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},o=Object.keys(e);for(i=0;i<o.length;i++)r=o[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i<o.length;i++)r=o[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),l=function(e){var t=i.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 i.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},f=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(r),f=n,m=p["".concat(s,".").concat(f)]||p[f]||d[f]||o;return r?i.createElement(m,a(a({ref:t},u),{},{components:r})):i.createElement(m,a({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,a=new Array(o);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:n,a[1]=c;for(var l=2;l<o;l++)a[l]=r[l];return i.createElement.apply(null,a)}return i.createElement.apply(null,r)}f.displayName="MDXCreateElement"},8140:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var i=r(7462),n=(r(7294),r(3905));const o={label:"FFMetrics",sidebar_position:3},a="FFMetrics",c={unversionedId:"utilities/FFMetrics",id:"utilities/FFMetrics",title:"FFMetrics",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/FFMetrics.md",sourceDirName:"utilities",slug:"/utilities/FFMetrics",permalink:"/docs/utilities/FFMetrics",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/FFMetrics.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"FFMetrics",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"rAV1ator",permalink:"/docs/utilities/rAV1ator"},next:{title:"YUView",permalink:"/docs/utilities/YUView"}},s={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"ffmetrics"},"FFMetrics"),(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,"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."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1ec3ce74.b98a5ac0.js b/assets/js/1ec3ce74.b98a5ac0.js new file mode 100644 index 000000000..dcea84217 --- /dev/null +++ b/assets/js/1ec3ce74.b98a5ac0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2523],{224:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>l});var r=i(5893),t=i(1151);const a={label:"rav1e",sidebar_position:5,date:new Date("2023-05-09T00:00:00.000Z")},s="rav1e",o={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.",source:"@site/docs/encoders/rav1e.mdx",sourceDirName:"encoders",slug:"/encoders/rav1e",permalink:"/docs/encoders/rav1e",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/rav1e.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"rav1e",sidebar_position:5,date:"2023-05-09T00:00:00.000Z"},sidebar:"tutorialSidebar",previous:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"},next:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"}},c={},l=[{value:"Building",id:"building",level:2},{value:"Linux/macOS",id:"linuxmacos",level:3},{value:"Windows",id:"windows",level:3},{value:"AV1",id:"av1",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"rav1e",children:"rav1e"}),"\n",(0,r.jsx)(n.p,{children:"rav1e is a command line application for encoding AV1 written in Rust & Assembly co-developed by Xiph.org and Mozilla."}),"\n",(0,r.jsxs)(n.p,{children:["rav1e is available in FFmpeg via ",(0,r.jsx)(n.code,{children:"librav1e"}),". You can check if you have it by running ",(0,r.jsx)(n.code,{children:"ffmpeg -h encoder=librav1e"}),". You can input non-FFmpeg standard rav1e parameters via ",(0,r.jsx)(n.code,{children:"-rav1e-params"}),". Please keep in mind that unless you build FFmpeg yourself, you are using the most vanilla version of rav1e."]}),"\n",(0,r.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,r.jsx)(n.h2,{id:"building",children:"Building"}),"\n",(0,r.jsx)(n.h3,{id:"linuxmacos",children:"Linux/macOS"}),"\n",(0,r.jsxs)(n.p,{children:["Pre-built binaries can be found in the ",(0,r.jsx)(n.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," on Github. rav1e can also be installed with Cargo by running ",(0,r.jsx)(n.code,{children:"cargo install rav1e"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsxs)(n.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,r.jsx)(n.code,{children:"git reset --hard [commit hash]"})]})}),"\n",(0,r.jsxs)(n.p,{children:["Here are instructions for resetting to release 0.6.6. Omit the git reset command to use the latest git, if you have a ",(0,r.jsx)(n.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard 7c9db10494c2fffa98a572027d756e55bf754036\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["When done, the binary can be found in ",(0,r.jsx)(n.code,{children:"/target/release"}),". You can then ",(0,r.jsx)(n.code,{children:"cp /target/release/rav1e /usr/local/bin"})," or wherever you desire the binary to go."]}),"\n",(0,r.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard 7c9db10494c2fffa98a572027d756e55bf754036\nset RUSTFLAGS=-C target-cpu=native\ncargo build --release\n"})}),"\n",(0,r.jsxs)(n.p,{children:["When done, the binary can be found in ",(0,r.jsx)(n.code,{children:"target/release"})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Installation with HDR10+ support"})}),"\n",(0,r.jsxs)(n.p,{children:["rav1e currently has an ",(0,r.jsx)(n.a,{href:"https://github.com/xiph/rav1e/pull/3000",children:"unmerged pull request"})," by quietvoid, the person behind ",(0,r.jsx)(n.code,{children:"hdr10plus_tool"})," and ",(0,r.jsx)(n.code,{children:"dovi_tool"}),". The PR adds a new parameter called ",(0,r.jsx)(n.code,{children:"--hdr10plus-json"})," for HDR10+ JSON dynamic metadata input. To merge it locally, do the following:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard [release commit]\ngit fetch origin pull/3000/head:HDR10+\n"})}),"\n",(0,r.jsx)(n.p,{children:"now the patch should be applied, build as usual"}),"\n",(0,r.jsx)(n.h3,{id:"av1",children:"AV1"}),"\n",(0,r.jsx)(n.p,{children:"For AV1 encoding, rav1e has very sane defaults. It is very hard to go wrong with parameters if you modify as few as possible."}),"\n",(0,r.jsx)(n.p,{children:"Basic usage:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"rav1e -i input.y4m -o output.ivf --quantizer 60 --photon-noise 8\n"})}),"\n",(0,r.jsx)(n.p,{children:"Basic usage with FFmpeg piping, 10bit input:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 80 --photon-noise 8\n"})}),"\n",(0,r.jsx)(n.p,{children:"Basic usage with FFmpeg piping, 10bit input and assuming 4K:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 68 --tile-columns 2 --tile-rows 1 --photon-noise 8\n"})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Use 2x1 tiles or ",(0,r.jsx)(n.code,{children:"tile-columns 2"})," and ",(0,r.jsx)(n.code,{children:"tile-rows 1"})," for 4K (2160p) encoding, this will help with both encoding and decoding."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>o,a:()=>s});var r=i(7294);const t={},a=r.createContext(t);function s(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f227c78.33b936fe.js b/assets/js/1f227c78.33b936fe.js new file mode 100644 index 000000000..a630b79e9 --- /dev/null +++ b/assets/js/1f227c78.33b936fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[657],{4793:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var i=n(5893),o=n(1151);const r={title:"Detelecine / Inverse Telecine",sidebar_position:4},s="Detelecine / Inverse Telecine",c={id:"filtering/detelecine",title:"Detelecine / Inverse Telecine",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/detelecine.mdx",sourceDirName:"filtering",slug:"/filtering/detelecine",permalink:"/docs/filtering/detelecine",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/detelecine.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Detelecine / Inverse Telecine",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Denoise",permalink:"/docs/filtering/denoise"},next:{title:"Dehalo",permalink:"/docs/filtering/dehalo"}},l={},a=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"detelecine--inverse-telecine",children:"Detelecine / Inverse Telecine"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>s});var i=n(7294);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.c5a46bb2.js b/assets/js/1f391b9e.c5a46bb2.js deleted file mode 100644 index fd7e0a8e6..000000000 --- a/assets/js/1f391b9e.c5a46bb2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3085],{4247:(e,n,t)=>{t.r(n),t.d(n,{default:()=>d});var a=t(7294),l=t(6010),r=t(1944),c=t(5281),i=t(7961),o=t(1506),s=t(9407);const m={mdxPageWrapper:"mdxPageWrapper_j9I6"};function d(e){const{content:n}=e,{metadata:{title:t,description:d,frontMatter:u}}=n,{wrapperClassName:f,hide_table_of_contents:v}=u;return a.createElement(r.FG,{className:(0,l.Z)(f??c.k.wrapper.mdxPages,c.k.page.mdxPage)},a.createElement(r.d,{title:t,description:d}),a.createElement(i.Z,null,a.createElement("main",{className:"container container--fluid margin-vert--lg"},a.createElement("div",{className:(0,l.Z)("row",m.mdxPageWrapper)},a.createElement("div",{className:(0,l.Z)("col",!v&&"col--8")},a.createElement("article",null,a.createElement(o.Z,null,a.createElement(n,null)))),!v&&n.toc.length>0&&a.createElement("div",{className:"col col--2"},a.createElement(s.Z,{toc:n.toc,minHeadingLevel:u.toc_min_heading_level,maxHeadingLevel:u.toc_max_heading_level}))))))}},9407:(e,n,t)=>{t.d(n,{Z:()=>m});var a=t(7462),l=t(7294),r=t(6010),c=t(3743);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},o="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function m(e){let{className:n,...t}=e;return l.createElement("div",{className:(0,r.Z)(i.tableOfContents,"thin-scrollbar",n)},l.createElement(c.Z,(0,a.Z)({},t,{linkClassName:o,linkActiveClassName:s})))}},3743:(e,n,t)=>{t.d(n,{Z:()=>v});var a=t(7462),l=t(7294),r=t(6668);function c(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const a=t.slice(2,e.level);e.parentIndex=Math.max(...a),t[e.level]=n}));const a=[];return n.forEach((e=>{const{parentIndex:t,...l}=e;t>=0?n[t].children.push(l):a.push(l)})),a}function i(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return n.flatMap((e=>{const n=i({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function s(e,n){let{anchorTopOffset:t}=n;const a=e.find((e=>o(e).top>=t));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(o(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function m(){const e=(0,l.useRef)(0),{navbar:{hideOnScroll:n}}=(0,r.L)();return(0,l.useEffect)((()=>{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,l.useRef)(void 0),t=m();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:c}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const a=[];for(let l=n;l<=t;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:c}),o=s(i,{anchorTopOffset:t.current}),m=e.find((e=>o&&o.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(l),e.classList.add(l),n.current=e):e.classList.remove(l)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,t])}function u(e){let{toc:n,className:t,linkClassName:a,isChild:r}=e;return n.length?l.createElement("ul",{className:r?void 0:t},n.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:t,linkClassName:a}))))):null}const f=l.memo(u);function v(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:m,maxHeadingLevel:u,...v}=e;const g=(0,r.L)(),h=m??g.tableOfContents.minHeadingLevel,L=u??g.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>i({toc:c(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:h,maxHeadingLevel:L});return d((0,l.useMemo)((()=>{if(o&&s)return{linkClassName:o,linkActiveClassName:s,minHeadingLevel:h,maxHeadingLevel:L}}),[o,s,h,L])),l.createElement(f,(0,a.Z)({toc:p,className:t,linkClassName:o},v))}}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.f16d2034.js b/assets/js/1f391b9e.f16d2034.js new file mode 100644 index 000000000..18c5b9980 --- /dev/null +++ b/assets/js/1f391b9e.f16d2034.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3085],{4247:(e,n,t)=>{t.r(n),t.d(n,{default:()=>u});t(7294);var i=t(6010),a=t(1944),s=t(5281),l=t(179),r=t(2459),c=t(9407),o=t(2212);const d={mdxPageWrapper:"mdxPageWrapper_j9I6"};var m=t(5893);function u(e){const{content:n}=e,{metadata:{title:t,description:u,frontMatter:f,unlisted:v},assets:h}=n,{keywords:g,wrapperClassName:x,hide_table_of_contents:p}=f,L=h.image??f.image;return(0,m.jsx)(a.FG,{className:(0,i.Z)(x??s.k.wrapper.mdxPages,s.k.page.mdxPage),children:(0,m.jsxs)(l.Z,{children:[(0,m.jsx)(a.d,{title:t,description:u,keywords:g,image:L}),(0,m.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,m.jsxs)("div",{className:(0,i.Z)("row",d.mdxPageWrapper),children:[(0,m.jsxs)("div",{className:(0,i.Z)("col",!p&&"col--8"),children:[v&&(0,m.jsx)(o.Z,{}),(0,m.jsx)("article",{children:(0,m.jsx)(r.Z,{children:(0,m.jsx)(n,{})})})]}),!p&&n.toc.length>0&&(0,m.jsx)("div",{className:"col col--2",children:(0,m.jsx)(c.Z,{toc:n.toc,minHeadingLevel:f.toc_min_heading_level,maxHeadingLevel:f.toc_max_heading_level})})]})})]})})}},9407:(e,n,t)=>{t.d(n,{Z:()=>o});t(7294);var i=t(6010),a=t(3743);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(5893);const r="table-of-contents__link toc-highlight",c="table-of-contents__link--active";function o(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,i.Z)(s.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(a.Z,{...t,linkClassName:r,linkActiveClassName:c})})}},3743:(e,n,t)=>{t.d(n,{Z:()=>h});var i=t(7294),a=t(6668);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function r(e){const n=e.getBoundingClientRect();return n.top===n.bottom?r(e.parentNode):n}function c(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>r(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(r(i))?i:e[e.indexOf(i)-1]??null}return e[e.length-1]??null}function o(){const e=(0,i.useRef)(0),{navbar:{hideOnScroll:n}}=(0,a.L)();return(0,i.useEffect)((()=>{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=o();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:l}=e;function r(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),r=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:l}),o=c(r,{anchorTopOffset:t.current}),d=e.find((e=>o&&o.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",r),document.addEventListener("resize",r),r(),()=>{document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}),[e,t])}var m=t(9960),u=t(5893);function f(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,u.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.Z,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(f,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const v=i.memo(f);function h(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:o,maxHeadingLevel:m,...f}=e;const h=(0,a.L)(),g=o??h.tableOfContents.minHeadingLevel,x=m??h.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>l({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:g,maxHeadingLevel:x});return d((0,i.useMemo)((()=>{if(r&&c)return{linkClassName:r,linkActiveClassName:c,minHeadingLevel:g,maxHeadingLevel:x}}),[r,c,g,x])),(0,u.jsx)(v,{toc:p,className:t,linkClassName:r,...f})}},2212:(e,n,t)=>{t.d(n,{Z:()=>f});t(7294);var i=t(6010),a=t(5999),s=t(5742),l=t(5893);function r(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function c(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,l.jsx)(s.Z,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(5281),m=t(9047);function u(e){let{className:n}=e;return(0,l.jsx)(m.Z,{type:"caution",title:(0,l.jsx)(r,{}),className:(0,i.Z)(n,d.k.common.unlistedBanner),children:(0,l.jsx)(c,{})})}function f(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o,{}),(0,l.jsx)(u,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/202a438d.34ad5324.js b/assets/js/202a438d.34ad5324.js new file mode 100644 index 000000000..838c3e995 --- /dev/null +++ b/assets/js/202a438d.34ad5324.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7418],{2776:e=>{e.exports=JSON.parse('{"name":"@easyops-cn/docusaurus-search-local","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/22091897.3f1b2939.js b/assets/js/22091897.3f1b2939.js deleted file mode 100644 index e439b3358..000000000 --- a/assets/js/22091897.3f1b2939.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4828],{3905:(e,r,t)=>{t.d(r,{Zo:()=>l,kt:()=>b});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?a(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function c(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=n.createContext({}),u=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},l=function(e){var r=u(e.components);return n.createElement(s.Provider,{value:r},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),p=u(t),f=o,b=p["".concat(s,".").concat(f)]||p[f]||d[f]||a;return t?n.createElement(b,i(i({ref:r},l),{},{components:t})):n.createElement(b,i({ref:r},l))}));function b(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,i=new Array(a);i[0]=f;var c={};for(var s in r)hasOwnProperty.call(r,s)&&(c[s]=r[s]);c.originalType=e,c[p]="string"==typeof e?e:o,i[1]=c;for(var u=2;u<a;u++)i[u]=t[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,t)}f.displayName="MDXCreateElement"},482:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var n=t(7462),o=(t(7294),t(3905));const a={label:"Kvazaar",sidebar_position:6},i="Kvazaar",c={unversionedId:"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!",source:"@site/docs/encoders/Kvazaar.md",sourceDirName:"encoders",slug:"/encoders/Kvazaar",permalink:"/docs/encoders/Kvazaar",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/Kvazaar.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"Kvazaar",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"},next:{title:"SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC"}},s={},u=[],l={toc:u},p="wrapper";function d(e){let{components:r,...t}=e;return(0,o.kt)(p,(0,n.Z)({},l,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"kvazaar"},"Kvazaar"),(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,"Kvazaar is an open-source HEVC encoder licensed under 3-clause BSD developed by the Ultra Video Group (UVG). Written in C and Assembly."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/229f7513.b87e90f0.js b/assets/js/229f7513.b87e90f0.js new file mode 100644 index 000000000..b0f892bbb --- /dev/null +++ b/assets/js/229f7513.b87e90f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8168],{5235:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var i=n(5893),s=n(1151);const r={title:"WebVTT"},o="WebVTT",l={id:"subtitles/webvtt",title:"WebVTT",description:"WebVTT, or Web Video Text Tracks, is the format for subtitles on the web. It is used with the HTML \\ element, or embedded into a webm container.",source:"@site/docs/subtitles/webvtt.mdx",sourceDirName:"subtitles",slug:"/subtitles/webvtt",permalink:"/docs/subtitles/webvtt",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/webvtt.mdx",tags:[],version:"current",frontMatter:{title:"WebVTT"},sidebar:"tutorialSidebar",previous:{title:"SRT",permalink:"/docs/subtitles/SRT"},next:{title:"Intro",permalink:"/docs/filtering/intro"}},c={},a=[{value:"Structure",id:"structure",level:2},{value:"Cue",id:"cue",level:3},{value:"Example",id:"example",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"webvtt",children:"WebVTT"}),"\n",(0,i.jsxs)(t.p,{children:["WebVTT, or Web Video Text Tracks, is the format for subtitles on the web. It is used with the ",(0,i.jsx)(t.a,{href:"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track",children:"HTML <track> element"}),", or embedded into a webm container."]}),"\n",(0,i.jsx)(t.h2,{id:"structure",children:"Structure"}),"\n",(0,i.jsxs)(t.p,{children:["WebVTT is a simple, text-based format, based on SRT. All files start with the string\n",(0,i.jsx)(t.code,{children:"WEBVTT"}),", optionally, some text, then two new lines. That's where the\ndata we're interested in starts."]}),"\n",(0,i.jsx)(t.h3,{id:"cue",children:"Cue"}),"\n",(0,i.jsxs)(t.p,{children:["A WebVTT file is basically a bunch of cues. They can have a line with\nan ID, then they have to have a line specifying from where to where\nthe cue should be displayed like this: ",(0,i.jsx)(t.code,{children:"STARTTIME -> ENDTIME [optional settings go here]"}),", then all the text to be displayed goes after\nit. That text can have some HTML-like formatting in it. To learn about\nthem, see ",(0,i.jsx)(t.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebVTT_API#webvtt_cues",children:"the documentation"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(t.p,{children:"WEBVTT"}),"\n",(0,i.jsx)(t.p,{children:"00:01.000 --\x3e 00:04.000"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Never drink liquid nitrogen."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"00:05.000 --\x3e 00:09.000"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"It will perforate your stomach."}),"\n",(0,i.jsx)(t.li,{children:"You could die."}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>o});var i=n(7294);const s={},r=i.createContext(s);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/236b5e64.722f80d2.js b/assets/js/236b5e64.722f80d2.js deleted file mode 100644 index 677ef0f20..000000000 --- a/assets/js/236b5e64.722f80d2.js +++ /dev/null @@ -1 +0,0 @@ -"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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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<i;l++)a[l]=r[l];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},3075:(e,t,r)=>{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/695eb979.b9f6b8c1.js b/assets/js/239a6b34.0eb2ad08.js similarity index 65% rename from assets/js/695eb979.b9f6b8c1.js rename to assets/js/239a6b34.0eb2ad08.js index 2c2f0b123..8147854e0 100644 --- a/assets/js/695eb979.b9f6b8c1.js +++ b/assets/js/239a6b34.0eb2ad08.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1809],{3769:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6643],{3769:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/2459.73644e17.js b/assets/js/2459.73644e17.js new file mode 100644 index 000000000..ab9f9b837 --- /dev/null +++ b/assets/js/2459.73644e17.js @@ -0,0 +1 @@ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2459],{9047:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Z});var o=n(7294),s=n(5893);function c(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),c=t.filter((e=>e!==n)),a=n?.props.children;return{mdxAdmonitionTitle:a,rest:c.length>0?(0,s.jsx)(s.Fragment,{children:c}):null}}(e.children),c=e.title??t;return{...e,...c&&{title:c},children:n}}var a=n(6010),i=n(5999),r=n(5281);const l={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:t,className:n,children:o}=e;return(0,s.jsx)("div",{className:(0,a.Z)(r.k.common.admonition,r.k.common.admonitionType(t),l.admonition,n),children:o})}function u(e){let{icon:t,title:n}=e;return(0,s.jsxs)("div",{className:l.admonitionHeading,children:[(0,s.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,s.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:o,children:c,className:a}=e;return(0,s.jsxs)(d,{type:t,className:a,children:[(0,s.jsx)(u,{title:o,icon:n}),(0,s.jsx)(m,{children:c})]})}function p(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const f={icon:(0,s.jsx)(p,{}),title:(0,s.jsx)(i.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function x(e){return(0,s.jsx)(h,{...f,...e,className:(0,a.Z)("alert alert--secondary",e.className),children:e.children})}function g(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const j={icon:(0,s.jsx)(g,{}),title:(0,s.jsx)(i.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function b(e){return(0,s.jsx)(h,{...j,...e,className:(0,a.Z)("alert alert--success",e.className),children:e.children})}function v(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const k={icon:(0,s.jsx)(v,{}),title:(0,s.jsx)(i.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function y(e){return(0,s.jsx)(h,{...k,...e,className:(0,a.Z)("alert alert--info",e.className),children:e.children})}function N(e){return(0,s.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const B={icon:(0,s.jsx)(N,{}),title:(0,s.jsx)(i.Z,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const w={icon:(0,s.jsx)(C,{}),title:(0,s.jsx)(i.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const L={icon:(0,s.jsx)(N,{}),title:(0,s.jsx)(i.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:x,tip:b,info:y,warning:function(e){return(0,s.jsx)(h,{...B,...e,className:(0,a.Z)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,s.jsx)(h,{...w,...e,className:(0,a.Z)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,s.jsx)(x,{title:"secondary",...e}),important:e=>(0,s.jsx)(y,{title:"important",...e}),success:e=>(0,s.jsx)(b,{title:"success",...e}),caution:function(e){return(0,s.jsx)(h,{...L,...e,className:(0,a.Z)("alert alert--warning",e.className),children:e.children})}}};function Z(e){const t=c(e),n=(o=t.type,E[o]||(console.warn(`No admonition component found for admonition type "${o}". Using Info as fallback.`),E.info));var o;return(0,s.jsx)(n,{...t})}},2459:(e,t,n)=>{"use strict";n.d(t,{Z:()=>oe});var o=n(7294),s=n(1151),c=n(5742),a=n(2389),i=n(6010),r=n(2949),l=n(6668);function d(){const{prism:e}=(0,l.L)(),{colorMode:t}=(0,r.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var u=n(5281),m=n(7594),h=n.n(m);const p=/title=(?<quote>["'])(?<title>.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,x={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"},lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""}};function g(e,t){const n=e.map((e=>{const{start:n,end:o}=x[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function j(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:s,metastring:c}=t;if(c&&f.test(c)){const e=c.match(f).groups.range;if(0===s.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${c}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=s[0].className,o=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const a=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":case"sql":return g(["lua"],t);case"wasm":return g(["wasm"],t);default:return g(Object.keys(x).filter((e=>!["lua","wasm","tex","latex","matlab"].includes(e))),t)}}(o,s),i=n.split("\n"),r=Object.fromEntries(s.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(s.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<i.length;){const e=i[h].match(a);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));l[t]?r[l[t]].range+=`${h},`:d[t]?r[d[t]].start=h:u[t]&&(r[u[t]].range+=`${r[u[t]].start}-${h-1},`),i.splice(h,1)}n=i.join("\n");const m={};return Object.entries(r).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const b={codeBlockContainer:"codeBlockContainer_Ckt0"};var v=n(5893);function k(e){let{as:t,...n}=e;const o=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,s]=e;const c=t[o];c&&"string"==typeof s&&(n[c]=s)})),n}(d());return(0,v.jsx)(t,{...n,style:o,className:(0,i.Z)(n.className,b.codeBlockContainer,u.k.common.codeBlock)})}const y={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function N(e){let{children:t,className:n}=e;return(0,v.jsx)(k,{as:"pre",tabIndex:0,className:(0,i.Z)(y.codeBlockStandalone,"thin-scrollbar",n),children:(0,v.jsx)("code",{className:y.codeBlockLines,children:t})})}var B=n(902);const C={attributes:!0,characterData:!0,childList:!0,subtree:!0};function w(e,t){const[n,s]=(0,o.useState)(),c=(0,o.useCallback)((()=>{s(e.current?.closest("[role=tabpanel][hidden]"))}),[e,s]);(0,o.useEffect)((()=>{c()}),[c]),function(e,t,n){void 0===n&&(n=C);const s=(0,B.zX)(t),c=(0,B.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(s);return e&&t.observe(e,c),()=>t.disconnect()}),[e,s,c])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),c())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(4965);const E={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function Z(e){let{line:t,classNames:n,showLineNumbers:o,getLineProps:s,getTokenProps:c}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const a=s({line:t,className:(0,i.Z)(n,o&&E.codeLine)}),r=t.map(((e,t)=>(0,v.jsx)("span",{...c({token:e,key:t})},t)));return(0,v.jsxs)("span",{...a,children:[o?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)("span",{className:E.codeLineNumber}),(0,v.jsx)("span",{className:E.codeLineContent,children:r})]}):r,(0,v.jsx)("br",{})]})}var T=n(5999);function _(e){return(0,v.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,v.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function S(e){return(0,v.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,v.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const I={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function A(e){let{code:t,className:n}=e;const[s,c]=(0,o.useState)(!1),a=(0,o.useRef)(void 0),r=(0,o.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const o=document.createElement("textarea"),s=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const c=document.getSelection(),a=c.rangeCount>0&&c.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let i=!1;try{i=document.execCommand("copy")}catch{}o.remove(),a&&(c.removeAllRanges(),c.addRange(a)),s&&s.focus()}(t),c(!0),a.current=window.setTimeout((()=>{c(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(a.current)),[]),(0,v.jsx)("button",{type:"button","aria-label":s?(0,T.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,T.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,T.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.Z)("clean-btn",n,I.copyButton,s&&I.copyButtonCopied),onClick:r,children:(0,v.jsxs)("span",{className:I.copyButtonIcons,"aria-hidden":"true",children:[(0,v.jsx)(_,{className:I.copyButtonIcon}),(0,v.jsx)(S,{className:I.copyButtonSuccessIcon})]})})}function z(e){return(0,v.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,v.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const M={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function H(e){let{className:t,onClick:n,isEnabled:o}=e;const s=(0,T.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,v.jsx)("button",{type:"button",onClick:n,className:(0,i.Z)("clean-btn",t,o&&M.wordWrapButtonEnabled),"aria-label":s,title:s,children:(0,v.jsx)(z,{className:M.wordWrapButtonIcon,"aria-hidden":"true"})})}function R(e){let{children:t,className:n="",metastring:s,title:c,showLineNumbers:a,language:r}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.L)(),h=function(e){return e?.toLowerCase()}(r??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),x=function(){const[e,t]=(0,o.useState)(!1),[n,s]=(0,o.useState)(!1),c=(0,o.useRef)(null),a=(0,o.useCallback)((()=>{const n=c.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[c,e]),i=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=c.current,n=e>t||c.current.querySelector("code").hasAttribute("style");s(n)}),[c]);return w(c,i),(0,o.useEffect)((()=>{i()}),[e,i]),(0,o.useEffect)((()=>(window.addEventListener("resize",i,{passive:!0}),()=>{window.removeEventListener("resize",i)})),[i]),{codeBlockRef:c,isEnabled:e,isCodeScrollable:n,toggle:a}}(),g=function(e){return e?.match(p)?.groups.title??""}(s)||c,{lineClassNames:b,code:N}=j(t,{metastring:s,language:h,magicComments:m}),B=a??function(e){return Boolean(e?.includes("showLineNumbers"))}(s);return(0,v.jsxs)(k,{as:"div",className:(0,i.Z)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[g&&(0,v.jsx)("div",{className:y.codeBlockTitle,children:g}),(0,v.jsxs)("div",{className:y.codeBlockContent,children:[(0,v.jsx)(L.y$,{theme:f,code:N,language:h??"text",children:e=>{let{className:t,style:n,tokens:o,getLineProps:s,getTokenProps:c}=e;return(0,v.jsx)("pre",{tabIndex:0,ref:x.codeBlockRef,className:(0,i.Z)(t,y.codeBlock,"thin-scrollbar"),style:n,children:(0,v.jsx)("code",{className:(0,i.Z)(y.codeBlockLines,B&&y.codeBlockLinesWithNumbering),children:o.map(((e,t)=>(0,v.jsx)(Z,{line:e,getLineProps:s,getTokenProps:c,classNames:b[t],showLineNumbers:B},t)))})})}}),(0,v.jsxs)("div",{className:y.buttonGroup,children:[(x.isEnabled||x.isCodeScrollable)&&(0,v.jsx)(H,{className:y.codeButton,onClick:()=>x.toggle(),isEnabled:x.isEnabled}),(0,v.jsx)(A,{className:y.codeButton,code:N})]})]})]})}function V(e){let{children:t,...n}=e;const s=(0,a.Z)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof c?R:N;return(0,v.jsx)(i,{...n,children:c},String(s))}var $=n(9960);var W=n(6043);const P={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function D(e){return!!e&&("SUMMARY"===e.tagName||D(e.parentElement))}function O(e,t){return!!e&&(e===t||O(e.parentElement,t))}function q(e){let{summary:t,children:n,...s}=e;const c=(0,a.Z)(),r=(0,o.useRef)(null),{collapsed:l,setCollapsed:d}=(0,W.u)({initialState:!s.open}),[u,m]=(0,o.useState)(s.open),h=o.isValidElement(t)?t:(0,v.jsx)("summary",{children:t??"Details"});return(0,v.jsxs)("details",{...s,ref:r,open:u,"data-collapsed":l,className:(0,i.Z)(P.details,c&&P.isBrowser,s.className),onMouseDown:e=>{D(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;D(t)&&O(t,r.current)&&(e.preventDefault(),l?(d(!1),m(!0)):d(!0))},children:[h,(0,v.jsx)(W.z,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),m(!e)},children:(0,v.jsx)("div",{className:P.collapsibleContent,children:n})})]})}const F={details:"details_b_Ee"},G="alert alert--info";function U(e){let{...t}=e;return(0,v.jsx)(q,{...t,className:(0,i.Z)(G,F.details,t.className)})}function J(e){const t=o.Children.toArray(e.children),n=t.find((e=>o.isValidElement(e)&&"summary"===e.type)),s=(0,v.jsx)(v.Fragment,{children:t.filter((e=>e!==n))});return(0,v.jsx)(U,{...e,summary:n,children:s})}var Y=n(7955);function K(e){return(0,v.jsx)(Y.Z,{...e})}const Q={containsTaskList:"containsTaskList_mC6p"};function X(e){if(void 0!==e)return(0,i.Z)(e,e?.includes("contains-task-list")&&Q.containsTaskList)}const ee={img:"img_ev3q"};var te=n(9047);const ne={Head:c.Z,details:J,Details:J,code:function(e){return o.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))?(0,v.jsx)("code",{...e}):(0,v.jsx)(V,{...e})},a:function(e){return(0,v.jsx)($.Z,{...e})},pre:function(e){return(0,v.jsx)(v.Fragment,{children:e.children})},ul:function(e){return(0,v.jsx)("ul",{...e,className:X(e.className)})},img:function(e){return(0,v.jsx)("img",{loading:"lazy",...e,className:(t=e.className,(0,i.Z)(t,ee.img))});var t},h1:e=>(0,v.jsx)(K,{as:"h1",...e}),h2:e=>(0,v.jsx)(K,{as:"h2",...e}),h3:e=>(0,v.jsx)(K,{as:"h3",...e}),h4:e=>(0,v.jsx)(K,{as:"h4",...e}),h5:e=>(0,v.jsx)(K,{as:"h5",...e}),h6:e=>(0,v.jsx)(K,{as:"h6",...e}),admonition:te.Z,mermaid:()=>null};function oe(e){let{children:t}=e;return(0,v.jsx)(s.Z,{components:ne,children:t})}},7594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,s,c]=t;if(o&&c){o=parseInt(o),c=parseInt(c);const e=o<c?1:-1;"-"!==s&&".."!==s&&"\u2025"!==s||(c+=e);for(let t=o;t!==c;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},1151:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i,a:()=>a});var o=n(7294);const s={},c=o.createContext(s);function a(e){const t=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),o.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2529.55960c3f.js b/assets/js/2529.55960c3f.js deleted file mode 100644 index 3b1cd0196..000000000 --- a/assets/js/2529.55960c3f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2529],{9058:(e,t,a)=>{a.d(t,{Z:()=>h});var l=a(7294),n=a(6010),r=a(7961),i=a(7524),o=a(9960),s=a(5999);const c={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function m(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,n.Z)(c.sidebar,"thin-scrollbar"),"aria-label":(0,s.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,n.Z)(c.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,n.Z)(c.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:c.sidebarItem},l.createElement(o.Z,{isNavLink:!0,to:e.permalink,className:c.sidebarItemLink,activeClassName:c.sidebarItemLinkActive},e.title)))))))}var u=a(3102);function d(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(o.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function g(e){return l.createElement(u.Zo,{component:d,props:e})}function p(e){let{sidebar:t}=e;const a=(0,i.i)();return t?.items.length?"mobile"===a?l.createElement(g,{sidebar:t}):l.createElement(m,{sidebar:t}):null}function h(e){const{sidebar:t,toc:a,children:i,...o}=e,s=t&&t.items.length>0;return l.createElement(r.Z,o,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(p,{sidebar:t}),l.createElement("main",{className:(0,n.Z)("col",{"col--7":s,"col--9 col--offset-1":!s}),itemScope:!0,itemType:"http://schema.org/Blog"},i),a&&l.createElement("div",{className:"col col--2"},a))))}},390:(e,t,a)=>{a.d(t,{Z:()=>R});var l=a(7294),n=a(6010),r=a(9460),i=a(4996);function o(e){let{children:t,className:a}=e;const{frontMatter:n,assets:o,metadata:{description:s}}=(0,r.C)(),{withBaseUrl:c}=(0,i.C)(),m=o.image??n.image,u=n.keywords??[];return l.createElement("article",{className:a,itemProp:"blogPost",itemScope:!0,itemType:"http://schema.org/BlogPosting"},s&&l.createElement("meta",{itemProp:"description",content:s}),m&&l.createElement("link",{itemProp:"image",href:c(m,{absolute:!0})}),u.length>0&&l.createElement("meta",{itemProp:"keywords",content:u.join(",")}),t)}var s=a(9960);const c={title:"title_f1Hy"};function m(e){let{className:t}=e;const{metadata:a,isBlogPostPage:i}=(0,r.C)(),{permalink:o,title:m}=a,u=i?"h1":"h2";return l.createElement(u,{className:(0,n.Z)(c.title,t),itemProp:"headline"},i?m:l.createElement(s.Z,{itemProp:"url",to:o},m))}var u=a(5999),d=a(8824);const g={container:"container_mt6G"};function p(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.c)();return t=>{const a=Math.ceil(t);return e(a,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return l.createElement(l.Fragment,null,a(t))}function h(e){let{date:t,formattedDate:a}=e;return l.createElement("time",{dateTime:t,itemProp:"datePublished"},a)}function E(){return l.createElement(l.Fragment,null," \xb7 ")}function b(e){let{className:t}=e;const{metadata:a}=(0,r.C)(),{date:i,formattedDate:o,readingTime:s}=a;return l.createElement("div",{className:(0,n.Z)(g.container,"margin-vert--md",t)},l.createElement(h,{date:i,formattedDate:o}),void 0!==s&&l.createElement(l.Fragment,null,l.createElement(E,null),l.createElement(p,{readingTime:s})))}function f(e){return e.href?l.createElement(s.Z,e):l.createElement(l.Fragment,null,e.children)}function v(e){let{author:t,className:a}=e;const{name:r,title:i,url:o,imageURL:s,email:c}=t,m=o||c&&`mailto:${c}`||void 0;return l.createElement("div",{className:(0,n.Z)("avatar margin-bottom--sm",a)},s&&l.createElement(f,{href:m,className:"avatar__photo-link"},l.createElement("img",{className:"avatar__photo",src:s,alt:r,itemProp:"image"})),r&&l.createElement("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person"},l.createElement("div",{className:"avatar__name"},l.createElement(f,{href:m,itemProp:"url"},l.createElement("span",{itemProp:"name"},r))),i&&l.createElement("small",{className:"avatar__subtitle",itemProp:"description"},i)))}const _={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function N(e){let{className:t}=e;const{metadata:{authors:a},assets:i}=(0,r.C)();if(0===a.length)return null;const o=a.every((e=>{let{name:t}=e;return!t}));return l.createElement("div",{className:(0,n.Z)("margin-top--md margin-bottom--sm",o?_.imageOnlyAuthorRow:"row",t)},a.map(((e,t)=>l.createElement("div",{className:(0,n.Z)(!o&&"col col--6",o?_.imageOnlyAuthorCol:_.authorCol),key:t},l.createElement(v,{author:{...e,imageURL:i.authorsImageUrls[t]??e.imageURL}})))))}function P(){return l.createElement("header",null,l.createElement(m,null),l.createElement(b,null),l.createElement(N,null))}var k=a(8780),Z=a(1506);function w(e){let{children:t,className:a}=e;const{isBlogPostPage:i}=(0,r.C)();return l.createElement("div",{id:i?k.blogPostContainerID:void 0,className:(0,n.Z)("markdown",a),itemProp:"articleBody"},l.createElement(Z.Z,null,t))}var C=a(4881),I=a(1526),T=a(7462);function y(){return l.createElement("b",null,l.createElement(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More"))}function F(e){const{blogPostTitle:t,...a}=e;return l.createElement(s.Z,(0,T.Z)({"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t})},a),l.createElement(y,null))}const L={blogPostFooterDetailsFull:"blogPostFooterDetailsFull_mRVl"};function B(){const{metadata:e,isBlogPostPage:t}=(0,r.C)(),{tags:a,title:i,editUrl:o,hasTruncateMarker:s}=e,c=!t&&s,m=a.length>0;return m||c||o?l.createElement("footer",{className:(0,n.Z)("row docusaurus-mt-lg",t&&L.blogPostFooterDetailsFull)},m&&l.createElement("div",{className:(0,n.Z)("col",{"col--9":c})},l.createElement(I.Z,{tags:a})),t&&o&&l.createElement("div",{className:"col margin-top--sm"},l.createElement(C.Z,{editUrl:o})),c&&l.createElement("div",{className:(0,n.Z)("col text--right",{"col--3":m})},l.createElement(F,{blogPostTitle:i,to:e.permalink}))):null}function R(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,r.C)();return e?void 0:"margin-bottom--xl"}();return l.createElement(o,{className:(0,n.Z)(i,a)},l.createElement(P,null),l.createElement(w,null,t),l.createElement(B,null))}},4881:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(7294),n=a(5999),r=a(5281),i=a(7462),o=a(6010);const s={iconEdit:"iconEdit_Z9Sw"};function c(e){let{className:t,...a}=e;return l.createElement("svg",(0,i.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,o.Z)(s.iconEdit,t),"aria-hidden":"true"},a),l.createElement("g",null,l.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function m(e){let{editUrl:t}=e;return l.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:r.k.common.editThisPage},l.createElement(c,null),l.createElement(n.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},2244:(e,t,a)=>{a.d(t,{Z:()=>i});var l=a(7294),n=a(6010),r=a(9960);function i(e){const{permalink:t,title:a,subLabel:i,isNext:o}=e;return l.createElement(r.Z,{className:(0,n.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},i&&l.createElement("div",{className:"pagination-nav__sublabel"},i),l.createElement("div",{className:"pagination-nav__label"},a))}},3008:(e,t,a)=>{a.d(t,{Z:()=>o});var l=a(7294),n=a(6010),r=a(9960);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function o(e){let{permalink:t,label:a,count:o}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(i.tag,o?i.tagWithCount:i.tagRegular)},a,o&&l.createElement("span",null,o))}},1526:(e,t,a)=>{a.d(t,{Z:()=>s});var l=a(7294),n=a(6010),r=a(5999),i=a(3008);const o={tags:"tags_jXut",tag:"tag_QGVx"};function s(e){let{tags:t}=e;return l.createElement(l.Fragment,null,l.createElement("b",null,l.createElement(r.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),l.createElement("ul",{className:(0,n.Z)(o.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:a}=e;return l.createElement("li",{key:a,className:o.tag},l.createElement(i.Z,{label:t,permalink:a}))}))))}},9460:(e,t,a)=>{a.d(t,{C:()=>o,n:()=>i});var l=a(7294),n=a(902);const r=l.createContext(null);function i(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,l.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return l.createElement(r.Provider,{value:i},t)}function o(){const e=(0,l.useContext)(r);if(null===e)throw new n.i6("BlogPostProvider");return e}},8824:(e,t,a)=>{a.d(t,{c:()=>c});var l=a(7294),n=a(2263);const r=["zero","one","two","few","many","other"];function i(e){return r.filter((t=>e.includes(t)))}const o={locale:"en",pluralForms:i(["one","other"]),select:e=>1===e?"one":"other"};function s(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,l.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:i(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),o}}),[e])}function c(){const e=s();return{selectMessage:(t,a)=>function(e,t,a){const l=e.split("|");if(1===l.length)return l[0];l.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${l.length}: ${e}`);const n=a.select(t),r=a.pluralForms.indexOf(n);return l[Math.min(r,l.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/28bd9d7a.f78b3bcd.js b/assets/js/28bd9d7a.f78b3bcd.js new file mode 100644 index 000000000..7958af71d --- /dev/null +++ b/assets/js/28bd9d7a.f78b3bcd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4202],{2796:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>u});var n=i(5893),o=i(1151);const s={label:"FFMetrics",sidebar_position:3},r="FFMetrics",c={id:"utilities/FFMetrics",title:"FFMetrics",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/FFMetrics.mdx",sourceDirName:"utilities",slug:"/utilities/FFMetrics",permalink:"/docs/utilities/FFMetrics",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/FFMetrics.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"FFMetrics",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"rAV1ator",permalink:"/docs/utilities/rAV1ator"},next:{title:"YUView",permalink:"/docs/utilities/YUView"}},a={},u=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"ffmetrics",children:"FFMetrics"}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsx)(t.p,{children:"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."})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>c,a:()=>r});var n=i(7294);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/299beccc.304ede3c.js b/assets/js/299beccc.304ede3c.js new file mode 100644 index 000000000..553087ffe --- /dev/null +++ b/assets/js/299beccc.304ede3c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3536],{3524:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>n,metadata:()=>a,toc:()=>d});var s=t(5893),o=t(1151);const n={label:"7z",sidebar_position:4},r="7-zip (7z)",a={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.mdx",sourceDirName:"data",slug:"/data/7z",permalink:"/docs/data/7z",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/7z.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"7z",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"bzip2",permalink:"/docs/data/bzip2"},next:{title:"XZ",permalink:"/docs/data/xz"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"7-zip-7z",children:"7-zip (7z)"}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(i.p,{children:["7-zip (7z) is a file format that supports several different data compression, encryption, & pre-processing algorithms. It was created by the 7-Zip archiver, which is free and open-source software for dealing with various data compression formats including formats similar to 7z like ",(0,s.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["The 7-zip format has some noteworthy advantages over the popular ",(0,s.jsx)(i.a,{href:"/docs/data/zip",children:"ZIP"})," format."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:'The 7-zip utility can compress files to the 7z format "30-70% better" than to ZIP format despite having a highly efficient ZIP encoder. It mainly uses the LZMA & LZMA2 algorithms, which are more modern than DEFLATE and usually compress better.'}),"\n",(0,s.jsx)(i.li,{children:"7-zip can encrypt files with AES-256 using a user provided password. AES-256 is more secure than the ZipCrypto encryption often used by ZIP."}),"\n",(0,s.jsx)(i.li,{children:"7-zip can support files up to 16 exabytes in size, while traditional ZIP has a 4 GB limit (ZIP64, which is commonly used, does not suffer from this 4 GB limitation so this is less relevant now). 7-zip also supports various pre-processing filters, which can improve compression for certain types of data like executables and binaries."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"However, 7-zip also has some drawbacks and limitations."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"7-zip is not as widely supported as ZIP by other software and platforms. Some users may need to install additional programs or plugins to open or extract 7z files45."}),"\n",(0,s.jsx)(i.li,{children:"Slower speed: 7-zip archives may take longer to compress or decompress compared to ZIP. This is somewhat mitigated by the 7-zip utility's effective parallelization when decoding, but this only affects real time as opposed to user time meaning it is still likely going to be more expensive to decompress than ZIP."}),"\n",(0,s.jsx)(i.li,{children:"7-zip does not have any built-in mechanism to repair corrupted or damaged archives. Users may need to use third-party tools or backup copies to recover their data1"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"7z archives are supported natively by macOS & many Linux distributions."})]})}function p(e={}){const{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>a,a:()=>r});var s=t(7294);const o={},n=s.createContext(o);function r(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2c0077b9.a4ce8002.js b/assets/js/2c0077b9.a4ce8002.js deleted file mode 100644 index dcddb30d8..000000000 --- a/assets/js/2c0077b9.a4ce8002.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9612],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>y});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=o.createContext({}),l=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=l(e.components);return o.createElement(c.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(n),d=r,y=p["".concat(c,".").concat(d)]||p[d]||h[d]||i;return n?o.createElement(y,a(a({ref:t},u),{},{components:n})):o.createElement(y,a({ref:t},u))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.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[p]="string"==typeof e?e:r,a[1]=s;for(var l=2;l<i;l++)a[l]=n[l];return o.createElement.apply(null,a)}return o.createElement.apply(null,n)}d.displayName="MDXCreateElement"},257:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var o=n(7462),r=(n(7294),n(3905));const i={sidebar_position:5},a="Psycho-visual",s={unversionedId:"introduction/psychovisual",id:"introduction/psychovisual",title:"Psycho-visual",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/introduction/psychovisual.md",sourceDirName:"introduction",slug:"/introduction/psychovisual",permalink:"/docs/introduction/psychovisual",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/psychovisual.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Spotting Video Artifacts",permalink:"/docs/introduction/video-artifacts"},next:{title:"High Dynamic Range",permalink:"/docs/introduction/high-dynamic-range"}},c={},l=[{value:"In English",id:"in-english",level:2}],u={toc:l},p="wrapper";function h(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"psycho-visual"},"Psycho-visual"),(0,r.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,r.kt)("admonition",{title:"Pending Review",type:"caution"},(0,r.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,r.kt)("p",null,'"',(0,r.kt)("em",{parentName:"p"},"Traditionally, the encoder tends to favor blurred reconstructed blocks over blocks which have wrong motion. The human eye generally prefers the wrong motion over the blur. Psycho-visual options combat this. While technically less \u201ccorrect\u201d, which is why they are disabled for research purposes, they should be enabled for content intended for \u201chuman eyes\u201d."),' "'),(0,r.kt)("p",null,"-- Kokomins' x265 ",(0,r.kt)("a",{parentName:"p",href:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac"},"guide")),(0,r.kt)("h2",{id:"in-english"},"In English"),(0,r.kt)("p",null,'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.'),(0,r.kt)("p",null,"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."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2d568f8b.d80ff40c.js b/assets/js/2d568f8b.d80ff40c.js deleted file mode 100644 index 3bbc34e81..000000000 --- a/assets/js/2d568f8b.d80ff40c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6242],{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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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},l=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="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"]),p=u(r),d=o,f=p["".concat(s,".").concat(d)]||p[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[p]="string"==typeof e?e:o,a[1]=c;for(var u=2;u<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},4256:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={label:"VMAF",sidebar_position:1},a="VMAF",c={unversionedId:"metrics/VMAF",id:"metrics/VMAF",title:"VMAF",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/VMAF.md",sourceDirName:"metrics",slug:"/metrics/VMAF",permalink:"/docs/metrics/VMAF",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/VMAF.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"VMAF",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2"},next:{title:"Butteraugli",permalink:"/docs/metrics/butteraugli"}},s={},u=[],l={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"vmaf"},"VMAF"),(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!")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/311c973b.0d864e01.js b/assets/js/311c973b.0d864e01.js deleted file mode 100644 index 625edeaab..000000000 --- a/assets/js/311c973b.0d864e01.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1056],{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 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 c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),s=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},l=function(e){var t=s(e.components);return n.createElement(u.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,u=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),p=s(r),f=o,b=p["".concat(u,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(b,c(c({ref:t},l),{},{components:r})):n.createElement(b,c({ref:t},l))}));function b(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=f;var a={};for(var u in t)hasOwnProperty.call(t,u)&&(a[u]=t[u]);a.originalType=e,a[p]="string"==typeof e?e:o,c[1]=a;for(var s=2;s<i;s++)c[s]=r[s];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},1396:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const i={label:"uvg266",sidebar_position:10},c="uvg266",a={unversionedId:"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!",source:"@site/docs/encoders/uvg266.md",sourceDirName:"encoders",slug:"/encoders/uvg266",permalink:"/docs/encoders/uvg266",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/uvg266.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{label:"uvg266",sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"VVenC",permalink:"/docs/encoders/VVenC"},next:{title:"VTM",permalink:"/docs/encoders/VTM"}},u={},s=[],l={toc:s},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"uvg266"},"uvg266"),(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/318608aa.11d4c42c.js b/assets/js/318608aa.11d4c42c.js new file mode 100644 index 000000000..5c496fe1a --- /dev/null +++ b/assets/js/318608aa.11d4c42c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3248],{1440:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var t=i(5893),s=i(1151);const o={title:"vpxenc",sidebar_position:3},r="vpxenc",l={id:"encoders/vpxenc",title:"vpxenc",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/vpxenc.mdx",sourceDirName:"encoders",slug:"/encoders/vpxenc",permalink:"/docs/encoders/vpxenc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/vpxenc.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"vpxenc",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"aomenc",permalink:"/docs/encoders/aomenc"},next:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"}},a={},c=[{value:"Building",id:"building",level:2},{value:"VP8",id:"vp8",level:2},{value:"VP9",id:"vp9",level:2},{value:"Encoding",id:"encoding",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"vpxenc",children:"vpxenc"}),"\n",(0,t.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc is part of the libvpx library for working with the ",(0,t.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,t.jsx)(n.a,{href:"/docs/video/VP8",children:"VP8"})," video codecs. It is capable of encoding & decoding both formats, where vpxenc is the multipurpose encoder. VP9 competes with ",(0,t.jsx)(n.a,{href:"/docs/video/HEVC",children:"HEVC"})," (h265) & ",(0,t.jsx)(n.a,{href:"/docs/video/AVC",children:"AVC"})," (h264) in coding efficiency, and has been superseded by ",(0,t.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"}),". VP8 competes with AVC. By default, vpxenc isn't as competitive as it could be, but even when used properly, most tests show that h265 offers slightly better quality per bit with efficient encoders like ",(0,t.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"building",children:"Building"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Linux & macOS"})}),"\n",(0,t.jsx)(n.p,{children:"To build libvpx from source:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://chromium.googlesource.com/webm/libvpx\ncd libvpx\n./configure\nmake -j [# of CPU threads]\n"})}),"\n",(0,t.jsxs)(n.p,{children:["It may be worth digging through the ",(0,t.jsx)(n.code,{children:"configure"})," options, which can be listed by running ",(0,t.jsx)(n.code,{children:"./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:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'./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\n'})}),"\n",(0,t.jsxs)(n.p,{children:["From the build, a binary will be produced called ",(0,t.jsx)(n.code,{children:"vpxenc"}),". You can copy this build to ",(0,t.jsx)(n.code,{children:"/usr/local/bin"})," or execute it directly in the directory, shown below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"./vpxenc --help | grep vp9 -C 3\n\nIncluded encoders:\n\n vp9 - WebM Project VP9 Encoder v1.13.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),"\n",(0,t.jsx)(n.h2,{id:"vp8",children:"VP8"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Incomplete"})}),"\n",(0,t.jsx)(n.h2,{id:"vp9",children:"VP9"}),"\n",(0,t.jsxs)(n.p,{children:["For encoding VP9, vpxenc's default parameters are not considered optimal. There are a lot of options that are either disabled without reason or are simply misconfigured, hurting coding efficiency at little cost otherwise. As of mid-2021, some parameters (the TPL-model, lag-in-frames and auto-alt-ref frames) were changed (since libvpx 1.9.0 and libvpx 1.10.0) which means that there's not much use of setting these three parameters unless you're in ",(0,t.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),". This section covers the most important options libvpx-vp9 has to offer, recommended settings, & what they do."]}),"\n",(0,t.jsx)(n.h3,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--codec=vp9"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Self-explanatory."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--passes=2"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc's 2-pass mode is quite fast compared to 2-pass in ",(0,t.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"})," and x265. Only use 1-pass mode for real-time applications, which won't be covered here yet. It is the default in the standalone vpxenc libvpx-vp9 encoder."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--webm"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Enables WebM output for the encoder, and passes the encoder flags set. It is not necessary to enable it, but since it passes the encoder flags, I would use it. Can be changed to ",(0,t.jsx)(n.code,{children:"--ivf"})," for an ivf video stream."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--good"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This is a sort of quality deadline, the minimum speed the encoder is allowed to go to. It isn't recommended to use ",(0,t.jsx)(n.code,{children:"-\u2013best"})," as it is slow for the quality uplift you get. Do not use RT for anything but real-time encoding."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--threads=8"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Dictates the number of threads the encoder should spawn. It doesn\u2019t mean it\u2019ll scale all that well over those 8 threads. On a 16 thread CPU with a single encoder instance, I would use 8 threads. With multiple encoder instance encoding(with qencoder/av1an/neav1e), I would set it to 2 threads."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--profile=2"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"VP9 profile 2 is obligatory if you want 10-bit & 12-bit support for HDR, and improved quality from 8-bit."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--lag-in-frames=25"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Lag-in-frames is the libvpx equivalent of lookahead in x264. The higher the number, the slower the encoder will be, but at the upside of making it more efficient. Going above \u2013lag-in-frames=12 also activates another setting called alternate reference frames. 25 is the maximum you can get in libvpx-vp9. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--end-usage=q"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Q mode is the closest equivalent to CRF that libvpx-vp9 offers, so use it if maximum quality is desired."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--cq-level=25"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"For 1080p30 8-bit content, it is recommended to go with a Q of 25; you can go lower if you value higher quality over pure efficiency. For 1080p60 8-bit content, I would recommend going with a higher Q value with a delta of around 15. So, a Q of 30 to 40 is usually recommended. Depending on the content, you may have to tune this value, so this advice is only useful in choosing a starting point."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--kf-max-dist=[input FPS * 10]"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This tells the encoder to have a maximum number of frames between keyframes. It will usually place a lower number of keyframes in content like movies, TV shows, or animated shows, so you can set it to a very high number or not set it at all if you want maximum efficiency for this kind of content. Otherwise, I would go with the 10-second rule: ",(0,t.jsx)(n.code,{children:"--kf-max-dist=240"})," for 24FPS content, 300 for 30FPS content, 600 for 60FPS content, and so on."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--cpu-used=3"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This is where the biggest balance of quality to speed is with libvpx-vp9. This is similar to presets in x264 and x265, except the lower the number, the slower the encoder takes. Using ",(0,t.jsx)(n.code,{children:"--cpu-used=3"})," & below enables RDO, which increases quality at the expense of speed. Another note: --cpu-used=5 and above are ",(0,t.jsx)(n.em,{children:"slower"})," in the 1st pass, so it isn't recommended to use them anyway."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--auto-alt-ref=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:['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. ',(0,t.jsx)(n.code,{children:"--auto-alt-ref=6"})," can also be used, but be aware that this does require ",(0,t.jsx)(n.code,{children:"--profile=2"})," be set as mentioned above."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--arnr-maxframes=7"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This is the maximum number of alternate reference frames the encoder is allowed to use. For most content, 7 is usually a good bet, and it is the default. With animated content, going with a value of 12 or to the max is a good bet, as animated content benefits from more additional alt-ref frames than other content. Be aware that increasing this value will impact encode speed."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--arnr-strength=4"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This setting dictates how much denoising will occur in the alt-ref frames. Lowering it to 2 or 3 is usually a good bet for noisier/grainy content to try and retain more detail, but 4 is a sane starting place. The default setting is 5, which is fine for most content, but it can be beneficial going a bit lower. For animation, keeping the default of 5 is likely a better option."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--aq-mode=0"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Adaptive quantization is the way for an encoder to spend more bits in certain areas to improve ",(0,t.jsx)(n.a,{href:"/docs/introduction/psychovisual",children:"psychovisual fidelity"}),". ",(0,t.jsx)(n.code,{children:"-\u2013aq-mode=0"})," works well on clean content (animation, video games, screen content). ",(0,t.jsx)(n.code,{children:"--aq-mode=2"})," is recommended when you want to give more detail to more complex parts of a video."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--frame-boost=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This flag lets the encoder periodically boost the bitrate of a scene/frame if it needs it. Leaving it at the default ",(0,t.jsx)(n.code,{children:"--frame-boost=0"})," is usually a good bet, & this isn't a particularly salient change."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tune-content=default"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This determines how the encoder is tuned. In libvpx-vp9, there are three options: ",(0,t.jsx)(n.code,{children:"default"}),", ",(0,t.jsx)(n.code,{children:"screen"}),", and ",(0,t.jsx)(n.code,{children:"film"}),". Default is for most scenarios, screen is for screen content(video games, live-streaming content like web pages & your screen), and film is for heavily dithered/grainy video. Leaving it at the default for about everything but screen content as described above is probably the best option. ",(0,t.jsx)(n.code,{children:"--tune-content=screen"})," with ",(0,t.jsx)(n.code,{children:"--aq-mode=2"})," is not recommended, as it creates some odd artifacts. It is advised to use ",(0,t.jsx)(n.code,{children:"--aq-mode=0"})," if ",(0,t.jsx)(n.code,{children:"--tune-content=screen"})," is activated, or if you want better perceptual quality, ",(0,t.jsx)(n.code,{children:"--aq-mode=1"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--row-mt=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Enables row multi-threading in libvpx-vp9. ",(0,t.jsx)(n.em,{children:"Always"})," enable it no matter what, as it does not hurt efficiency, but boosts speed considerably. This feature is disabled by default."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--bit-depth=10"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Always use 10-bit for maximum efficiency & minimal banding, even with an 8-bit source. Make sure to enable ",(0,t.jsx)(n.code,{children:"-\u2013profile=2"})," as mentioned above."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tile-columns=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This setting divides the video into tile columns for easier parallelization when encoding & decoding. Setting ",(0,t.jsx)(n.code,{children:"-\u2013tile-columns=1"}),", you will get 2\xb9 tile columns. Setting it higher is a trade-off between parallelization & coding efficiency, as more tiles means less information your encoder can work with, and this will result in decreased efficiency. Do note there is an upper threshold in regards to the number of tile columns you can get due to the fixed minimum tile width of 256 pixels. So, this means 4 tile columns (2\xb2) for 720p and 1080p, 8 tile columns (2\u2074) for 1440p/4k, and so on. If you set a tile column number that is too high, it will drop down to the lowest supported number of tile columns at the input resolution."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tile-rows=0"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This setting divides the video into tile rows. This option is different from columns because although it also makes decoding performance higher, it does not scale as well as tile columns & doesn\u2019t increase encoder threading nearly as much. Always use more tile-columns than rows, or leave the number of tile rows at default (0). Leaving the encoder defaults at ",(0,t.jsx)(n.code,{children:"-\u2013tile-rows=0"})," & ",(0,t.jsx)(n.code,{children:"\u2013-tile-columns=0"})," will result in the highest overall coding efficiency possible with these options."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--enable-tpl=1"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This option enables a temporal layer model, which helps with coding efficiency. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,t.jsx)(n.p,{children:"All of these options are only available for the standalone vpxenc program. Here is a sample FFmpeg command line interpretation of the commands above, with some options missing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 1 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 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 -\nffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 2 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 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\n"})}),"\n",(0,t.jsx)(n.p,{children:"Alternatively, you can pass a raw .y4m stream to standalone vpxenc & encode that way."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"VP9 section written based on work by BlueSwordM, who has granted written permission for this wiki page to exist in its current fashion"})})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>r});var t=i(7294);const s={},o=t.createContext(s);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/319244b6.f6ed9212.js b/assets/js/319244b6.fbe11821.js similarity index 79% rename from assets/js/319244b6.f6ed9212.js rename to assets/js/319244b6.fbe11821.js index 327549835..5f3e9d862 100644 --- a/assets/js/319244b6.f6ed9212.js +++ b/assets/js/319244b6.fbe11821.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1221],{9742:s=>{s.exports=JSON.parse('{"label":"compression","permalink":"/blog/tags/compression","allTagsPath":"/blog/tags","count":2}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1221],{9742:s=>{s.exports=JSON.parse('{"label":"compression","permalink":"/blog/tags/compression","allTagsPath":"/blog/tags","count":2,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/32987299.841c8c95.js b/assets/js/32987299.841c8c95.js new file mode 100644 index 000000000..1e047f232 --- /dev/null +++ b/assets/js/32987299.841c8c95.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2667],{2278:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=n(5893),o=n(1151);const r={label:"Vapoursynth",sidebar_position:2},s="Vapoursynth",a={id:"filtering/vapoursynth",title:"Vapoursynth",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/filtering/vapoursynth.mdx",sourceDirName:"filtering",slug:"/filtering/vapoursynth",permalink:"/docs/filtering/vapoursynth",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/vapoursynth.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"Vapoursynth",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Deband",permalink:"/docs/filtering/deband"},next:{title:"Deinterlace",permalink:"/docs/filtering/deinterlace"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3}];function d(t){const e={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,o.a)(),...t.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.h1,{id:"vapoursynth",children:"Vapoursynth"}),"\n",(0,i.jsx)(e.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(e.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsxs)("picture",{children:[(0,i.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/vs_edit_script.avif?token=GHSAT0AAAAAACEZPDXJ6SHSUQIMUOGQXQTEZHY7K4A",type:"image/avif"}),(0,i.jsx)("img",{src:"https://autumn.revolt.chat/attachments/g7DucEq3aRGWVH0MHQe-A21GkyDVln9IHzRlfjEYEh/vs_edit_script.png",alt:"Vapoursynth script",width:"520",height:"632"})]}),"\n",(0,i.jsx)(e.p,{children:'"VapourSynth is an application for video manipulation. Or a plugin. Or a library. It\u2019s hard to tell because it has a core library written in C++ and a Python module to allow video scripts to be created."'}),"\n",(0,i.jsx)(e.p,{children:"-- Fredrik Mellbin, creator of VapourSynth"}),"\n",(0,i.jsx)(e.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(e.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(e.h3,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:["At the current time of writing, Python 3.11 is required. This will change in the future so consult from ",(0,i.jsx)(e.a,{href:"http://www.vapoursynth.com/doc/installation.html",children:"their website"})]}),"\n",(0,i.jsxs)(e.li,{children:["Download the installer (",(0,i.jsx)(e.code,{children:".exe"}),") unless you have a reason for using portable"]}),"\n",(0,i.jsx)(e.li,{children:"Install it"}),"\n"]})]})}function h(t={}){const{wrapper:e}={...(0,o.a)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(d,{...t})}):d(t)}},1151:(t,e,n)=>{n.d(e,{Z:()=>a,a:()=>s});var i=n(7294);const o={},r=i.createContext(o);function s(t){const e=i.useContext(r);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:s(t.components),i.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/333f9c20.2379da1b.js b/assets/js/333f9c20.2379da1b.js deleted file mode 100644 index 81e55dc3c..000000000 --- a/assets/js/333f9c20.2379da1b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1727],{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 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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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)}},f=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),f=o,m=p["".concat(l,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));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 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<i;s++)a[s]=r[s];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},2231:(e,t,r)=>{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:"NMKODER",sidebar_position:5},a="NMKODER",c={unversionedId:"utilities/nmkoder",id:"utilities/nmkoder",title:"NMKODER",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/nmkoder.md",sourceDirName:"utilities",slug:"/utilities/nmkoder",permalink:"/docs/utilities/nmkoder",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/nmkoder.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"NMKODER",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"rAV1ator CLI",permalink:"/docs/utilities/rav1ator-cli"},next:{title:"dovi_tool",permalink:"/docs/utilities/dovi_tool"}},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:"nmkoder"},"NMKODER"),(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/33b5e57c.0e14bf0c.js b/assets/js/33b5e57c.0e14bf0c.js deleted file mode 100644 index d07a8ec6e..000000000 --- a/assets/js/33b5e57c.0e14bf0c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3128],{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 c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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):c(c({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="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=a(e,["components","mdxType","originalType","parentName"]),p=u(r),d=o,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||i;return r?n.createElement(f,c(c({ref:t},l),{},{components:r})):n.createElement(f,c({ref:t},l))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=d;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a[p]="string"==typeof e?e:o,c[1]=a;for(var u=2;u<i;u++)c[u]=r[u];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},6807:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={label:"SSIM",sidebar_position:1},c="SSIM",a={unversionedId:"metrics/SSIM",id:"metrics/SSIM",title:"SSIM",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/SSIM.md",sourceDirName:"metrics",slug:"/metrics/SSIM",permalink:"/docs/metrics/SSIM",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIM.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"SSIM",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"PSNR",permalink:"/docs/metrics/PSNR"},next:{title:"SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2"}},s={},u=[],l={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"ssim"},"SSIM"),(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!")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/345ef4f9.4266d661.js b/assets/js/345ef4f9.4266d661.js new file mode 100644 index 000000000..48df34889 --- /dev/null +++ b/assets/js/345ef4f9.4266d661.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5383],{1942:(t,i,e)=>{e.r(i),e.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var o=e(5893),n=e(1151);const s={label:"MKVToolNix",sidebar_position:2},r="MKVToolNix",a={id:"utilities/MKVToolNix",title:"MKVToolNix",description:"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.",source:"@site/docs/utilities/MKVToolNix.mdx",sourceDirName:"utilities",slug:"/utilities/MKVToolNix",permalink:"/docs/utilities/MKVToolNix",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/MKVToolNix.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"MKVToolNix",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Av1an",permalink:"/docs/utilities/av1an"},next:{title:"rAV1ator",permalink:"/docs/utilities/rAV1ator"}},l={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Tips and tricks",id:"tips-and-tricks",level:2}];function c(t){const i={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",ul:"ul",...(0,n.a)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h1,{id:"mkvtoolnix",children:"MKVToolNix"}),"\n",(0,o.jsx)(i.p,{children:"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."}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/mkvtoolnix-gui-workload.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/mkvtoolnix-gui-workload.webp",alt:"MKVToolNix Workload"})]}),"\n",(0,o.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(i.p,{children:"Fortunately, Moritz Bunkus (Creator) is sane enough to provide downloads for pretty much all popular desktop operating systems."}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Windows & Mac: ",(0,o.jsx)(i.a,{href:"https://mkvtoolnix.download/downloads.html",children:"MKVToolNix site"}),"."]}),"\n",(0,o.jsxs)(i.li,{children:["Linux: ",(0,o.jsx)(i.a,{href:"https://flathub.org/apps/org.bunkus.mkvtoolnix-gui",children:"Install as a Flatpak"})," or check your package manager."]}),"\n"]}),"\n",(0,o.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(i.p,{children:'Drag and drop media files (or use "Add source files") to the application and modify, remux, demux, add streams, drop streams, anything and when done set your output destination and click "Start multiplexing" to start writing the output.'}),"\n",(0,o.jsx)(i.h2,{id:"tips-and-tricks",children:"Tips and tricks"}),"\n",(0,o.jsxs)(i.ol,{children:["\n",(0,o.jsxs)(i.li,{children:["You can import unencrypted BDMV (",(0,o.jsx)(i.code,{children:"index.bdmv"}),") or Blu-ray playlist files into MKVToolNix and it will prompt you to select which stream you would want to import."]}),"\n",(0,o.jsx)(i.li,{children:'You can set a WebM output in Output > Miscellaneous > "Create WebM compliant file"'}),"\n",(0,o.jsx)(i.li,{children:"You can split videos in multiple ways in Output > Splitting. Best of all? No freeze frames unlike in FFmpeg and no re-encoding required."}),"\n",(0,o.jsx)(i.li,{children:'You can edit metadata without remuxing (Albeit rather limited) in the "Header Editor".'}),"\n"]})]})}function u(t={}){const{wrapper:i}={...(0,n.a)(),...t.components};return i?(0,o.jsx)(i,{...t,children:(0,o.jsx)(c,{...t})}):c(t)}},1151:(t,i,e)=>{e.d(i,{Z:()=>a,a:()=>r});var o=e(7294);const n={},s=o.createContext(n);function r(t){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof t?t(i):{...i,...t}}),[i,t])}function a(t){let i;return i=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:r(t.components),o.createElement(s.Provider,{value:i},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/3494e53a.fe7bea70.js b/assets/js/3494e53a.fe7bea70.js deleted file mode 100644 index dcb9d35cc..000000000 --- a/assets/js/3494e53a.fe7bea70.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[370],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>b});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,b=u["".concat(l,".").concat(m)]||u[m]||d[m]||i;return n?r.createElement(b,a(a({ref:t},c),{},{components:n})):r.createElement(b,a({ref:t},c))}));function b(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,a[1]=s;for(var p=2;p<i;p++)a[p]=n[p];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},9302:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(7462),o=(n(7294),n(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"}},l={},p=[{value:"Encoding",id:"encoding",level:2},{value:"Using libwebp",id:"using-libwebp",level:3},{value:"Performance Checklist",id:"performance-checklist",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},c,n,{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:"encoding"},"Encoding"),(0,o.kt)("h3",{id:"using-libwebp"},"Using libwebp"),(0,o.kt)("p",null,"libwebp supports WebP, JPEG, PNG, PNM (PGM, PPM, PAM), TIFF as input formats, and a quality (",(0,o.kt)("inlineCode",{parentName:"p"},"-q"),") value between 0 (lowest quality, smallest file) and 100 (highest quality, largest file). Should you need the lossless mode, you need to instead use a ",(0,o.kt)("inlineCode",{parentName:"p"},"-z")," argument, with values representing the effort used between 0 (fastest encode, largest file) and 9 (slowest encode, smallest file)."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"cwebp example.png -q 75 -o example.webp\n")),(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/350130fb.91d58b4d.js b/assets/js/350130fb.91d58b4d.js deleted file mode 100644 index 8c71d861d..000000000 --- a/assets/js/350130fb.91d58b4d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9211],{3905:(e,t,o)=>{o.d(t,{Zo:()=>d,kt:()=>b});var i=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function n(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,i)}return o}function a(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?n(Object(o),!0).forEach((function(t){r(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function l(e,t){if(null==e)return{};var o,i,r=function(e,t){if(null==e)return{};var o,i,r={},n=Object.keys(e);for(i=0;i<n.length;i++)o=n[i],t.indexOf(o)>=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i<n.length;i++)o=n[i],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=i.createContext({}),c=function(e){var t=i.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):a(a({},t),e)),o},d=function(e){var t=c(e.components);return i.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var o=e.components,r=e.mdxType,n=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=c(o),m=r,b=u["".concat(s,".").concat(m)]||u[m]||p[m]||n;return o?i.createElement(b,a(a({ref:t},d),{},{components:o})):i.createElement(b,a({ref:t},d))}));function b(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=o.length,a=new Array(n);a[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:r,a[1]=l;for(var c=2;c<n;c++)a[c]=o[c];return i.createElement.apply(null,a)}return i.createElement.apply(null,o)}m.displayName="MDXCreateElement"},7069:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>p,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var i=o(7462),r=(o(7294),o(3905));const n={label:"Dolby Digital",sidebar_position:3},a="Dolby Digital",l={unversionedId:"audio/Dolby",id:"audio/Dolby",title:"Dolby Digital",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/audio/Dolby.md",sourceDirName:"audio",slug:"/audio/Dolby",permalink:"/docs/audio/Dolby",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Dolby.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"Dolby Digital",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Opus",permalink:"/docs/audio/Opus"},next:{title:"MP3",permalink:"/docs/audio/MP3"}},s={},c=[{value:"Format Overview",id:"format-overview",level:2},{value:"AC-3",id:"ac-3",level:3},{value:"Dolby Digital Surround EX",id:"dolby-digital-surround-ex",level:4},{value:"E-AC-3",id:"e-ac-3",level:3},{value:"TrueHD",id:"truehd",level:3},{value:"AC-4",id:"ac-4",level:3},{value:"Atmos",id:"atmos",level:3}],d={toc:c},u="wrapper";function p(e){let{components:t,...o}=e;return(0,r.kt)(u,(0,i.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"dolby-digital"},"Dolby Digital"),(0,r.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,r.kt)("p",null,"Dolby Digital is a family of both lossless and lossy audio compression algorithms and technologies. "),(0,r.kt)("h2",{id:"format-overview"},"Format Overview"),(0,r.kt)("h3",{id:"ac-3"},"AC-3"),(0,r.kt)("p",null,"Originally known as Dolby Digital, AC-3 was first released in 1991 to provide digital 5.1 sound in cinemas from 35mm film reels. AC-3 is notable for being the first audio codec to make use of the \u201cModified Discrete Cosine Transform\u201d algorithm. The codec has seen widespread use an adoption, due to its prevalence in DVDs, TV, and Blu-rays as a surround codec. "),(0,r.kt)("h4",{id:"dolby-digital-surround-ex"},"Dolby Digital Surround EX"),(0,r.kt)("p",null,"Like Dolby\u2019s earlier Pro Logic technology, Dolby Digital Surround EX matrixes a sixth, centre back surround channel into the left and right surround channels of a 5.1 stream, allowing for a 6.1 mix to be unfolded when played on a 6.1 or 7.1 system with EX decoding. This technology is fully backwards compatible with existing AC-3 decoders, producing the standard 5.1 stream. Surround EX was first introduced in 1999 with the release of \u201cStar Wars: Episode I \u2013 The Phantom Menace\u201d. "),(0,r.kt)("h3",{id:"e-ac-3"},"E-AC-3"),(0,r.kt)("p",null,"Often referred to as \u201cDolby Digital Plus\u201d, E-AC-3 is the successor to Dolby\u2019s earlier AC-3 codec, featuring support for higher bitrates (6,144kbps vs 640kbps), more channels (15 vs 5), and additional coding tools allowing for more efficient encoding. E-AC-3 can be found in the short-lived HD-DVD format, Blu-ray discs, and as the main surround codec for most streaming services, particularly if Dolby Atmos is used. Contrary to popular belief, E-AC-3 is not backwards compatible with AC-3, rather Dolby mandates that all E-AC-3 decoders can also decode standard AC-3 content. As E-AC-3 is an optional codec on Blu-ray, all discs encoded with E-AC-3 encode the first 5.1 channels as AC-3, with the additional rear channels/Atmos content being encoded as E-AC-3. "),(0,r.kt)("h3",{id:"truehd"},"TrueHD"),(0,r.kt)("p",null,"Dolby\u2019s TrueHD is a lossless multi-channel audio codec based on Meridian\u2019s Lossless Packing (MLP) codec, although the two aren\u2019t compatible with each other. TrueHD is mainly used on Blu-ray and supports Dolby Atmos\u2019s spatial audio data. The TrueHD specification supports up to 16 audio channels (although the Blu-ray specification limits this to 7.1) with a sample rate of 192KHz and a bit depth of 24 bits. As TrueHD is an optional codec on Blu-ray, each TrueHD steam includes a backup AC-3 stream encoded alongside it for compatibility purposes. Since 2010, Dolby TrueHD has seen a decline in usage in favour of DTS-HD Master Audio on Blu-ray discs, but has seen a slight resurgence as the codec used for Dolby Atmos audio, but DTS-HD MA is still more common on non-Atmos titles. "),(0,r.kt)("h3",{id:"ac-4"},"AC-4"),(0,r.kt)("p",null,"To be added."),(0,r.kt)("h3",{id:"atmos"},"Atmos"),(0,r.kt)("p",null,"To be added."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/393be207.75222362.js b/assets/js/393be207.75222362.js deleted file mode 100644 index 2f44086fe..000000000 --- a/assets/js/393be207.75222362.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7414],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});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 p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),l=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(i.Provider,{value:t},e.children)},f="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),f=l(r),s=o,d=f["".concat(i,".").concat(s)]||f[s]||m[s]||a;return r?n.createElement(d,p(p({ref:t},u),{},{components:r})):n.createElement(d,p({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,p=new Array(a);p[0]=s;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[f]="string"==typeof e?e:o,p[1]=c;for(var l=2;l<a;l++)p[l]=r[l];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}s.displayName="MDXCreateElement"},3123:(e,t,r)=>{r.r(t),r.d(t,{contentTitle:()=>p,default:()=>f,frontMatter:()=>a,metadata:()=>c,toc:()=>i});var n=r(7462),o=(r(7294),r(3905));const a={title:"Markdown page example"},p="Markdown page example",c={type:"mdx",permalink:"/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"}},i=[],l={toc:i},u="wrapper";function f(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:"markdown-page-example"},"Markdown page example"),(0,o.kt)("p",null,"You don't need React to write simple standalone pages."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/39634027.231831df.js b/assets/js/39634027.231831df.js new file mode 100644 index 000000000..8a3aacce7 --- /dev/null +++ b/assets/js/39634027.231831df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4100],{5745:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/3ca2a0fe.fa2f2d47.js b/assets/js/3ca2a0fe.fa2f2d47.js deleted file mode 100644 index 8ade6b9f2..000000000 --- a/assets/js/3ca2a0fe.fa2f2d47.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9768],{3905:(e,t,i)=>{i.d(t,{Zo:()=>c,kt:()=>m});var n=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function o(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function r(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?o(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):o(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function s(e,t){if(null==e)return{};var i,n,a=function(e,t){if(null==e)return{};var i,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)i=o[n],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)i=o[n],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var d=n.createContext({}),l=function(e){var t=n.useContext(d),i=t;return e&&(i="function"==typeof e?e(t):r(r({},t),e)),i},c=function(e){var t=l(e.components);return n.createElement(d.Provider,{value:t},e.children)},h="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var i=e.components,a=e.mdxType,o=e.originalType,d=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),h=l(i),u=a,m=h["".concat(d,".").concat(u)]||h[u]||p[u]||o;return i?n.createElement(m,r(r({ref:t},c),{},{components:i})):n.createElement(m,r({ref:t},c))}));function m(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=i.length,r=new Array(o);r[0]=u;var s={};for(var d in t)hasOwnProperty.call(t,d)&&(s[d]=t[d]);s.originalType=e,s[h]="string"==typeof e?e:a,r[1]=s;for(var l=2;l<o;l++)r[l]=i[l];return n.createElement.apply(null,r)}return n.createElement.apply(null,i)}u.displayName="MDXCreateElement"},8042:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=i(7462),a=(i(7294),i(3905));const o={sidebar_position:6},r="High Dynamic Range",s={unversionedId:"introduction/high-dynamic-range",id:"introduction/high-dynamic-range",title:"High Dynamic Range",description:"HDR (High Dynamic Range) is a technology used in modern TVs and displays to produce more vibrant and lifelike images. In simple terms, it allows your TV to display a wider range of colors and brightness levels than standard displays. This means that you can see more details in both bright and dark areas of an image, which can make movies, TV shows, and video games look much more realistic.",source:"@site/docs/introduction/high-dynamic-range.md",sourceDirName:"introduction",slug:"/introduction/high-dynamic-range",permalink:"/docs/introduction/high-dynamic-range",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/high-dynamic-range.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Psycho-visual",permalink:"/docs/introduction/psychovisual"},next:{title:"AAC",permalink:"/docs/audio/AAC"}},d={},l=[{value:"HLG",id:"hlg",level:2},{value:"HDR10",id:"hdr10",level:2},{value:"HDR10+",id:"hdr10-1",level:2},{value:"Dolby Vision",id:"dolby-vision",level:2}],c={toc:l},h="wrapper";function p(e){let{components:t,...i}=e;return(0,a.kt)(h,(0,n.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"high-dynamic-range"},"High Dynamic Range"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"hlg"},"HLG"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"hdr10"},"HDR10"),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"hdr10-1"},"HDR10+"),(0,a.kt)("p",null,"HDR10+ is basically an upgrade to the previous HDR10 by adding dynamic metadata support (in ",(0,a.kt)("inlineCode",{parentName:"p"},".json"),") to optimize each scene's content light level as the director intended."),(0,a.kt)("h2",{id:"dolby-vision"},"Dolby Vision"),(0,a.kt)("p",null,"Dolby Vision is proprietary HDR format developed by Dolby Laboratories and a direct competitor to HDR10+."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3d6cf458.1677af96.js b/assets/js/3d6cf458.1677af96.js new file mode 100644 index 000000000..69f8f5215 --- /dev/null +++ b/assets/js/3d6cf458.1677af96.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6823],{6164:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>u,frontMatter:()=>d,metadata:()=>s,toc:()=>a});var o=i(5893),t=i(1151);const d={label:"VC-1",sidebar_position:8},c="VC-1",s={id:"video/VC-1",title:"VC-1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VC-1.mdx",sourceDirName:"video",slug:"/video/VC-1",permalink:"/docs/video/VC-1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VC-1.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{label:"VC-1",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"AVS3",permalink:"/docs/video/AVS3"},next:{title:"Theora",permalink:"/docs/video/Theora"}},r={},a=[{value:"Encoding",id:"encoding",level:2},{value:"Decoding",id:"decoding",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",p:"p",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"vc-1",children:"VC-1"}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(n.p,{children:["VC-1 is video codec created by Microsoft and released in 2006. It largely aimed to compete with ",(0,o.jsx)(n.a,{href:"/docs/video/AVC",children:"AVC"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,o.jsxs)(n.p,{children:["VC-1 can be contained in ",(0,o.jsx)(n.code,{children:".mp4"}),", ",(0,o.jsx)(n.code,{children:".mkv"}),", and ",(0,o.jsx)(n.code,{children:".avi"})," containers.\nTo be filled"]}),"\n",(0,o.jsx)(n.h2,{id:"decoding",children:"Decoding"}),"\n",(0,o.jsxs)(n.p,{children:["VC-1 can be decoded by ",(0,o.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),", ",(0,o.jsx)(n.a,{href:"/docs/video-players",children:"VLC"}),", ",(0,o.jsx)(n.a,{href:"/docs/video-players",children:"MPV"}),", and any device that supports blu-ray."]})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>c});var o=i(7294);const t={},d=o.createContext(t);function c(e){const n=o.useContext(d);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),o.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43f4d598.c88d96df.js b/assets/js/43f4d598.c88d96df.js deleted file mode 100644 index c1e0e9e6f..000000000 --- a/assets/js/43f4d598.c88d96df.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9087],{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 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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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},u=function(e){var t=p(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)}},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"]),l=p(r),f=o,m=l["".concat(s,".").concat(f)]||l[f]||d[f]||i;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));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 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 p=2;p<i;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},7191:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={label:"FFV1",sidebar_position:12},a="FFV1",c={unversionedId:"video/FFV1",id:"video/FFV1",title:"FFV1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/FFV1.md",sourceDirName:"video",slug:"/video/FFV1",permalink:"/docs/video/FFV1",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/FFV1.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{label:"FFV1",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Theora",permalink:"/docs/video/Theora"},next:{title:"UT Video Codec Suite",permalink:"/docs/video/utvideo"}},s={},p=[],u={toc:p},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:"ffv1"},"FFV1"),(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,"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 ",(0,o.kt)("a",{parentName:"p",href:"/docs/utilities/ffmpeg"},"FFmpeg")," project."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/44ae7035.ddcb322a.js b/assets/js/44ae7035.ddcb322a.js deleted file mode 100644 index 444e23343..000000000 --- a/assets/js/44ae7035.ddcb322a.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 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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=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<a;c++)i[c]=r[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},3065:(e,t,r)=>{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/44e37655.059d6a6b.js b/assets/js/44e37655.059d6a6b.js new file mode 100644 index 000000000..aa14f7617 --- /dev/null +++ b/assets/js/44e37655.059d6a6b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5897],{4319:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var r=i(5893),n=i(1151);const o={label:"SSIMULACRA2",sidebar_position:1},s="SSIMULACRA2",a={id:"metrics/SSIMULACRA2",title:"SSIMULACRA2",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/SSIMULACRA2.mdx",sourceDirName:"metrics",slug:"/metrics/SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIMULACRA2.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"SSIMULACRA2",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIM",permalink:"/docs/metrics/SSIM"},next:{title:"VMAF",permalink:"/docs/metrics/VMAF"}},c={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"ssimulacra2",children:"SSIMULACRA2"}),"\n",(0,r.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,r.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,r.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,r.jsxs)(t.p,{children:["SSIMULACRA 2 is a visual fidelity metric based on the concept of the multi-scale structural similarity index measure (MS-SSIM), computed in a perceptually relevant color space, adding two other (asymmetric) error maps, and aggregating using two different norms. It is currently the most reputable visual quality metric according to its correlation with subjective results, and is considered a very robust means of comparing encoders. It is debatable whether ",(0,r.jsx)(t.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"})," is better for very high fidelity, but SSIMULACRA 2 is considered the best for medium/low fidelity comparisons. Although it does not feature any inter-frame temporal awareness, it is still considered a very strong metric for video fidelity comparison nonetheless."]})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>s});var r=i(7294);const n={},o=r.createContext(n);function s(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46e4c4c4.dfc91d80.js b/assets/js/46e4c4c4.dfc91d80.js deleted file mode 100644 index 6b1722600..000000000 --- a/assets/js/46e4c4c4.dfc91d80.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1034],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});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 o(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 r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,a,i=function(e,t){if(null==e)return{};var n,a,i={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=a.createContext({}),s=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(n),m=i,h=u["".concat(l,".").concat(m)]||u[m]||d[m]||o;return n?a.createElement(h,r(r({ref:t},c),{},{components:n})):a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[u]="string"==typeof e?e:i,r[1]=p;for(var s=2;s<o;s++)r[s]=n[s];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},8290:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var a=n(7462),i=(n(7294),n(3905));const o={title:"VVenC",sidebar_position:9},r="VVenC",p={unversionedId:"encoders/VVenC",id:"encoders/VVenC",title:"VVenC",description:'<img src="https://autumn.revolt.chat/attachments/wU4lo6SU-hRjZSVeqd9vCOeAskthYXmiWHaXUTjyTa/VVenC_Spam.webp"',source:"@site/docs/encoders/VVenC.md",sourceDirName:"encoders",slug:"/encoders/VVenC",permalink:"/docs/encoders/VVenC",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/VVenC.md",tags:[],version:"current",sidebarPosition:9,frontMatter:{title:"VVenC",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"SVT-VP9",permalink:"/docs/encoders/SVT-VP9"},next:{title:"uvg266",permalink:"/docs/encoders/uvg266"}},l={},s=[{value:"Installation",id:"installation",level:2},{value:"FFmpeg Integration",id:"ffmpeg-integration",level:2},{value:"Usage",id:"usage",level:2},{value:"Muxing",id:"muxing",level:2},{value:"VVdeC",id:"vvdec",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Decoding",id:"decoding",level:2}],c={toc:s},u="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"vvenc"},"VVenC"),(0,i.kt)("picture",null,(0,i.kt)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/VVenC_Spam.avif?token=GHSAT0AAAAAACEZPDXI3OYO3Z4Q7LU3Z52EZHY7FMA",type:"image/avif"}),(0,i.kt)("img",{src:"https://autumn.revolt.chat/attachments/wU4lo6SU-hRjZSVeqd9vCOeAskthYXmiWHaXUTjyTa/VVenC_Spam.webp",alt:"vvencapp spamming the terminal output with progress per-picture-order-count cause god knows why",width:"XX",height:"YY",loading:"lazy"})),(0,i.kt)("p",null,"VVenC is an open source command line application for encoding H.266/VVC written in C++ and developed by Fraunhofer Heinrich-Hertz-Institute (HHI)."),(0,i.kt)("admonition",{title:"General support",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"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.")),(0,i.kt)("h2",{id:"installation"},"Installation"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Arch Linux users:")," Check AUR."),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Compilation requires CMake")),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"The following build procedure should work across all common operating systems")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/fraunhoferhhi/vvenc.git\ncd vvenc\nmkdir build\ncd build\ncmake .. -DCMAKE_BUILD_TYPE=Release\ncmake --build .\n")),(0,i.kt)("p",null,"Binaries will be available in ",(0,i.kt)("inlineCode",{parentName:"p"},"bin/release-static/")),(0,i.kt)("h2",{id:"ffmpeg-integration"},"FFmpeg Integration"),(0,i.kt)("p",null,"Although not officially supported, you can compile your own FFmpeg binary with ",(0,i.kt)("inlineCode",{parentName:"p"},"libvvenc")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"libvvdec"),". The tutorial can be found in the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fraunhoferhhi/vvenc/wiki/FFmpeg-Integration"},"official VVenC wiki")," (",(0,i.kt)("a",{parentName:"p",href:"https://web.archive.org/web/20230509115800/https://github.com/fraunhoferhhi/vvenc/wiki/FFmpeg-Integration"},"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."),(0,i.kt)("h2",{id:"usage"},"Usage"),(0,i.kt)("p",null,"There are two encoders, the simple encoder (",(0,i.kt)("inlineCode",{parentName:"p"},"vvencapp"),") and the full-featured expert mode encoder (",(0,i.kt)("inlineCode",{parentName:"p"},"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)"),(0,i.kt)("p",null,"!!! YUV vs Y4M\nYUV 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\n!!!"),(0,i.kt)("p",null,"A standard input would look like this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"vvencapp -i input.y4m --qp 20 -o output.266\n")),(0,i.kt)("p",null,"Enhanced, preset slow + qpa + YUV420P10:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"vvencapp -i input.y4m --preset slow --qpa on --qp 20 -c yuv420_10 -o output.266\n")),(0,i.kt)("p",null,"With FFmpeg piping:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"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\n")),(0,i.kt)("admonition",{type:"danger"},(0,i.kt)("p",{parentName:"admonition"},"For whatever reason, VVenC currently does not support input resolutions below 540p. Don't know why so ask the devs.")),(0,i.kt)("admonition",{title:"QPA",type:"info"},(0,i.kt)("p",{parentName:"admonition"},'VVenC by default operates with QP (Quantization Parameter), which is basically fixed quality. To enable "CRF-like" mode you need to enable QPA'),(0,i.kt)("p",{parentName:"admonition"},"note for nerds: it modifies the QP both in a spatial and temporal manner combined with temporal RDO.")),(0,i.kt)("h2",{id:"muxing"},"Muxing"),(0,i.kt)("p",null,"Since VVenC only outputs raw ",(0,i.kt)("inlineCode",{parentName:"p"},".266")," bitstream files, you can't just shove audio and subtitle streams in there. Instead you can remux them using ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/gpac/gpac"},"GPAC MP4Box")," ",(0,i.kt)("strong",{parentName:"p"},"nightly/beta/git"),". "),(0,i.kt)("p",null,"You can find all pre-built binaries for Windows, MacOS, and Ubuntu (Linux) right ",(0,i.kt)("a",{parentName:"p",href:"https://gpac.wp.imt.fr/downloads/gpac-nightly-builds"},"here"),", Arch Linux users can find mp4box/GPAC in the AUR, and those who aren't listed here can find the build instructions ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/gpac/gpac/wiki/Build-Introduction"},"here"),". It is recommended to do a minimal build since most of the time you don't really need the extra stuff."),(0,i.kt)("h2",{id:"vvdec"},"VVdeC"),(0,i.kt)("p",null,"VVdeC is the software decoding implementation for decoding/playing VVC files developed by Fraunhofer HHI. All features of the VVC Main10 features are supported."),(0,i.kt)("h3",{id:"installation-1"},"Installation"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Arch Linux users:")," Check AUR."),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Compilation requires CMake")),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"The following build procedure should work across all common operating systems")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/fraunhoferhhi/vvdec.git\ncd vvdec\nmkdir build\ncd build\ncmake .. -DCMAKE_BUILD_TYPE=Release\ncmake --build .\n")),(0,i.kt)("p",null,"Binaries will be available in ",(0,i.kt)("inlineCode",{parentName:"p"},"bin/release-static/")),(0,i.kt)("h2",{id:"decoding"},"Decoding"),(0,i.kt)("p",null,"There are several ways to decode VVC. One of them made simple by the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/MartinEesmaa/VVCEasy"},"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"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"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 -\n")),(0,i.kt)("p",null,"Adjust the ",(0,i.kt)("strong",{parentName:"p"},"double")," ",(0,i.kt)("inlineCode",{parentName:"p"},"input.mp4"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"-video_size")," for resolution, ",(0,i.kt)("inlineCode",{parentName:"p"},"-framerate"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"-pixel_format"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"mpv")," (Video player) accordingly, if not then your video will just play garbled glitches."),(0,i.kt)("admonition",{title:"temp.266",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"You might see a new file appearing called ",(0,i.kt)("inlineCode",{parentName:"p"},"temp.266")," upon running the command, do not panic. This is completely normal as ",(0,i.kt)("inlineCode",{parentName:"p"},"mp4box")," needs to output the raw bitstream so ",(0,i.kt)("inlineCode",{parentName:"p"},"vvdec")," will be able to decode it properly.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4972.8e6573e9.js b/assets/js/4972.8e6573e9.js deleted file mode 100644 index 08a9357bb..000000000 --- a/assets/js/4972.8e6573e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4972],{4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(7294),l=n(5999),o=n(1944),r=n(7961);function i(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"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/assets/js/49b64d14.4b1ae0c0.js b/assets/js/49b64d14.4b1ae0c0.js new file mode 100644 index 000000000..078a52aa3 --- /dev/null +++ b/assets/js/49b64d14.4b1ae0c0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4931],{9530:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var s=n(5893),t=n(1151);const o={label:"SVT-AV1",sidebar_position:4},r="SVT-AV1",c={id:"encoders/SVT-AV1",title:"SVT-AV1",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/SVT-AV1.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-AV1",permalink:"/docs/encoders/SVT-AV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"SVT-AV1",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"vpxenc",permalink:"/docs/encoders/vpxenc"},next:{title:"rav1e",permalink:"/docs/encoders/rav1e"}},a={},l=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Building",id:"building",level:2},{value:"(Linux/macOS)",id:"linuxmacos",level:3},{value:"Windows",id:"windows",level:3},{value:"Encoding",id:"encoding",level:2},{value:"Strengths",id:"strengths",level:3},{value:"Weaknesses",id:"weaknesses",level:3},{value:"Encoder Optimization",id:"encoder-optimization",level:3}];function d(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"svt-av1",children:"SVT-AV1"}),"\n",(0,s.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsx)(i.p,{children:"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."}),"\n",(0,s.jsxs)(i.p,{children:['This entry discusses the SVT-AV1 encoder, also known as the "Production" AV1 encoder (while ',(0,s.jsx)(i.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),' is the "reference" AV1 encoder), & refers to SVT-AV1 as such. SVT-AV1 is known for its parallelization, high coding efficiency, & active development. SVT-AV1 scales across multiple CPU cores much more effectively than aomenc or ',(0,s.jsx)(i.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", so the use of tools like ",(0,s.jsx)(i.a,{href:"/docs/utilities/av1an",children:"Av1an"})," is less helpful."]}),"\n",(0,s.jsx)(i.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(i.p,{children:["SVT-AV1 is available in FFmpeg via ",(0,s.jsx)(i.code,{children:"libsvtav1"}),", to check if you have it, run ",(0,s.jsx)(i.code,{children:"ffmpeg -h encoder=libsvtav1"}),". You can input non-FFmpeg standard SVT-AV1 parameters via ",(0,s.jsx)(i.code,{children:"-svtav1-params"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"building",children:"Building"}),"\n",(0,s.jsx)(i.h3,{id:"linuxmacos",children:"(Linux/macOS)"}),"\n",(0,s.jsx)(i.p,{children:"To build SVT-AV1 from source, clone the official SVT-AV1 repository from Gitlab & build from source."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh release\n"})}),"\n",(0,s.jsxs)(i.p,{children:["The compiled binaries will be in the Bin/Release directory, including SvtAv1EncApp. You can also add the ",(0,s.jsx)(i.code,{children:"no-dec"})," flag to skip building SvtAv1DecApp if you don't need it to save on some compilation time."]}),"\n",(0,s.jsxs)(i.p,{children:["If you'd like to build from the latest release (1.7.0 at the time of writing) please do ",(0,s.jsx)(i.code,{children:"git reset --hard 6d5f2b4e1f04db677cdd4ab2b0d6831ab06a849c"})," in the cloned directory. It is recommended that you do this, as new changes to git aren't always stable right away & a release will guarantee more stability."]}),"\n",(0,s.jsxs)(i.p,{children:["If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,s.jsxs)(i.strong,{children:["Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,s.jsx)(i.code,{children:"/dev/shm"})," for transcoding"]}),". You can compile statically linked SVT-AV1 with PGO by following this script:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n"})}),"\n",(0,s.jsx)(i.p,{children:"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n"})}),"\n",(0,s.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,s.jsx)(i.p,{children:"To be filled."}),"\n",(0,s.jsx)(i.h2,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsx)(i.h3,{id:"strengths",children:"Strengths"}),"\n",(0,s.jsx)(i.p,{children:"SVT-AV1's greatest strength is its parallelization capability, where it outclasses other AV1 encoders by a significant margin. SVT-AV1's parallelization techniques do not involve tiling & don't harm video quality, & can comfortably utilize up to 16 cores given 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."}),"\n",(0,s.jsx)(i.h3,{id:"weaknesses",children:"Weaknesses"}),"\n",(0,s.jsxs)(i.p,{children:["SVT-AV1 is strongest on x86 CPUs, & while ARM NEON assembly is ",(0,s.jsx)(i.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/ba13fac241f1b54954935f2cb200efc07f3de13a",children:"available"})," from latest git, SVT-AV1 still underperforms on ARM. For this reason, it is not a good cross-architecture CPU benchmark. SVT-AV1's support for various AV1 features is also limited; it only supports up to 4:2:0 chroma subsampling with no support for 12-bit color, and it does not support scene change detection (there are no plans to implement this, either)."]}),"\n",(0,s.jsx)(i.h3,{id:"encoder-optimization",children:"Encoder Optimization"}),"\n",(0,s.jsxs)(i.p,{children:["Aside from build optimizations for speed, there is further tweaking to be done to the ",(0,s.jsx)(i.code,{children:"SvtAv1EncApp"})," binary parameters when encoding."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"--film-grain"})," & ",(0,s.jsx)(i.code,{children:"--film-grain-denoise"})]}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["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 ",(0,s.jsx)(i.code,{children:"--film-grain"})," parameter to specify an amount of film grain to add to the encode (& ",(0,s.jsx)(i.code,{children:"--film-grain-denoise"})," to specify how to denoise the input video before encoding for potentially better appeal). Denoising a video always removes fine details, so sticking with just ",(0,s.jsx)(i.code,{children:"--film-grain"})," is recommended in most cases. According to ",(0,s.jsx)(i.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#practical-advice-on-grain-synthesis",children:"SVT-AV1 documentation"}),", a level of 8 should be used for live-action content with a normal amount of grain while a level of 4 works well for hand-drawn animation or other smoother-looking sources that still stand to benefit from some grain synthesis."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"--input-depth 10"})}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"10-bit output from AV1 encoding is always desirable for coding efficiency, even if your source is 8-bit."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"--tune 2"})}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["There are three tunes in SVT-AV1: Tune 1 is for ",(0,s.jsx)(i.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," ",(0,s.jsx)(i.a,{href:"/docs/introduction/psychovisual",children:"RDO"}),", Tune 2 is for ",(0,s.jsx)(i.a,{href:"/docs/metrics/SSIM",children:"SSIM"})," RDO, & Tune 0 is a ",(0,s.jsx)(i.a,{href:"/docs/introduction/psychovisual",children:"psychovisual"})," tune labeled VQ. It has been common practice to lean away from the PSNR tune, as it is not designed for visual quality but rather to perform better on the PSNR metric which is widely considered to be inconsistent with our human perception of fidelity. Using the VQ tune is a safe bet for now, but many believe the newer SSIM tune provides better visual fidelity. This is anecdotal, & has yet to be meaningfully proven"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"--enable-overlays 1"})}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Enables overlay pictures to be used as additional reference frames for the referenced picture, disabled by default. Improves coding efficiency."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"--keyint [FPS*10]"})}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["Similar to ",(0,s.jsx)(i.code,{children:"--kf-max-dist"})," in ",(0,s.jsx)(i.a,{href:"/docs/encoders/vpxenc",children:"vpxenc"}),", this tells the encoder when to place keyframes. Because SVT-AV1 doesn't have scene detection, this isn't the maximum distance between keyframes, but rather a fixed interval for placing keyframes."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"--irefresh-type 2"})}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["Intra refresh is specified through this option, & lets the user decide between Closed GOP & Open GOP. GOP stands for Group of Pictures. Open GOP allows GOPs to ",(0,s.jsx)(i.a,{href:"https://ottverse.com/closed-gop-open-gop-idr/",children:"reference one another"}),", but support for this feature is currently incomplete. Therefore, it is recommended to use Closed GOP for the time being via ",(0,s.jsx)(i.code,{children:"--irefresh-type 2"})," until this is rectified."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"--preset X"})}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"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."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"--crf X"})}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"CRF is the best way to target quality for optimal visual fidelity. VBR & CBR lose efficiency due to their inherently limited rate control."})]})}function h(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>r});var s=n(7294);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4b506820.cf255d72.js b/assets/js/4b506820.cf255d72.js deleted file mode 100644 index 46e980fbb..000000000 --- a/assets/js/4b506820.cf255d72.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[837],{3905:(t,e,o)=>{o.d(e,{Zo:()=>c,kt:()=>f});var i=o(7294);function r(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}function n(t,e){var o=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),o.push.apply(o,i)}return o}function a(t){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{};e%2?n(Object(o),!0).forEach((function(e){r(t,e,o[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(o,e))}))}return t}function l(t,e){if(null==t)return{};var o,i,r=function(t,e){if(null==t)return{};var o,i,r={},n=Object.keys(t);for(i=0;i<n.length;i++)o=n[i],e.indexOf(o)>=0||(r[o]=t[o]);return r}(t,e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);for(i=0;i<n.length;i++)o=n[i],e.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(t,o)&&(r[o]=t[o])}return r}var s=i.createContext({}),u=function(t){var e=i.useContext(s),o=e;return t&&(o="function"==typeof t?t(e):a(a({},e),t)),o},c=function(t){var e=u(t.components);return i.createElement(s.Provider,{value:e},t.children)},p="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return i.createElement(i.Fragment,{},e)}},m=i.forwardRef((function(t,e){var o=t.components,r=t.mdxType,n=t.originalType,s=t.parentName,c=l(t,["components","mdxType","originalType","parentName"]),p=u(o),m=r,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||n;return o?i.createElement(f,a(a({ref:e},c),{},{components:o})):i.createElement(f,a({ref:e},c))}));function f(t,e){var o=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var n=o.length,a=new Array(n);a[0]=m;var l={};for(var s in e)hasOwnProperty.call(e,s)&&(l[s]=e[s]);l.originalType=t,l[p]="string"==typeof t?t:r,a[1]=l;for(var u=2;u<n;u++)a[u]=o[u];return i.createElement.apply(null,a)}return i.createElement.apply(null,o)}m.displayName="MDXCreateElement"},3376:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var i=o(7462),r=(o(7294),o(3905));const n={label:"MKVToolNix",sidebar_position:2},a="MKVToolNix",l={unversionedId:"utilities/MKVToolNix",id:"utilities/MKVToolNix",title:"MKVToolNix",description:"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.",source:"@site/docs/utilities/MKVToolNix.md",sourceDirName:"utilities",slug:"/utilities/MKVToolNix",permalink:"/docs/utilities/MKVToolNix",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/MKVToolNix.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"MKVToolNix",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Av1an",permalink:"/docs/utilities/av1an"},next:{title:"rAV1ator",permalink:"/docs/utilities/rAV1ator"}},s={},u=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Tips and tricks",id:"tips-and-tricks",level:2}],c={toc:u},p="wrapper";function d(t){let{components:e,...o}=t;return(0,r.kt)(p,(0,i.Z)({},c,o,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"mkvtoolnix"},"MKVToolNix"),(0,r.kt)("p",null,"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."),(0,r.kt)("picture",null,(0,r.kt)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/mkvtoolnix-gui-workload.avif",type:"image/avif"}),(0,r.kt)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/mkvtoolnix-gui-workload.webp",alt:"MKVToolNix Workload"})),(0,r.kt)("h2",{id:"installation"},"Installation"),(0,r.kt)("p",null,"Fortunately, Moritz Bunkus (Creator) is sane enough to provide downloads for pretty much all popular desktop operating systems."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows & Mac: ",(0,r.kt)("a",{parentName:"li",href:"https://mkvtoolnix.download/downloads.html"},"MKVToolNix site"),"."),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://flathub.org/apps/org.bunkus.mkvtoolnix-gui"},"Install as a Flatpak")," or check your package manager.")),(0,r.kt)("h2",{id:"usage"},"Usage"),(0,r.kt)("p",null,'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.'),(0,r.kt)("h2",{id:"tips-and-tricks"},"Tips and tricks"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"You can import unencrypted BDMV (",(0,r.kt)("inlineCode",{parentName:"li"},"index.bdmv"),") or Blu-ray playlist files into MKVToolNix and it will prompt you to select which stream you would want to import."),(0,r.kt)("li",{parentName:"ol"},'You can set a WebM output in Output > Miscellaneous > "Create WebM compliant file"'),(0,r.kt)("li",{parentName:"ol"},"You can split videos in multiple ways in Output > Splitting. Best of all? No freeze frames unlike in FFmpeg and no re-encoding required."),(0,r.kt)("li",{parentName:"ol"},'You can edit metadata without remuxing (Albeit rather limited) in the "Header Editor".')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4c678320.68537f8d.js b/assets/js/4c678320.68537f8d.js new file mode 100644 index 000000000..a1369bdd1 --- /dev/null +++ b/assets/js/4c678320.68537f8d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3134],{4518:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>i});var o=t(5893),a=t(1151);const r={title:"Markdown page example"},s="Markdown page example",c={type:"mdx",permalink:"/markdown-page",source:"@site/src/pages/markdown-page.mdx",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"},unlisted:!1},p={},i=[];function d(e){const n={h1:"h1",p:"p",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"}),"\n",(0,o.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(7294);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d465a8d.f78a5eef.js b/assets/js/4d465a8d.f78a5eef.js deleted file mode 100644 index 84e0f7795..000000000 --- a/assets/js/4d465a8d.f78a5eef.js +++ /dev/null @@ -1 +0,0 @@ -"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<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,i=function(e,t){if(null==e)return{};var a,n,i={},r=Object.keys(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=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<r;m++)o[m]=a[m];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},8917:(e,t,a)=>{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/4edf0cfc.1d3b7d8f.js b/assets/js/4edf0cfc.1d3b7d8f.js deleted file mode 100644 index 0c579e09e..000000000 --- a/assets/js/4edf0cfc.1d3b7d8f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7473],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}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)},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,i=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),f=i,m=u["".concat(l,".").concat(f)]||u[f]||d[f]||o;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,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:i,a[1]=s;for(var c=2;c<o;c++)a[c]=r[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},101:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var n=r(7462),i=(r(7294),r(3905));const o={label:"rAV1ator",sidebar_position:2},a="rAV1ator",s={unversionedId:"utilities/rAV1ator",id:"utilities/rAV1ator",title:"rAV1ator",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/utilities/rAV1ator.md",sourceDirName:"utilities",slug:"/utilities/rAV1ator",permalink:"/docs/utilities/rAV1ator",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rAV1ator.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"rAV1ator",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"MKVToolNix",permalink:"/docs/utilities/MKVToolNix"},next:{title:"FFMetrics",permalink:"/docs/utilities/FFMetrics"}},l={},c=[],p={toc:c},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:"rav1ator"},"rAV1ator"),(0,i.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,i.kt)("p",null,"rAV1ator is a fork of ",(0,i.kt)("a",{parentName:"p",href:"/docs/utilities/Aviator"},"Aviator")," designed to use ",(0,i.kt)("a",{parentName:"p",href:"/docs/utilities/av1an"},"Av1an")," & ",(0,i.kt)("a",{parentName:"p",href:"/docs/encoders/rav1e"},"rav1e")," instead of ",(0,i.kt)("a",{parentName:"p",href:"/docs/encoders/SVT-AV1"},"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:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"flatpak --user remote-add --no-gpg-verify project-volo https://giannirosato.com/repo && flatpak --user install project-volo net.natesales.rAV1ator\n")),(0,i.kt)("p",null,"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 ",(0,i.kt)("em",{parentName:"p"},"specifically")," Av1an & rav1e easier for interested codec enthusiasts. rAV1ator is actively maintained by Gianni Rosato & Trix."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4f425cbc.55a3327c.js b/assets/js/4f425cbc.55a3327c.js deleted file mode 100644 index 7556f3212..000000000 --- a/assets/js/4f425cbc.55a3327c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8007],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,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 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 o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(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)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(r),m=i,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||a;return r?n.createElement(f,o(o({ref:t},c),{},{components:r})):n.createElement(f,o({ref:t},c))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:i,o[1]=l;for(var u=2;u<a;u++)o[u]=r[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},1009:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>u});var n=r(7462),i=(r(7294),r(3905));const a={title:"SRT"},o="SRT",l={unversionedId:"subtitles/SRT",id:"subtitles/SRT",title:"SRT",description:"SubRip Text (SRT) is a text format for subtitles, described as 'the most basic of all subtitle formats'. SRT files are plain text with the extension .srt.",source:"@site/docs/subtitles/SRT.md",sourceDirName:"subtitles",slug:"/subtitles/SRT",permalink:"/docs/subtitles/SRT",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/SRT.md",tags:[],version:"current",frontMatter:{title:"SRT"},sidebar:"tutorialSidebar",previous:{title:"JM",permalink:"/docs/encoders/JM"},next:{title:"WebVTT",permalink:"/docs/subtitles/webvtt"}},s={},u=[{value:"Format",id:"format",level:2},{value:"Unoffical features",id:"unoffical-features",level:3},{value:"Example",id:"example",level:2}],c={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,i.kt)(p,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"srt"},"SRT"),(0,i.kt)("p",null,"SubRip Text (SRT) is a text format for subtitles, described as 'the most basic of all subtitle formats'. SRT files are plain text with the extension ",(0,i.kt)("inlineCode",{parentName:"p"},".srt"),"."),(0,i.kt)("h2",{id:"format"},"Format"),(0,i.kt)("p",null,"Subtitles are placed into sequentially ordered groups, with a starting and ending timestamp, encoded ",(0,i.kt)("inlineCode",{parentName:"p"},"hours:minutes:seconds,milliseconds"),". Note the seperator for the millisecond value is a comma. The starting and ending value are seperated by ",(0,i.kt)("inlineCode",{parentName:"p"},"--\x3e"),"."),(0,i.kt)("h3",{id:"unoffical-features"},"Unoffical features"),(0,i.kt)("p",null,"Some basic HTML tags are supported by some viewers, such as:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"<b>bold</b>")," ",(0,i.kt)("strong",{parentName:"li"},"bold")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"<i>italics</i>")," ",(0,i.kt)("em",{parentName:"li"},"italics")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"<u></u>")," underlined"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'<font color="#0000FF">Blue</font>')," colored text.")),(0,i.kt)("p",null,"Note these will be displayed verbatim on viewers that don't support these features."),(0,i.kt)("h2",{id:"example"},"Example"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"1\n00:00:00,000 --\x3e 00:01:00,000\nThis subtitle will be visible for the first minute of the stream\n\n2\n00:01:00,000 --\x3e 00:01:30,000\nand this one for thirty seconds after that.\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/50cc20ba.6bd658ab.js b/assets/js/50cc20ba.6bd658ab.js deleted file mode 100644 index a9cc51cb0..000000000 --- a/assets/js/50cc20ba.6bd658ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6997],{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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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)}},f=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),f=o,m=l["".concat(s,".").concat(f)]||l[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 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<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},5579:(e,t,r)=>{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={title:"SVT-HEVC",sidebar_position:7},a="SVT-HEVC",c={unversionedId:"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!",source:"@site/docs/encoders/SVT-HEVC.md",sourceDirName:"encoders",slug:"/encoders/SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-HEVC.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"SVT-HEVC",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Kvazaar",permalink:"/docs/encoders/Kvazaar"},next:{title:"SVT-VP9",permalink:"/docs/encoders/SVT-VP9"}},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:"svt-hevc"},"SVT-HEVC"),(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/548450a9.cc908fb2.js b/assets/js/548450a9.cc908fb2.js deleted file mode 100644 index f704b3c97..000000000 --- a/assets/js/548450a9.cc908fb2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9510],{3905:(e,t,i)=>{i.d(t,{Zo:()=>c,kt:()=>u});var n=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function o(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function r(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?o(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):o(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function s(e,t){if(null==e)return{};var i,n,a=function(e,t){if(null==e)return{};var i,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)i=o[n],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)i=o[n],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):r(r({},t),e)),i},c=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var i=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=p(i),d=a,u=m["".concat(l,".").concat(d)]||m[d]||h[d]||o;return i?n.createElement(u,r(r({ref:t},c),{},{components:i})):n.createElement(u,r({ref:t},c))}));function u(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=i.length,r=new Array(o);r[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:a,r[1]=s;for(var p=2;p<o;p++)r[p]=i[p];return n.createElement.apply(null,r)}return n.createElement.apply(null,i)}d.displayName="MDXCreateElement"},8214:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=i(7462),a=(i(7294),i(3905));const o={label:"AVIF",sidebar_position:6},r="AVIF",s={unversionedId:"images/AVIF",id:"images/AVIF",title:"AVIF",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/images/AVIF.md",sourceDirName:"images",slug:"/images/AVIF",permalink:"/docs/images/AVIF",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/AVIF.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"AVIF",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"JPEG 2000",permalink:"/docs/images/JPEG2000"},next:{title:"JPEG-XL",permalink:"/docs/images/JXL"}},l={},p=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Pros",id:"pros",level:2},{value:"Cons",id:"cons",level:2},{value:"Conclusion",id:"conclusion",level:2}],c={toc:p},m="wrapper";function h(e){let{components:t,...i}=e;return(0,a.kt)(m,(0,n.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"avif"},"AVIF"),(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)("p",null,"AVIF, which stands for AV1 Image File Format, is a newer image codec that is based on the ",(0,a.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"AV1")," video codec. AVIF supersedes ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/HEIC"},"HEIC"),", & uses the same HEIF container as HEIC. AVIF is designed to have a better featureset & better general lossy compression than older image codecs, including ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/WebP"},"WebP"),", HEIC, & ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/JPEG"},"JPEG"),". AVIF is often compared to ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/JXL"},"JPEG-XL"),", though in practice, the two have very different strengths."),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"performance-checklist"},"Performance Checklist"),(0,a.kt)("p",null,"Lossless? ",(0,a.kt)("em",{parentName:"p"},"Poorly")),(0,a.kt)("p",null,"Lossy? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(0,a.kt)("p",null,"Supported Bit Depths:\n",(0,a.kt)("em",{parentName:"p"},"8 BPC, 10 BPC, 12 BPC")),(0,a.kt)("p",null,"HDR/Wide Gamut? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(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")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Compatible Browsers")," (full support)"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("a",{parentName:"p",href:"https://www.google.com/chrome/"},"Google Chrome")," 85+")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("a",{parentName:"p",href:"https://www.apple.com/safari/"},"Safari")," 16.4+")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("a",{parentName:"p",href:"https://www.mozilla.org/en-US/firefox/new/"},"Firefox")," 113+")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("a",{parentName:"p",href:"https://www.opera.com/"},"Opera")," 71+")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("a",{parentName:"p",href:"https://apps.gnome.org/app/org.gnome.Epiphany/"},"GNOME Web"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("a",{parentName:"p",href:"https://thorium.rocks/"},"Thorium"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("a",{parentName:"p",href:"https://thorium.rocks/mercury"},"Mercury")))),(0,a.kt)("h2",{id:"pros"},"Pros"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"cons"},"Cons"),(0,a.kt)("p",null,"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:"),(0,a.kt)("details",null,(0,a.kt)("summary",null,"AVIF Encoding with aomenc through avifenc"),(0,a.kt)("div",null,(0,a.kt)("p",null,"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders."),(0,a.kt)("p",null,"A sample command for encoding AVIF looks like this:"),(0,a.kt)("pre",null,(0,a.kt)("code",null,"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif")),(0,a.kt)("p",null,"Where:"),(0,a.kt)("ul",null,(0,a.kt)("li",null,"`-c aom` is the encoder"),(0,a.kt)("li",null,"`-s 4` is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."),(0,a.kt)("li",null,"`-j 8` is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't paralellize perfectly. Test using a speed benchmark to verify which value works best for you."),(0,a.kt)("li",null,"`-d 10` is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8 bit source image."),(0,a.kt)("li",null,"`-y 444` is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."),(0,a.kt)("li",null,"`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."),(0,a.kt)("li",null,"`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.")))),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"Finally, AVIF's lossless mode is incredibly underwhelming, often producing larger files than PNG. When compressing losslessly, avoid AVIF entirely."),(0,a.kt)("h2",{id:"conclusion"},"Conclusion"),(0,a.kt)("p",null,"While AVIF is certainly promising, its shortcomings"))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/54a9c2bb.c791b09d.js b/assets/js/54a9c2bb.c791b09d.js new file mode 100644 index 000000000..02e23daa0 --- /dev/null +++ b/assets/js/54a9c2bb.c791b09d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6027],{4239:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>u});var n=i(5893),o=i(1151);const s={label:"YUView",sidebar_position:4},r="YUView",c={id:"utilities/YUView",title:"YUView",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/YUView.mdx",sourceDirName:"utilities",slug:"/utilities/YUView",permalink:"/docs/utilities/YUView",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/YUView.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"YUView",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"FFMetrics",permalink:"/docs/utilities/FFMetrics"},next:{title:"rAV1ator CLI",permalink:"/docs/utilities/rav1ator-cli"}},a={},u=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"yuview",children:"YUView"}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>c,a:()=>r});var n=i(7294);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5525.56b09b9b.js b/assets/js/5525.56b09b9b.js new file mode 100644 index 000000000..45d341635 --- /dev/null +++ b/assets/js/5525.56b09b9b.js @@ -0,0 +1 @@ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5525],{5525:()=>{}}]); \ No newline at end of file diff --git a/assets/js/56786013.f74f7b24.js b/assets/js/56786013.f74f7b24.js new file mode 100644 index 000000000..bf546add8 --- /dev/null +++ b/assets/js/56786013.f74f7b24.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6647],{3495:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var s=n(5893),t=n(1151);const o={label:"JPEG",sidebar_position:1},r="JPEG",a={id:"images/JPEG",title:"JPEG",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/images/JPEG.mdx",sourceDirName:"images",slug:"/images/JPEG",permalink:"/docs/images/JPEG",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"JPEG",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Zstandard",permalink:"/docs/data/zstd"},next:{title:"PNG",permalink:"/docs/images/PNG"}},c={},l=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Compression",id:"compression",level:2},{value:"Color Space Conversion",id:"color-space-conversion",level:4},{value:"Image Tiling",id:"image-tiling",level:4},{value:"Discrete Cosine Transform (DCT)",id:"discrete-cosine-transform-dct",level:4},{value:"Quantization",id:"quantization",level:4},{value:"Zigzag Scanning",id:"zigzag-scanning",level:4},{value:"Run-Length Encoding",id:"run-length-encoding",level:4},{value:"Entropy Encoding",id:"entropy-encoding",level:4},{value:"Saving the File",id:"saving-the-file",level:4},{value:"Decoding",id:"decoding",level:4}];function d(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",h4:"h4",p:"p",strong:"strong",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"jpeg",children:"JPEG"}),"\n",(0,s.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,s.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,s.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,s.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,s.jsx)(i.p,{children:"JPEG (Joint Photographic Experts Group) compression is a widely used method for reducing the size of digital images while preserving visual quality. It's based on the principles of lossy compression, which means that some image data is discarded to achieve a smaller filesize."}),"\n",(0,s.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,s.jsxs)(i.p,{children:["Lossless? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Lossy? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Supported Bit Depth:\n",(0,s.jsx)(i.em,{children:"8 BPC"})]}),"\n",(0,s.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,s.jsx)(i.em,{children:"Kinda"})]}),"\n",(0,s.jsxs)(i.p,{children:["Animation? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Transparency? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Progressive Decode? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Royalty Free? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsx)(i.h2,{id:"compression",children:"Compression"}),"\n",(0,s.jsx)(i.p,{children:"Learning how JPEG compresses images is immensely helpful for understanding how other compression methods work in other codecs. It is definitely worth reading to get a useful background in understanding concepts like entropy coding, the DCT, and color spaces other than RGB. Here's a step-by-step explanation of how JPEG compression works:"}),"\n",(0,s.jsx)(i.h4,{id:"color-space-conversion",children:"Color Space Conversion"}),"\n",(0,s.jsxs)(i.p,{children:["Most digital images are originally in the RGB (Red, Green, Blue) color space. The first step in JPEG compression is to convert the image to the YCbCr color space. Y represents the luminance (brightness), while Cb and Cr represent the chrominance (color information). The Cb & Cr components are subsampled to a quarter of the resolution of the original image, meaning the resulting color space is chroma subsampled with ",(0,s.jsx)(i.em,{children:"4:2:0"})," subsampling."]}),"\n",(0,s.jsx)(i.h4,{id:"image-tiling",children:"Image Tiling"}),"\n",(0,s.jsx)(i.p,{children:"The image is divided into smaller blocks or tiles, typically 8x8 pixels each. Each of these blocks will be processed separately."}),"\n",(0,s.jsx)(i.h4,{id:"discrete-cosine-transform-dct",children:"Discrete Cosine Transform (DCT)"}),"\n",(0,s.jsx)(i.p,{children:"For each 8x8 block, a mathematical transformation called the Discrete Cosine Transform is applied. This transformation converts the pixel values into a set of frequency components, taking spatial data and transforming it to the frequency domain. The DCT is applied to each color channel in the YCbCr color space. This algorithm is a particularly good choice for image (and music/speech) compression because it has high energy compaction relative to our understanding of images & their perceptual quality. High energy compaction means the DCT is able to represent a signal with a small number of significant coefficients, in this case mainly in the lower frequencies."}),"\n",(0,s.jsx)(i.h4,{id:"quantization",children:"Quantization"}),"\n",(0,s.jsx)(i.p,{children:'After the DCT, the frequencies are quantized in a table representing frequency coefficients & their corresponding frequencies. Less perceptually important details can be omitted to reduce filesize by discarding coefficients in the table that correspond to less visually salient frequencies. This is "lossy" compression, and is the key step in achieving a high compression ratio while still maintaining an image that looks reasonable. The quantization table used in this step can vary in the number of frequencies it attempts to retain, affecting the trade-off between compression & image quality.'}),"\n",(0,s.jsx)(i.h4,{id:"zigzag-scanning",children:"Zigzag Scanning"}),"\n",(0,s.jsx)(i.p,{children:"The quantized coefficients are then reordered using a zigzag pattern. This is done to prepare the data for the next step."}),"\n",(0,s.jsx)(i.h4,{id:"run-length-encoding",children:"Run-Length Encoding"}),"\n",(0,s.jsx)(i.p,{children:"The zigzag-ordered coefficients are run-length encoded. This means that sequences of zeroes are compressed into a shorter representation. For example, if there are many consecutive zeroes in the data, they can be represented as (0, 10) instead of listing ten individual zeroes."}),"\n",(0,s.jsx)(i.h4,{id:"entropy-encoding",children:"Entropy Encoding"}),"\n",(0,s.jsx)(i.p,{children:"The run-length encoded data is further compressed using entropy encoding. JPEG uses Huffman coding, which assigns shorter codes to more frequently occurring values in the table of DCT coefficients, reducing the overall file size."}),"\n",(0,s.jsx)(i.h4,{id:"saving-the-file",children:"Saving the File"}),"\n",(0,s.jsx)(i.p,{children:"The compressed luminance and chrominance data, along with information about color space conversion, quantization tables, and EXIF data, are saved in the JPEG file format."}),"\n",(0,s.jsx)(i.h4,{id:"decoding",children:"Decoding"}),"\n",(0,s.jsx)(i.p,{children:"When you open a JPEG image, the reverse process occurs. The file is decoded, and the DCT coefficients are dequantized, the inverse DCT is applied, and the image is converted back to the RGB color space to be displayed on a screen."}),"\n",(0,s.jsxs)(i.p,{children:["It's important to note that JPEG compression is ",(0,s.jsx)(i.em,{children:(0,s.jsx)(i.strong,{children:"lossy"})}),", meaning that some image quality is discarded in the pursuit of smaller file sizes. This makes it different than codecs designed for lossless compression like ",(0,s.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"}),", ",(0,s.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"}),"'s lossless mode, and ",(0,s.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),"'s lossless mode. The degree of compression and the quality of the compressed image can be adjusted through settings when saving a JPEG, allowing for a trade-off between file size & image fidelity."]}),"\n",(0,s.jsxs)(i.p,{children:["While JPEG is certainly not the most state of the art lossy image codec compared to its newer and (usually) better successors like JPEG-XL (an actual direct successor) & ",(0,s.jsx)(i.a,{href:"/docs/images/AVIF",children:"AVIF"}),", it enjoys near universal compatibility with (likely) most utilities you would work with in your everyday life that have anything to do with images."]})]})}function h(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(7294);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/56ac595f.fd0ef8cd.js b/assets/js/56ac595f.fd0ef8cd.js deleted file mode 100644 index df53e74bc..000000000 --- a/assets/js/56ac595f.fd0ef8cd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7363],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(7294);function r(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 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<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=u(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)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(a),m=r,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||i;return a?n.createElement(h,o(o({ref:t},c),{},{components:a})):n.createElement(h,o({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,o[1]=l;for(var u=2;u<i;u++)o[u]=a[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},5162:(e,t,a)=>{a.d(t,{Z:()=>o});var n=a(7294),r=a(6010);const i={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:a,className:o}=e;return n.createElement("div",{role:"tabpanel",className:(0,r.Z)(i.tabItem,o),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>w});var n=a(7462),r=a(7294),i=a(6010),o=a(2466),l=a(6550),s=a(1980),u=a(7392),c=a(12);function p(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:r}}=e;return{value:t,label:a,attributes:n,default:r}}))}function d(e){const{values:t,children:a}=e;return(0,r.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function h(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),i=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(i),(0,r.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(n.location.search);t.set(i,e),n.replace({...n.location,search:t.toString()})}),[i,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,i=d(e),[o,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:i}))),[s,u]=h({queryString:a,groupId:n}),[p,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,i]=(0,c.Nk)(a);return[n,(0,r.useCallback)((e=>{a&&i.set(e)}),[a,i])]}({groupId:n}),k=(()=>{const e=s??p;return m({value:e,tabValues:i})?e:null})();(0,r.useLayoutEffect)((()=>{k&&l(k)}),[k]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),f(e)}),[u,f,i]),tabValues:i}}var k=a(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,o.o5)(),d=e=>{const t=e.currentTarget,a=c.indexOf(t),n=u[a].value;n!==l&&(p(t),s(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:o}=e;return r.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},o,{className:(0,i.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":l===t})}),a??t)})))}function g(e){let{lazy:t,children:a,selectedValue:n}=e;const i=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=i.find((e=>e.props.value===n));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},i.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function y(e){const t=f(e);return r.createElement("div",{className:(0,i.Z)("tabs-container",v.tabList)},r.createElement(b,(0,n.Z)({},e,t)),r.createElement(g,(0,n.Z)({},e,t)))}function w(e){const t=(0,k.Z)();return r.createElement(y,(0,n.Z)({key:String(t)},e))}},1010:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=a(7462),r=(a(7294),a(3905)),i=a(4866),o=a(5162);const l={label:"Av1an",sidebar_position:1,templating:!0},s="Av1an",u={unversionedId:"utilities/av1an",id:"utilities/av1an",title:"Av1an",description:"Av1an is a video encoding framework. It can increase your encoding speed and improve cpu utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding.",source:"@site/docs/utilities/av1an.md",sourceDirName:"utilities",slug:"/utilities/av1an",permalink:"/docs/utilities/av1an",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/av1an.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"Av1an",sidebar_position:1,templating:!0},sidebar:"tutorialSidebar",previous:{title:"Aviator",permalink:"/docs/utilities/Aviator"},next:{title:"MKVToolNix",permalink:"/docs/utilities/MKVToolNix"}},c={},p=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3},{value:"MacOS",id:"macos",level:3},{value:"Linux",id:"linux",level:3},{value:"Docker",id:"docker",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2}],d={toc:p},m="wrapper";function h(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"av1an"},"Av1an"),(0,r.kt)("picture",null,(0,r.kt)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/main/static/img/av1an_96_workers.avif",type:"image/avif"}),(0,r.kt)("img",{src:"https://autumn.revolt.chat/attachments/K3OhOCAy9bkUCkImek_q3-t6q3zctbn9SbWW-_RI19/av1an_96_workers.webp",alt:"Av1an with 96 workers",width:"1703",height:"958"})),(0,r.kt)("p",null,"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."),(0,r.kt)("h2",{id:"prerequisites"},"Prerequisites"),(0,r.kt)("p",null,"Since Av1an is just a tool that helps with parallelization, you'll need to have the following installed for the entire thing to work: "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Rust"),(0,r.kt)("li",{parentName:"ul"},"Python (Required for ",(0,r.kt)("a",{parentName:"li",href:"/docs/filtering/vapoursynth"},"Vapoursynth"),", currently needs 3.11, this may change in the future so consult from ",(0,r.kt)("a",{parentName:"li",href:"http://www.vapoursynth.com/doc/installation.html"},"their website"),")"),(0,r.kt)("li",{parentName:"ul"},"FFmpeg"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/utilities/MKVToolNix"},"MKVToolNix")," (mkvmerge)"),(0,r.kt)("li",{parentName:"ul"},"Vapoursynth"),(0,r.kt)("li",{parentName:"ul"},"L-SMASH (Vapoursynth plugin)"),(0,r.kt)("li",{parentName:"ul"},"FFMS2 (Vapoursynth plugin, optional)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/metrics/VMAF"},"VMAF")," (For target VMAF, optional)"),(0,r.kt)("li",{parentName:"ul"},"Any of the supported encoders (",(0,r.kt)("a",{parentName:"li",href:"/docs/encoders/aomenc"},"aomenc"),", ",(0,r.kt)("a",{parentName:"li",href:"/docs/encoders/rav1e"},"rav1e"),", ",(0,r.kt)("a",{parentName:"li",href:"/docs/encoders/SVT-AV1"},"SVT-AV1"),", ",(0,r.kt)("a",{parentName:"li",href:"/docs/encoders/vpxenc"},"vpxenc"),", ",(0,r.kt)("a",{parentName:"li",href:"/docs/encoders/x264"},"x264"),", ",(0,r.kt)("a",{parentName:"li",href:"/docs/encoders/x265"},"x265"),")")),(0,r.kt)("h2",{id:"installation"},"Installation"),(0,r.kt)("h3",{id:"microsoft-windows"},"Microsoft Windows"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"GUI:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Install ",(0,r.kt)("a",{parentName:"li",href:"/docs/utilities/nmkoder"},"Nmkoder")," which is a GUI front-end to av1an with all dependencies installed"),(0,r.kt)("li",{parentName:"ol"},"You're done!")),(0,r.kt)("admonition",{title:"Outdated Software",type:"danger"},(0,r.kt)("p",{parentName:"admonition"},"Since Nmkoder already ships everything by default and it's last release was 29th March 2022. You need to manually update EVERYTHING (",(0,r.kt)("inlineCode",{parentName:"p"},"av1an.exe"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"aomenc.exe"),", etc) to get performance optimizations, better speeds, and more settings. Missing out on updates will result in your encodes being sub-optimal.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Pre-built binary, bleeding edge ","[Recommended]",":")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Download Av1an from ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/master-of-zen/Av1an/releases"},"here"),', select "Latest" and click the "Assets" dropdown. Put it in ',(0,r.kt)("a",{parentName:"li",href:"https://www.maketecheasier.com/what-is-the-windows-path"},"PATH"))),(0,r.kt)("h3",{id:"macos"},"MacOS"),(0,r.kt)("p",null,"To be filled."),(0,r.kt)("h3",{id:"linux"},"Linux"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"The Easy Way:")," "),(0,r.kt)("p",null,"Install ",(0,r.kt)("a",{parentName:"p",href:"/docs/utilities/rAV1ator"},"rAV1ator"),", a GUI frontend for Av1an & the rust-based rav1e encoder."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"Keep in mind Aviator only ships with ",(0,r.kt)("strong",{parentName:"p"},"SVT-AV1")," and rAV1ator with ",(0,r.kt)("strong",{parentName:"p"},"rav1e")," instead of Aomenc/AOM-AV1.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"The compiling route:")),(0,r.kt)("p",null,"Prerequisites: "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Vapoursynth"),(0,r.kt)("li",{parentName:"ul"},"FFmpeg"),(0,r.kt)("li",{parentName:"ul"},"MKVToolNix (mkvmerge)"),(0,r.kt)("li",{parentName:"ul"},"Git"),(0,r.kt)("li",{parentName:"ul"},"Perl"),(0,r.kt)("li",{parentName:"ul"},"Nasm"),(0,r.kt)("li",{parentName:"ul"},"Rust (Use rustup on Debian/Ubuntu, as the package manager version is horribly outdated)"),(0,r.kt)("li",{parentName:"ul"},"Highway (libhwy)")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/master-of-zen/Av1an.git\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n')),(0,r.kt)("p",null,"after done, the binary will be located in ",(0,r.kt)("inlineCode",{parentName:"p"},"target/release"),", copy it to somewhere like ",(0,r.kt)("inlineCode",{parentName:"p"},"/usr/bin")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"/usr/local/bin")),(0,r.kt)("h3",{id:"docker"},"Docker"),(0,r.kt)("p",null,"The following examples assume the file you want to encode is in your current working directory."),(0,r.kt)(i.Z,{mdxType:"Tabs"},(0,r.kt)(o.Z,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'docker run --privileged -v "$(pwd):/videos" --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'))),(0,r.kt)(o.Z,{value:"linux",label:"Linux",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'docker run --privileged -v "${PWD}:/videos" -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'))),(0,r.kt)(o.Z,{value:"build",label:"Manual Build",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'docker build -t "av1an" .\n')),(0,r.kt)("p",null," Run in the root directory of the repository. The dependencies will automatically be installed into the image, no manual installations necessary."))),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To specify a different directory to use you would replace $(pwd) with the directory"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'docker run --privileged -v "/c/Users/masterofzen/Videos":/videos --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n')),(0,r.kt)("p",{parentName:"admonition"},"The ",(0,r.kt)("inlineCode",{parentName:"p"},"--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.")),(0,r.kt)("h2",{id:"troubleshooting"},"Troubleshooting"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},'mkvmerge "Open file error" on Linux - Run ',(0,r.kt)("inlineCode",{parentName:"li"},"ulimit -n 20000")),(0,r.kt)("li",{parentName:"ol"},"Gray screen flashing for a single frame in output - Create a lossless intermediary with x264 ",(0,r.kt)("inlineCode",{parentName:"li"},"-qp 0"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/56ad2297.0f86c943.js b/assets/js/56ad2297.0f86c943.js deleted file mode 100644 index a0eae7bec..000000000 --- a/assets/js/56ad2297.0f86c943.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5663],{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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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):a(a({},t),e)),r},p=function(e){var t=d(e.components);return n.createElement(s.Provider,{value:t},e.children)},l="mdxType",u={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,p=c(e,["components","mdxType","originalType","parentName"]),l=d(r),f=o,m=l["".concat(s,".").concat(f)]||l[f]||u[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 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 d=2;d<i;d++)a[d]=r[d];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},5490:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var n=r(7462),o=(r(7294),r(3905));const i={label:"AV1",sidebar_position:6},a="AV1",c={unversionedId:"video/AV1",id:"video/AV1",title:"AV1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/AV1.md",sourceDirName:"video",slug:"/video/AV1",permalink:"/docs/video/AV1",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AV1.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"AV1",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"VP9",permalink:"/docs/video/VP9"},next:{title:"AVS3",permalink:"/docs/video/AVS3"}},s={},d=[],p={toc:d},l="wrapper";function u(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:"av1"},"AV1"),(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,"AV1 is a royalty-free video compression format designed to succeed ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/VP9"},"VP9"),". It presently competes with ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/VP9"},"VP9"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/VVC"},"VVC"),", and ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/HEVC"},"HEVC"),". AV1 is computationally more complex than VP9, but is fast to decode due to the mature and efficient dav1d AV1 decoder. AV1 hardware accelerated decoding is also available on a variety of different consumer hardware devices, all of which are enumerated ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/AV1#Hardware"},"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."),(0,o.kt)("p",null,"There are a number of viable AV1 encoding solutions available today. The three best, most ubiquitous, and free implementations are ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/aomenc"},"aomenc"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/SVT-AV1"},"SVT-AV1"),", & ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/rav1e"},"rav1e"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5730e896.021f9304.js b/assets/js/5730e896.021f9304.js deleted file mode 100644 index 2d52a1a7e..000000000 --- a/assets/js/5730e896.021f9304.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4478],{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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),u=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=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},l="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,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),l=u(r),b=o,f=l["".concat(c,".").concat(b)]||l[b]||d[b]||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]=b;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[l]="string"==typeof e?e:o,a[1]=s;for(var u=2;u<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}b.displayName="MDXCreateElement"},7108:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={label:"Vorbis",sidebar_position:5},a="Vorbis",s={unversionedId:"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!",source:"@site/docs/audio/Vorbis.md",sourceDirName:"audio",slug:"/audio/Vorbis",permalink:"/docs/audio/Vorbis",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Vorbis.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"Vorbis",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"MP3",permalink:"/docs/audio/MP3"},next:{title:"Speex",permalink:"/docs/audio/Speex"}},c={},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:"vorbis"},"Vorbis"),(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,"Vorbis is an open-source audio codec that has seen great success in its usage by Spotify, among others. It is the default audio codec for Minecraft's sounds & music. It has largely been replaced by ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/Opus"},"Opus"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/59641f86.29ad1f11.js b/assets/js/59641f86.29ad1f11.js deleted file mode 100644 index 6126feaeb..000000000 --- a/assets/js/59641f86.29ad1f11.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3312],{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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var d=n.createContext({}),l=function(e){var t=n.useContext(d),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(d.Provider,{value:t},e.children)},s="mdxType",u={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,d=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),s=l(r),f=o,m=s["".concat(d,".").concat(f)]||s[f]||u[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 c={};for(var d in t)hasOwnProperty.call(t,d)&&(c[d]=t[d]);c.originalType=e,c[s]="string"==typeof e?e:o,a[1]=c;for(var l=2;l<i;l++)a[l]=r[l];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},7671:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const i={label:"Theora",sidebar_position:9},a="Theora",c={unversionedId:"video/Theora",id:"video/Theora",title:"Theora",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/Theora.md",sourceDirName:"video",slug:"/video/Theora",permalink:"/docs/video/Theora",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/Theora.md",tags:[],version:"current",sidebarPosition:9,frontMatter:{label:"Theora",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"VC-1",permalink:"/docs/video/VC-1"},next:{title:"FFV1",permalink:"/docs/video/FFV1"}},d={},l=[{value:"Encoding",id:"encoding",level:2}],p={toc:l},s="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"theora"},"Theora"),(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,"Theora is a legacy video codec first released in 2004. It is derived from VP3, part of the same family of codecs that formed ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/VP8"},"VP8"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/VP9"},"VP9")," and ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"AV1"),"."),(0,o.kt)("h2",{id:"encoding"},"Encoding"),(0,o.kt)("p",null,"Theora is frequently contained within a ogg (",(0,o.kt)("inlineCode",{parentName:"p"},".ogg")," or ",(0,o.kt)("inlineCode",{parentName:"p"},".ogv"),") container with ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/Vorbis"},"vorbis")," audio."),(0,o.kt)("p",null,"To be filled."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5b209502.1b9282d0.js b/assets/js/5b209502.1b9282d0.js new file mode 100644 index 000000000..f42f7ac48 --- /dev/null +++ b/assets/js/5b209502.1b9282d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[977],{5665:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var i=n(5893),o=n(1151);const r={title:"Deinterlace",sidebar_position:3},s="Deinterlace",c={id:"filtering/deinterlace",title:"Deinterlace",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/deinterlace.mdx",sourceDirName:"filtering",slug:"/filtering/deinterlace",permalink:"/docs/filtering/deinterlace",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/deinterlace.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Deinterlace",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Vapoursynth",permalink:"/docs/filtering/vapoursynth"},next:{title:"Denoise",permalink:"/docs/filtering/denoise"}},a={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"deinterlace",children:"Deinterlace"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>s});var i=n(7294);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5d1a7e8b.4afe7e36.js b/assets/js/5d1a7e8b.4afe7e36.js new file mode 100644 index 000000000..d2f368df8 --- /dev/null +++ b/assets/js/5d1a7e8b.4afe7e36.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4723],{225:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var s=n(5893),t=n(1151);const o={title:"Video Players",sidebar_label:"\u25b6\ufe0f Video Players",sidebar_position:11},r="Video Players",a={id:"video-players",title:"Video Players",description:"Many different players exist for video, but here are a few recommended ones:",source:"@site/docs/video-players.mdx",sourceDirName:".",slug:"/video-players",permalink:"/docs/video-players",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video-players.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"Video Players",sidebar_label:"\u25b6\ufe0f Video Players",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Butteraugli",permalink:"/docs/metrics/butteraugli"},next:{title:"\ud83d\uddc3\ufe0f Resources",permalink:"/docs/resources"}},d={},l=[{value:"MPV",id:"mpv",level:2},{value:"VLC",id:"vlc",level:2},{value:"MPC-HC",id:"mpc-hc",level:2}];function c(e){const i={a:"a",h1:"h1",h2:"h2",p:"p",strong:"strong",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"video-players",children:"Video Players"}),"\n",(0,s.jsx)(i.p,{children:"Many different players exist for video, but here are a few recommended ones:"}),"\n",(0,s.jsx)(i.h2,{id:"mpv",children:"MPV"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"MPV"})," is a open source lightweight media player. It is intended as a command-line application, making it's user interface extremely minimal, however, many frontends exist for mpv, giving a more complete GUI, such as Celluloid and IINA. It has wide codec and container support."]}),"\n",(0,s.jsx)(i.p,{children:"TODO: MPV keyboard shorcuts\n\xa0\xa0"}),"\n",(0,s.jsx)(i.h2,{id:"vlc",children:"VLC"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"VLC"})," is an open source media player and toolkit. It supports almost all video and audio codecs in common use."]}),"\n",(0,s.jsxs)(i.p,{children:["Download instructions for VLC on all relevant platforms can be found at ",(0,s.jsx)(i.a,{href:"https://www.videolan.org/vlc/#download",children:"VideoLAN's website"}),"\n\xa0\xa0"]}),"\n",(0,s.jsx)(i.h2,{id:"mpc-hc",children:"MPC-HC"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Media Player Classic - Home Cinema (MPC-HC)"})," is an open source media player designed exclusively for Windows 7, 8, 8.1, 10, 11 operating systems. Recognized for its simplicity and efficiency, MPC-HC provides users with a streamlined and user-friendly platform for playing a diverse range of audio and video file formats. Its lightweight design ensures smooth playback without taxing system resources. While the official development ceased in 2017, the community-driven MPC-HC on GitHub continues to provide updates and support."]}),"\n",(0,s.jsxs)(i.p,{children:["The latest un/stable builds of MPC-HC, maintained by the community, can be found on ",(0,s.jsx)(i.a,{href:"https://github.com/clsid2/mpc-hc/releases",children:"clsid2's MPC-HC repository"}),"."]})]})}function p(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(7294);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5db6705b.8179c7c5.js b/assets/js/5db6705b.8179c7c5.js new file mode 100644 index 000000000..482497009 --- /dev/null +++ b/assets/js/5db6705b.8179c7c5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9716],{2815:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=i(5893),n=i(1151);const r={label:"NMKODER",sidebar_position:5},s="NMKODER",c={id:"utilities/nmkoder",title:"NMKODER",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/nmkoder.mdx",sourceDirName:"utilities",slug:"/utilities/nmkoder",permalink:"/docs/utilities/nmkoder",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/nmkoder.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"NMKODER",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"rAV1ator CLI",permalink:"/docs/utilities/rav1ator-cli"},next:{title:"dovi_tool",permalink:"/docs/utilities/dovi_tool"}},a={},d=[];function u(t){const e={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.h1,{id:"nmkoder",children:"NMKODER"}),"\n",(0,o.jsx)(e.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(e.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(e.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(t={}){const{wrapper:e}={...(0,n.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(u,{...t})}):u(t)}},1151:(t,e,i)=>{i.d(e,{Z:()=>c,a:()=>s});var o=i(7294);const n={},r=o.createContext(n);function s(t){const e=o.useContext(r);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:s(t.components),o.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/5dfd82d3.fab28e28.js b/assets/js/5dfd82d3.fab28e28.js deleted file mode 100644 index 91b634582..000000000 --- a/assets/js/5dfd82d3.fab28e28.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1062],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(n),m=o,f=d["".concat(c,".").concat(m)]||d[m]||u[m]||i;return n?r.createElement(f,a(a({ref:t},p),{},{components:n})):r.createElement(f,a({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:o,a[1]=l;for(var s=2;s<i;s++)a[s]=n[s];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},8634:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=n(7462),o=(n(7294),n(3905));const i={title:"x265",sidebar_position:2},a="x265",l={unversionedId:"encoders/x265",id:"encoders/x265",title:"x265",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/x265.md",sourceDirName:"encoders",slug:"/encoders/x265",permalink:"/docs/encoders/x265",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x265.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"x265",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"x264",permalink:"/docs/encoders/x264"},next:{title:"aomenc",permalink:"/docs/encoders/aomenc"}},c={},s=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2}],p={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"x265"},"x265"),(0,o.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"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."),(0,o.kt)("h2",{id:"ffmpeg"},"FFmpeg"),(0,o.kt)("p",null,"x265 is available in FFmpeg via ",(0,o.kt)("inlineCode",{parentName:"p"},"libx265"),", to check if you have it, run ",(0,o.kt)("inlineCode",{parentName:"p"},"ffmpeg -h encoder=libx265"),"."),(0,o.kt)("h2",{id:"installation"},"Installation"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Pre-built binary ","[Recommended]",":")),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"http://msystem.waw.pl/x265/"},"http://msystem.waw.pl/x265/"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5e069031.f52fcd21.js b/assets/js/5e069031.f52fcd21.js new file mode 100644 index 000000000..b454cf926 --- /dev/null +++ b/assets/js/5e069031.f52fcd21.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3594],{1628:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var t=o(5893),n=o(1151);const s={title:"Prologue",sidebar_position:1},a="Prologue",r={id:"introduction/prologue",title:"Prologue",description:"Multimedia compression as a whole has revolutionized our ability to communicate on the Web & beyond. It has enabled rich experiences across many breakthrough platforms that wouldn't have been feasible otherwise, and it has allowed us to communicate information, expression, and human connection in novel ways. It is the unsung hero of the modern Web. Despite this, it is often difficult to uncover information about codec technology that is accurate, informed, and battle-tested by passionate individuals who care about the proliferation of knowledge. This wiki aims to demystify the realm of multimedia compression while connecting codec enthusiasts to create a sink of knowledge for the benefit of everyone.",source:"@site/docs/introduction/prologue.mdx",sourceDirName:"introduction",slug:"/introduction/prologue",permalink:"/docs/introduction/prologue",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/prologue.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Prologue",sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Terminology",permalink:"/docs/introduction/terminology"}},c={},d=[{value:"What This Isn't",id:"what-this-isnt",level:3},{value:"What is a Codec",id:"what-is-a-codec",level:3},{value:"What You Need",id:"what-you-need",level:3}];function l(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"prologue",children:"Prologue"}),"\n",(0,t.jsx)(i.p,{children:"Multimedia compression as a whole has revolutionized our ability to communicate on the Web & beyond. It has enabled rich experiences across many breakthrough platforms that wouldn't have been feasible otherwise, and it has allowed us to communicate information, expression, and human connection in novel ways. It is the unsung hero of the modern Web. Despite this, it is often difficult to uncover information about codec technology that is accurate, informed, and battle-tested by passionate individuals who care about the proliferation of knowledge. This wiki aims to demystify the realm of multimedia compression while connecting codec enthusiasts to create a sink of knowledge for the benefit of everyone."}),"\n",(0,t.jsx)(i.h3,{id:"what-this-isnt",children:"What This Isn't"}),"\n",(0,t.jsxs)(i.p,{children:["The Codec Wiki is ",(0,t.jsx)(i.strong,{children:"not a highly accurate source for understanding the mathematics, research, adoption/patent politics, or specifications of specific coder/decoder implementations"}),". Sources like Wikipedia cover these details with great accuracy & reliability. What we ",(0,t.jsx)(i.em,{children:"are"})," focused on is making higher level information - especially related to the usage & application of compression tools - highly accessible; we are focused on application, not theory, for the time being. Knowing how a codec works in theory is different than knowing when and how to best use a codec and its accompanying tools."]}),"\n",(0,t.jsx)(i.h3,{id:"what-is-a-codec",children:"What is a Codec"}),"\n",(0,t.jsxs)(i.p,{children:["A codec, shortened from coder/decoder, is a system that handles digital media or data according to a specification. Usually, this means it compresses and decompresses digital media. Codecs are used to encode media for storage and transmission - among other things - and then decode that media for playback, editing, etc. Multimedia codecs compress by either ",(0,t.jsx)(i.a,{href:"/docs/introduction/psychovisual",children:"discarding less salient data"})," using ",(0,t.jsx)(i.a,{href:"/docs/introduction/video-artifacts",children:"lossy"})," compression to reduce filesize, or they use clever lossless compression tricks to maintain a mathematically identical stream to the input media while still reducing filesize. Lossless compression can be reversed to be the exact same as the input data, while lossy compression does not share this quality as it discards data for smaller filesizes. Some common uses of codecs include:"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Video compression: Video codecs like ",(0,t.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,t.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,t.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," allow digital video files to be compressed to much smaller sizes for streaming & storage, among other things. A video codec can encode a video stream while it is being recorded or before it is distributed, and decode it when it is played back. This allows videos to be shared more quickly and use less storage & bandwidth."]}),"\n",(0,t.jsxs)(i.li,{children:["Audio compression: Audio codecs like ",(0,t.jsx)(i.a,{href:"/docs/audio/MP3",children:"MP3"}),", ",(0,t.jsx)(i.a,{href:"/docs/audio/AAC",children:"AAC"}),", and ",(0,t.jsx)(i.a,{href:"/docs/audio/Opus",children:"Opus"})," compress audio files like songs & podcasts. This allows them to be easily distributed & stored."]}),"\n",(0,t.jsxs)(i.li,{children:["Image Compression: Image codecs, whether tried and true like ",(0,t.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"})," or brand new like ",(0,t.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),", have fundamentally the same goal: compress images well while maintaining a versatile featureset for the myriad of ways one may decide they'd like to compress an image. Color depth, HDR, transparency, color space information, EXIF data, and many other factors are at play when working with images that make compressing them easier said than done."]}),"\n",(0,t.jsxs)(i.li,{children:["Data Compression: General compression algorithms like ",(0,t.jsx)(i.a,{href:"/docs/data/zip",children:"ZIP"})," & ",(0,t.jsx)(i.a,{href:"/docs/data/zstd",children:"zstd"})," are designed to compress ",(0,t.jsx)(i.em,{children:"any"})," kind of data, not just multimedia specific data. This includes web assets, executables, text archives, and even entire filesystems."]}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["In summary, ",(0,t.jsx)(i.strong,{children:"codecs use complex algorithms to encode and decode media for efficient storage and transmission"}),". They are essential for recording, compressing, delivering and playing back digital media. Different codecs balance factors like compression efficiency, quality, computational requirements, compatibility, & features depending on their application."]}),"\n",(0,t.jsx)(i.h3,{id:"what-you-need",children:"What You Need"}),"\n",(0,t.jsx)(i.p,{children:"A rather informal list of requirements follows."}),"\n",(0,t.jsx)(i.p,{children:"You will benefit greatly from:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Patience."}),"\n",(0,t.jsx)(i.li,{children:"A willingness to learn, engage in curiousity, & follow instructions"}),"\n",(0,t.jsx)(i.li,{children:"Basic to intermediate computer proficiency."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"If you're only here to learn the tools, it will be very beneficial to have:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Higher-end CPU hardware, which will decrease wait times for some larger encoding workloads discussed here."}),"\n",(0,t.jsx)(i.li,{children:"A level of comfort with CLI utilities, or enough motivation to engage with them in the absence of background knowledge."}),"\n",(0,t.jsx)(i.li,{children:"A device running an Arch-based Linux distribution, excluding Manjaro"}),"\n"]}),"\n",(0,t.jsx)(i.admonition,{title:"Why Arch?",type:"info",children:(0,t.jsxs)(i.p,{children:["Most encoding tools are readily available in the package manager, & it is a bleeding edge Linux distribution which ensures your utilities are always kept up to date. For filtering, all Vapoursynth plugins are already available in the Arch User Repository (AUR) which makes it extremely easy to install and version control with an AUR helper ",(0,t.jsxs)(i.a,{href:"https://github.com/Jguer/yay",children:["like ",(0,t.jsx)(i.code,{children:"yay"})]})]})})]})}function h(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},1151:(e,i,o)=>{o.d(i,{Z:()=>r,a:()=>a});var t=o(7294);const n={},s=t.createContext(n);function a(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e1194df.2922eca0.js b/assets/js/5e1194df.2922eca0.js new file mode 100644 index 000000000..96c91183f --- /dev/null +++ b/assets/js/5e1194df.2922eca0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2962],{882:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=i(5893),n=i(1151);const s={label:"zpaq",sidebar_position:7},a="ZPAQ",r={id:"data/zpaq",title:"ZPAQ",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/zpaq.mdx",sourceDirName:"data",slug:"/data/zpaq",permalink:"/docs/data/zpaq",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zpaq.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"zpaq",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Brotli",permalink:"/docs/data/brotli"},next:{title:"Zstandard",permalink:"/docs/data/zstd"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"zpaq",children:"ZPAQ"}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(t.p,{children:"ZPAQ is a lossless data compression algorithm that combines several techniques to achieve high compression ratios. It was developed by Matt Mahoney."}),"\n",(0,o.jsx)(t.p,{children:'ZPAQ uses a multitude of different compression algorithms to try to achieve the best size-to-compression-time ratio possible while producing the smallest possible archives without much concern given to decompression performance. On the official ZPAQ website, it looks like it is designed for "realistic backups that have a lot of duplicate files and a lot of already compressed files."'}),"\n",(0,o.jsx)(t.p,{children:'ZPAQ is also considered an "incremental journaling archiver" meaning you can add files to an existing archive based on if they were changed or not. This reduces the time needed to wait for a new backup to finish, if that is your use case. Since ZPAQ is so focused on compression ratio, this kind of feature may reduce the burden imposed by long compression times in practical use cases where it makes sense. Windows & macOS do not handle ZPAQ archives properly by default, and it is unlikely many Linux distros do either.'})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>r,a:()=>a});var o=i(7294);const n={},s=o.createContext(n);function a(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.58bd1d7d.js b/assets/js/5e95c892.58bd1d7d.js new file mode 100644 index 000000000..96e322dc9 --- /dev/null +++ b/assets/js/5e95c892.58bd1d7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9661],{1892:(e,c,s)=>{s.r(c),s.d(c,{default:()=>n});s(7294);var r=s(6010),u=s(1944),a=s(5281),i=s(8790),d=s(179),k=s(5893);function n(e){return(0,k.jsx)(u.FG,{className:(0,r.Z)(a.k.wrapper.docsPages),children:(0,k.jsx)(d.Z,{children:(0,i.H)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5f74c797.85f9a755.js b/assets/js/5f74c797.85f9a755.js new file mode 100644 index 000000000..5acd53089 --- /dev/null +++ b/assets/js/5f74c797.85f9a755.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7456],{1531:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var i=r(5893),t=r(1151),s=r(4866),a=r(5162);const l={label:"Av1an",sidebar_position:1,templating:!0},o="Av1an",c={id:"utilities/av1an",title:"Av1an",description:"Av1an is a video encoding framework. It can increase your encoding speed and improve cpu utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding.",source:"@site/docs/utilities/av1an.mdx",sourceDirName:"utilities",slug:"/utilities/av1an",permalink:"/docs/utilities/av1an",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/av1an.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"Av1an",sidebar_position:1,templating:!0},sidebar:"tutorialSidebar",previous:{title:"Aviator",permalink:"/docs/utilities/Aviator"},next:{title:"MKVToolNix",permalink:"/docs/utilities/MKVToolNix"}},d={},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3},{value:"MacOS",id:"macos",level:3},{value:"Linux",id:"linux",level:3},{value:"Docker",id:"docker",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"av1an",children:"Av1an"}),"\n",(0,i.jsxs)("picture",{children:[(0,i.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/main/static/img/av1an_96_workers.avif",type:"image/avif"}),(0,i.jsx)("img",{src:"https://autumn.revolt.chat/attachments/K3OhOCAy9bkUCkImek_q3-t6q3zctbn9SbWW-_RI19/av1an_96_workers.webp",alt:"Av1an with 96 workers",width:"1703",height:"958"})]}),"\n",(0,i.jsx)(n.p,{children:"Av1an is a video encoding framework. It can increase your encoding speed and improve cpu utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding."}),"\n",(0,i.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsx)(n.p,{children:"Since Av1an is just a tool that helps with parallelization, you'll need to have the following installed for the entire thing to work:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Rust"}),"\n",(0,i.jsxs)(n.li,{children:["Python (Required for ",(0,i.jsx)(n.a,{href:"/docs/filtering/vapoursynth",children:"Vapoursynth"}),", currently needs 3.11, this may change in the future so consult from ",(0,i.jsx)(n.a,{href:"http://www.vapoursynth.com/doc/installation.html",children:"their website"}),")"]}),"\n",(0,i.jsx)(n.li,{children:"FFmpeg"}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/docs/utilities/MKVToolNix",children:"MKVToolNix"})," (mkvmerge)"]}),"\n",(0,i.jsx)(n.li,{children:"Vapoursynth"}),"\n",(0,i.jsx)(n.li,{children:"L-SMASH (Vapoursynth plugin)"}),"\n",(0,i.jsx)(n.li,{children:"FFMS2 (Vapoursynth plugin, optional)"}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/docs/metrics/VMAF",children:"VMAF"})," (For target VMAF, optional)"]}),"\n",(0,i.jsxs)(n.li,{children:["Any of the supported encoders (",(0,i.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/vpxenc",children:"vpxenc"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),")"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.h3,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"GUI:"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.a,{href:"/docs/utilities/nmkoder",children:"Nmkoder"})," which is a GUI front-end to av1an with all dependencies installed"]}),"\n",(0,i.jsx)(n.li,{children:"You're done!"}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"Outdated Software",type:"danger",children:(0,i.jsxs)(n.p,{children:["Since Nmkoder already ships everything by default and it's last release was 29th March 2022. You need to manually update EVERYTHING (",(0,i.jsx)(n.code,{children:"av1an.exe"}),", ",(0,i.jsx)(n.code,{children:"aomenc.exe"}),", etc) to get performance optimizations, better speeds, and more settings. Missing out on updates will result in your encodes being sub-optimal."]})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Pre-built binary, bleeding edge [Recommended]:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Download Av1an from ",(0,i.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases",children:"here"}),', select "Latest" and click the "Assets" dropdown. Put it in ',(0,i.jsx)(n.a,{href:"https://www.maketecheasier.com/what-is-the-windows-path",children:"PATH"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(n.h3,{id:"macos",children:"MacOS"}),"\n",(0,i.jsx)(n.p,{children:"To be filled."}),"\n",(0,i.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"The Easy Way:"})}),"\n",(0,i.jsxs)(n.p,{children:["Install ",(0,i.jsx)(n.a,{href:"/docs/utilities/rAV1ator",children:"rAV1ator"}),", a GUI frontend for Av1an & the rust-based rav1e encoder."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Keep in mind Aviator only ships with ",(0,i.jsx)(n.strong,{children:"SVT-AV1"})," and rAV1ator with ",(0,i.jsx)(n.strong,{children:"rav1e"})," instead of Aomenc/AOM-AV1."]})}),"\n",(0,i.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"The compiling route:"})}),"\n",(0,i.jsx)(n.p,{children:"Prerequisites:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Vapoursynth"}),"\n",(0,i.jsx)(n.li,{children:"FFmpeg"}),"\n",(0,i.jsx)(n.li,{children:"MKVToolNix (mkvmerge)"}),"\n",(0,i.jsx)(n.li,{children:"Git"}),"\n",(0,i.jsx)(n.li,{children:"Perl"}),"\n",(0,i.jsx)(n.li,{children:"Nasm"}),"\n",(0,i.jsx)(n.li,{children:"Rust (Use rustup on Debian/Ubuntu, as the package manager version is horribly outdated)"}),"\n",(0,i.jsx)(n.li,{children:"Highway (libhwy)"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an.git\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,i.jsxs)(n.p,{children:["after done, the binary will be located in ",(0,i.jsx)(n.code,{children:"target/release"}),", copy it to somewhere like ",(0,i.jsx)(n.code,{children:"/usr/bin"})," or ",(0,i.jsx)(n.code,{children:"/usr/local/bin"})]}),"\n",(0,i.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(n.h3,{id:"docker",children:"Docker"}),"\n",(0,i.jsx)(n.p,{children:"The following examples assume the file you want to encode is in your current working directory."}),"\n",(0,i.jsxs)(s.Z,{children:[(0,i.jsx)(a.Z,{value:"windows",label:"Windows",default:!0,children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "$(pwd):/videos" --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,i.jsx)(a.Z,{value:"linux",label:"Linux",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "${PWD}:/videos" -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,i.jsxs)(a.Z,{value:"build",label:"Manual Build",children:[(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'docker build -t "av1an" .\n'})}),(0,i.jsx)(n.p,{children:"Run in the root directory of the repository. The dependencies will automatically be installed into the image, no manual installations necessary."})]})]}),"\n",(0,i.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsx)(n.p,{children:"To specify a different directory to use you would replace $(pwd) with the directory"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "/c/Users/masterofzen/Videos":/videos --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})}),(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"--user"})," flag is required on Linux to avoid permission issues with the docker container not being able to write to the location, if you get permission issues ensure your user has access to the folder that you are using to encode."]})]}),"\n",(0,i.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:['mkvmerge "Open file error" on Linux - Run ',(0,i.jsx)(n.code,{children:"ulimit -n 20000"})]}),"\n",(0,i.jsxs)(n.li,{children:["Gray screen flashing for a single frame in output - Create a lossless intermediary with x264 ",(0,i.jsx)(n.code,{children:"-qp 0"})]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},5162:(e,n,r)=>{r.d(n,{Z:()=>a});r(7294);var i=r(6010);const t={tabItem:"tabItem_Ymn6"};var s=r(5893);function a(e){let{children:n,hidden:r,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,i.Z)(t.tabItem,a),hidden:r,children:n})}},4866:(e,n,r)=>{r.d(n,{Z:()=>y});var i=r(7294),t=r(6010),s=r(2466),a=r(6550),l=r(469),o=r(1980),c=r(7392),d=r(12);function u(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,i.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:r,attributes:i,default:t}}=e;return{value:n,label:r,attributes:i,default:t}}))}(r);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[n,r])}function p(e){let{value:n,tabValues:r}=e;return r.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:r}=e;const t=(0,a.k6)(),s=function(e){let{queryString:n=!1,groupId:r}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!r)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:n,groupId:r});return[(0,o._X)(s),(0,i.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})}),[s,t])]}function x(e){const{defaultValue:n,queryString:r=!1,groupId:t}=e,s=h(e),[a,o]=(0,i.useState)((()=>function(e){let{defaultValue:n,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(n){if(!p({value:n,tabValues:r}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=r.find((e=>e.default))??r[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:s}))),[c,u]=m({queryString:r,groupId:t}),[x,v]=function(e){let{groupId:n}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(n),[t,s]=(0,d.Nk)(r);return[t,(0,i.useCallback)((e=>{r&&s.set(e)}),[r,s])]}({groupId:t}),f=(()=>{const e=c??x;return p({value:e,tabValues:s})?e:null})();(0,l.Z)((()=>{f&&o(f)}),[f]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),v(e)}),[u,v,s]),tabValues:s}}var v=r(2389);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=r(5893);function g(e){let{className:n,block:r,selectedValue:i,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.o5)(),d=e=>{const n=e.currentTarget,r=o.indexOf(n),t=l[r].value;t!==i&&(c(n),a(t))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.Z)("tabs",{"tabs--block":r},n),children:l.map((e=>{let{value:n,label:r,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:i===n?0:-1,"aria-selected":i===n,ref:e=>o.push(e),onKeyDown:u,onClick:d,...s,className:(0,t.Z)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":i===n}),children:r??n},n)}))})}function b(e){let{lazy:n,children:r,selectedValue:t}=e;const s=(Array.isArray(r)?r:[r]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===t));return e?(0,i.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==t})))})}function w(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,t.Z)("tabs-container",f.tabList),children:[(0,j.jsx)(g,{...e,...n}),(0,j.jsx)(b,{...e,...n})]})}function y(e){const n=(0,v.Z)();return(0,j.jsx)(w,{...e,children:u(e.children)},String(n))}},1151:(e,n,r)=>{r.d(n,{Z:()=>l,a:()=>a});var i=r(7294);const t={},s=i.createContext(t);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/608061a6.41c28a06.js b/assets/js/608061a6.41c28a06.js deleted file mode 100644 index 8d23b97e8..000000000 --- a/assets/js/608061a6.41c28a06.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9967],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>g});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},d=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=l(n),p=o,g=u["".concat(c,".").concat(p)]||u[p]||m[p]||i;return n?r.createElement(g,a(a({ref:t},d),{},{components:n})):r.createElement(g,a({ref:t},d))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=p;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<i;l++)a[l]=n[l];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},7892:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const i={title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},a=void 0,s={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable.md",title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",formattedDate:"October 29, 2023",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.91,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],frontMatter:{title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},c={authorsImageUrls:[void 0]},l=[{value:"A Scenario",id:"a-scenario",level:2}],d={toc:l},u="wrapper";function m(e){let{components:t,...i}=e;return(0,o.kt)(u,(0,r.Z)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{title:"Copyright Disclosure",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"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.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Feature image",src:n(3093).Z,width:"1920",height:"1080"}),"\n",(0,o.kt)("strong",{parentName:"p"},'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"')),(0,o.kt)("h2",{id:"a-scenario"},"A Scenario"),(0,o.kt)("p",null,"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."))}m.isMDXComponent=!0},3093:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"}}]); \ No newline at end of file diff --git a/assets/js/60d0076e.59ba84f2.js b/assets/js/60d0076e.59ba84f2.js new file mode 100644 index 000000000..635320ef1 --- /dev/null +++ b/assets/js/60d0076e.59ba84f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4040],{3365:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var i=n(5893),r=n(1151);const o={title:"Intro",sidebar_position:1},s="Intro",a={id:"filtering/intro",title:"Intro",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/filtering/intro.mdx",sourceDirName:"filtering",slug:"/filtering/intro",permalink:"/docs/filtering/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/intro.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Intro",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"WebVTT",permalink:"/docs/subtitles/webvtt"},next:{title:"Deband",permalink:"/docs/filtering/deband"}},d={},l=[{value:"Lore",id:"lore",level:2}];function c(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",p:"p",strong:"strong",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"intro",children:"Intro"}),"\n",(0,i.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsx)(t.p,{children:"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."}),"\n",(0,i.jsxs)(t.p,{children:["This is where filtering comes into play, currently there are three players in the filtering game. ",(0,i.jsx)(t.a,{href:"https://ffmpeg.org",children:"FFmpeg"}),", ",(0,i.jsx)(t.a,{href:"https://vapoursynth.com",children:"Vapoursynth"}),", and ",(0,i.jsx)(t.a,{href:"http://avisynth.nl/index.php/Main_Page",children:"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."]}),"\n",(0,i.jsx)(t.h2,{id:"lore",children:"Lore"}),"\n",(0,i.jsxs)(t.p,{children:["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 ",(0,i.jsx)(t.strong,{children:"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)."]})]})}function h(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>s});var i=n(7294);const r={},o=i.createContext(r);function s(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/60e1ac2d.323bcb16.js b/assets/js/60e1ac2d.323bcb16.js deleted file mode 100644 index 988656802..000000000 --- a/assets/js/60e1ac2d.323bcb16.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5581],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});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 o(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 r(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,i=function(e,t){if(null==e)return{};var a,n,i={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},m=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={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,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=p(a),c=i,h=u["".concat(s,".").concat(c)]||u[c]||d[c]||o;return a?n.createElement(h,r(r({ref:t},m),{},{components:a})):n.createElement(h,r({ref:t},m))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=a.length,r=new Array(o);r[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:i,r[1]=l;for(var p=2;p<o;p++)r[p]=a[p];return n.createElement.apply(null,r)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},5650:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=a(7462),i=(a(7294),a(3905));const o={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},r=void 0,l={permalink:"/blog/av1-encoding-for-dummies",source:"@site/blog/2023-09-03-av1-for-dummies.md",title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",date:"2023-09-03T00:00:00.000Z",formattedDate:"September 3, 2023",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:15.145,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},prevItem:{title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",permalink:"/blog/embedding-the-un-embeddable"},nextItem:{title:"Site Optimization by Reducing Image Load on the Web",permalink:"/blog/site-optimization"}},s={authorsImageUrls:[void 0,void 0]},p=[{value:"Installing the Tools",id:"installing-the-tools",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3},{value:"macOS",id:"macos",level:3},{value:"Linux",id:"linux",level:3},{value:"The Easy Ways",id:"the-easy-ways",level:4},{value:"The Compiling Route",id:"the-compiling-route",level:4},{value:"Ubuntu",id:"ubuntu",level:5},{value:"Arch",id:"arch",level:5},{value:"Compiling aom-av1-lavish",id:"compiling-aom-av1-lavish",level:4},{value:"Encoding",id:"encoding",level:2},{value:"Merging Everything",id:"merging-everything",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2},{value:"Final Thoughts",id:"final-thoughts",level:2}],m={toc:p},u="wrapper";function d(e){let{components:t,...o}=e;return(0,i.kt)(u,(0,n.Z)({},m,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"This guide will show you how to encode in AV1 the ",(0,i.kt)("em",{parentName:"p"},"right")," and ",(0,i.kt)("em",{parentName:"p"},"optimal")," way. Yes, you using standalone ",(0,i.kt)("inlineCode",{parentName:"p"},"libaom"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"libsvtav1"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"librav1e")," from FFmpeg or even piping ",(0,i.kt)("inlineCode",{parentName:"p"},"yuv4mpeg")," into ",(0,i.kt)("strong",{parentName:"p"},"mainline")," aomenc are all unoptimal."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Compare",src:a(9081).Z,width:"1045",height:"588"})),(0,i.kt)("p",null,"In this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for ",(0,i.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/docs/encoders/SVT-AV1"},"SVT-AV1"),", unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is ",(0,i.kt)("strong",{parentName:"p"},"RAM consumption"),", encoding 2160p (4K) with ",(0,i.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/docs/encoders/aomenc"},"aomenc")," with 4 workers could take upwards of ",(0,i.kt)("strong",{parentName:"p"},"16GB")," of RAM! So do keep this in mind."),(0,i.kt)("h2",{id:"installing-the-tools"},"Installing the Tools"),(0,i.kt)("h3",{id:"microsoft-windows"},"Microsoft Windows"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"The GUI Way:")),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Install ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/n00mkrad/nmkoder"},"NMKODER")," which is a GUI front-end to av1an with all dependencies installed."),(0,i.kt)("li",{parentName:"ol"},"You're done, you can skip to the encoding part")),(0,i.kt)("admonition",{title:"Almost abandonware",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Since Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"The Automated Way:")),(0,i.kt)("p",null,"There is now a batch script for automating the install process, which can be found ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/Hishiro64/av1an-win-script"},"here"),". The instructions are in the README file."),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"The script will download outdated version encoders and tools such as ",(0,i.kt)("inlineCode",{parentName:"p"},"aom-av1-psy")," and MKVToolNix v76.0, if you are fine with these you can proceed.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"The Manual Way:")),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Install ",(0,i.kt)("strong",{parentName:"p"},"Python 3.10.x, this will change so consult from the")," ",(0,i.kt)("a",{parentName:"p",href:"http://www.vapoursynth.com/doc/installation.html"},"Vapoursynth website")," ",(0,i.kt)("strong",{parentName:"p"},"if you're reading this from the future")," from ",(0,i.kt)("a",{parentName:"p",href:"https://www.python.org/downloads/windows/"},"here"),' and select "Windows Installer 64-bit". Upon installation check the tick for adding Python to PATH like so\n',(0,i.kt)("img",{alt:"Python PATH",src:a(5900).Z,width:"672",height:"417"}),")")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Download and install Vapoursynth from ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/vapoursynth/vapoursynth/releases"},"here"),' and select "VapourSynth64-RXX.exe"')),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Open the terminal and type ",(0,i.kt)("inlineCode",{parentName:"p"},"vsrepo.py install lsmas ffms2")," to install some plugins for Av1an to work.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Download MKVToolNix from ",(0,i.kt)("a",{parentName:"p",href:"https://mkvtoolnix.download/downloads.html#windows"},"here"),', select "mkvtoolnix-64bit-XX.X.X-setup.exe", and install ',(0,i.kt)("strong",{parentName:"p"},"(Also available on winget!)"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Download Av1an from ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/master-of-zen/Av1an/releases"},"here"),' (SELECT LATEST AND CLICK THE "ASSETS" DROPDOWN)')),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Download ",(0,i.kt)("strong",{parentName:"p"},"shared libraries")," FFmpeg from ",(0,i.kt)("a",{parentName:"p",href:"https://www.gyan.dev/ffmpeg/builds"},"gyan.dev"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Download a pre-built fork of Aomenc (",(0,i.kt)("a",{parentName:"p",href:"https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging"},"aom-av1-lavish"),") which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows ",(0,i.kt)("a",{parentName:"p",href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28"},"here")," ",(0,i.kt)("em",{parentName:"p"},"(Current as of Sept 6, 2023)")),(0,i.kt)("admonition",{parentName:"li",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you opt to compile aomenc yourself, you can view the instructions on how to do that ",(0,i.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/docs/encoders/aomenc/#installation"},"here"),"."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Move Av1an, FFmpeg ",(0,i.kt)("strong",{parentName:"p"},"(Including the FFmpeg DLLs)"),", and aomenc to somewhere preferable, eg ",(0,i.kt)("inlineCode",{parentName:"p"},"C:\\Encoding"),".")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Add the folder ",(0,i.kt)("strong",{parentName:"p"},"AND MKVTOOLNIX INSTALLATION FOLDER")," to the ",(0,i.kt)("a",{parentName:"p",href:"https://www.maketecheasier.com/what-is-the-windows-path/"},"Windows PATH environment"),"."))),(0,i.kt)("h3",{id:"macos"},"macOS"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"written by gb82 (Gianni Rosato)")),(0,i.kt)("p",null,"macOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Homebrew + Macports for Av1an + rav1e:"),"\n",(0,i.kt)("em",{parentName:"p"},"Note that some commands may have to be run with ",(0,i.kt)("inlineCode",{parentName:"em"},"sudo"),", which I won't explicitly include for security reasons.")),(0,i.kt)("p",null,"Installing the Homebrew package manager is a well documented process at this point:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n')),(0,i.kt)("p",null,"As is installing MacPorts. Install the relevent ",(0,i.kt)("inlineCode",{parentName:"p"},".pkg")," for your macOS version from the MacPorts Project website:\n",(0,i.kt)("a",{parentName:"p",href:"https://www.macports.org/install.php"},"www.macports.org/install.php")),(0,i.kt)("p",null,"Now, you can run the following commands:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"brew update && brew upgrade\nbrew install rav1e aom mkvtoolnix ffmpeg\n# Usually you must run MacPorts commands for package installations as root\nport upgrade outdated\nport install av1an\n")),(0,i.kt)("p",null,"This is the easiest way to get everything set up & working to produce AV1 video with ",(0,i.kt)("inlineCode",{parentName:"p"},"rav1e")," or mainline ",(0,i.kt)("inlineCode",{parentName:"p"},"aomenc")," & Av1an. You can check that things are installed by running the following commands & parsing their output:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"% av1an --version\nav1an 0.4.1-unstable (rev e10880d) (Release)\n\n* Compiler\n rustc 1.70.0 (LLVM 16.0)\n\n* Target Triple\n aarch64-apple-darwin\n\n* Date Info\n Commit Date: 2023-06-25\n\n* VapourSynth Plugins\n systems.innocent.lsmas : Not found\n com.vapoursynth.ffms2 : Not found\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'% rav1e --version | grep "release" -C 1 \nrav1e 0.6.6 () (release)\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'% aomenc --help | grep "AOMedia" -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\n\n Use --codec to switch to a non-default encoder.\n')),(0,i.kt)("p",null,"Notice ",(0,i.kt)("inlineCode",{parentName:"p"},"systems.innocent.lsmas : Not found")," in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through ",(0,i.kt)("inlineCode",{parentName:"p"},"-m hybrid"),". This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'av1an -i "input" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v " --tiles 8 -s 4 --quantizer 80 --no-scene-detection" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o "output.mkv"\n')),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Building From Source")),(0,i.kt)("p",null,"If you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"macOS sometimes doesn't have a ",(0,i.kt)("inlineCode",{parentName:"li"},"/usr/local/bin")," by default. You can fix this by doing ",(0,i.kt)("inlineCode",{parentName:"li"},"mkdir /usr/local/bin"),"."),(0,i.kt)("li",{parentName:"ul"},"Homebrew installs ",(0,i.kt)("em",{parentName:"li"},"everything")," in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from ",(0,i.kt)("inlineCode",{parentName:"li"},"/opt/homebrew/lib")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"/usr/local/lib"),". Finding them is a matter of ",(0,i.kt)("inlineCode",{parentName:"li"},'ls | grep "keyword"')," & copying what looks reasonable to be associated with the tool you're using."),(0,i.kt)("li",{parentName:"ul"},"Building most things from source will have instructions for ","*","nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example.")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'brew install git rust nasm\ngit clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\ncd .. && cd target/release\ncp av1an /usr/local/bin\n')),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"More Difficult: Building aom-av1-lavish from Source")),(0,i.kt)("p",null,"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:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n")),(0,i.kt)("p",null,"Now, you need to make some manual changes to the source code until Clybius merges ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files"},"this commit"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Add the line ",(0,i.kt)("inlineCode",{parentName:"li"},'#include "aq_variance.h"')," at line 19 in ",(0,i.kt)("inlineCode",{parentName:"li"},"av1/encoder/encodeframe_utils.c")),(0,i.kt)("li",{parentName:"ul"},"Comment out line 2546 in ",(0,i.kt)("inlineCode",{parentName:"li"},"av1/encoder/speed_features.c"),". This line is ",(0,i.kt)("inlineCode",{parentName:"li"},"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };")," & becomes ",(0,i.kt)("inlineCode",{parentName:"li"},"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"),".")),(0,i.kt)("p",null,"Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the ",(0,i.kt)("inlineCode",{parentName:"p"},"aom-av1-lavish")," directory:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root:\nmake install\n')),(0,i.kt)("p",null,"Now you can run ",(0,i.kt)("inlineCode",{parentName:"p"},'aomenc --help | grep "AOMedia" -C 3')," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,i.kt)("inlineCode",{parentName:"p"},"aomenc")," executable to ",(0,i.kt)("inlineCode",{parentName:"p"},"/opt/local/bin"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"/usr/local/bin"),", & ",(0,i.kt)("inlineCode",{parentName:"p"},"/opt/homebrew/bin")," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n")),(0,i.kt)("p",null,"Notice how it says ",(0,i.kt)("inlineCode",{parentName:"p"},"AOMedia Project AV1 Encoder Psy")," instead of ",(0,i.kt)("inlineCode",{parentName:"p"},"AOMedia Project AV1 Encoder"),". You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below."),(0,i.kt)("h3",{id:"linux"},"Linux"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Yet again, try using Arch. It's way easier.")),(0,i.kt)("h4",{id:"the-easy-ways"},"The Easy Ways"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Install ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/gianni-rosato/aviator"},"Aviator")," (",(0,i.kt)("a",{parentName:"li",href:"https://wiki.x266.mov/docs/encoders/SVT-AV1"},"SVT-AV1")," + ",(0,i.kt)("a",{parentName:"li",href:"https://wiki.x266.mov/docs/utilities/FFmpeg"},"FFmpeg"),") or ",(0,i.kt)("a",{parentName:"li",href:"https://giannirosato.com/blog/post/aviator-1/"},"rAV1ator")," basically same thing but ",(0,i.kt)("a",{parentName:"li",href:"https://wiki.x266.mov/docs/utilities/av1an.md"},"Av1an")," + ",(0,i.kt)("a",{parentName:"li",href:"https://wiki.x266.mov/docs/encoders/rav1e"},"rav1e"),". Both are only available as ",(0,i.kt)("a",{parentName:"li",href:"https://beta.flathub.org/apps/net.natesales.Aviator"},"Flatpaks"),". Keep in mind Aviator ships with ",(0,i.kt)("strong",{parentName:"li"},"SVT-AV1")," and rAV1ator with ",(0,i.kt)("strong",{parentName:"li"},"rav1e")," instead of aomenc/AOM-AV1, which I will not be covering here."),(0,i.kt)("li",{parentName:"ul"},"Install ",(0,i.kt)("a",{parentName:"li",href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli"},"rav1ator-cli"),", a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See ",(0,i.kt)("a",{parentName:"li",href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation"},"this page")," for more info.")),(0,i.kt)("h4",{id:"the-compiling-route"},"The Compiling Route"),(0,i.kt)("h5",{id:"ubuntu"},"Ubuntu"),(0,i.kt)("p",null,"The guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via ",(0,i.kt)("inlineCode",{parentName:"p"},"rustup")," first, as apt version of Rust is severely outdated, then you can continue."),(0,i.kt)("p",null,"Install dependencies:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\n")),(0,i.kt)("p",null,"Install l-smash:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/l-smash/l-smash.git\ncd l-smash\n./configure --enable-shared --extra-cflags="-march=native"\nmake -j$(nproc)\nsudo make install\n')),(0,i.kt)("p",null,"Install zimg:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"git clone --recursive https://github.com/sekrit-twc/zimg.git\ncd zimg\n./autogen.sh\n./configure\nmake -j$(nproc)\nsudo make install\n")),(0,i.kt)("p",null,"Install ImageMagick:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/ImageMagick/ImageMagick\ncd ImageMagick\n./configure\nmake -j$(nproc)\nsudo make install\n")),(0,i.kt)("p",null,"Install Vapoursynth R63:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'wget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\nunzip R63.zip\ncd vapoursynth-R63\n./autogen.sh\n./configure CFLAGS="-march=native" CXXFLAGS="-march=native" --libdir=/usr/lib\nmake -j$(nproc)\nsudo make install\nsudo mkdir /usr/lib/vapoursynth\nsudo ldconfig\n')),(0,i.kt)("p",null,"The plugin directory will be located in ",(0,i.kt)("inlineCode",{parentName:"p"},"/usr/lib/vapoursynth"),"."),(0,i.kt)("p",null,"Install L-SMASH-Works Vapoursynth Plugin:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args="-march=native" -Dcpp_args="-march=native"\nninja -j$(nproc)\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\n')),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"L-SMASH-Works doesn't work on ",(0,i.kt)("strong",{parentName:"p"},"aarch64"),", it is recommended to use other plugins instead.")),(0,i.kt)("p",null,"Install FFMS2 Vapoursynth Plugin:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/FFMS/ffms2\ncd ffms2\n./autogen.sh\n./configure CFLAGS="-O3 -march=native" CXXFLAGS="-O3 -march=native"\nmake -j$(nproc)\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\n')),(0,i.kt)("p",null,"Install Av1an:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\nsudo cp target/release/av1an /usr/local/bin\n')),(0,i.kt)("p",null,"When there's no errors, proceed to compiling ",(0,i.kt)("inlineCode",{parentName:"p"},"aom-av1-lavish"),"."),(0,i.kt)("h5",{id:"arch"},"Arch"),(0,i.kt)("p",null,"Install dependencies:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\n")),(0,i.kt)("p",null,"you're done, proceed."),(0,i.kt)("h4",{id:"compiling-aom-av1-lavish"},"Compiling aom-av1-lavish"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt"\nmake -j$(nproc)\nsudo make install\n')),(0,i.kt)("h2",{id:"encoding"},"Encoding"),(0,i.kt)("p",null,"The moment you've all been waiting for, let's just get into it. Here's an example ",(0,i.kt)("em",{parentName:"p"},"recommended")," parameter as of now (09/03/23) ","[MM/DD/YY]",":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'av1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a " -an " -f " -an " -v " --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 " -o "output.mkv"\n')),(0,i.kt)("admonition",{title:"Parameter Meta",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"It is strongly recommended to join the ",(0,i.kt)("a",{parentName:"p",href:"https://discord.gg/vpREHAvYvh"},"AV1 Discord server")," to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general.")),(0,i.kt)("p",null,"Now let's dissect it one-by-one"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Av1an parameters:")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-i")," Input.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-x 300")," Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-w 4"),' Specifies the amount of "workers" or amount of encoders working on the video.')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--verbose")," Sets logging to verbose.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--resume")," Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \"resumed\" without the parameter in place.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-e aom")," Specifies we're using aomenc encoder which should be the default option.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-c mkvmerge")," Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"-m lsmash")," Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0).")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},'-f " -an "')," ",(0,i.kt)("inlineCode",{parentName:"p"},"-f")," Stands for ffmpeg parameters, ",(0,i.kt)("inlineCode",{parentName:"p"},"-an")," is to remove all audio since its better to encode and merge it separately. To crop use ",(0,i.kt)("inlineCode",{parentName:"p"},'-f " -an -vf crop=1920:800 "')," for example to crop the video to 1920x800.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},'-v " "')," Is where you put the encoder's parameters in.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},'-a " -an "')," FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: ",(0,i.kt)("inlineCode",{parentName:"p"},'-a " -c:a libopus -b:a 128k "'),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--photon-noise=10")," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--set-thread-affinity=2")," Pins the thread to the encoder, aligns with ",(0,i.kt)("inlineCode",{parentName:"p"},"--threads=2")," in the encoder parameter so set them accordingly."))),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"aomenc parameters:")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--bit-depth=10")," We're using 10bit because it makes the video smaller and reduces ",(0,i.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring"},"banding"),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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).")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--threads=2")," Sets the amount of threads the encoder can use, aligns with ",(0,i.kt)("inlineCode",{parentName:"p"},"--set-thread-affinity")," in Av1an.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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):"),(0,i.kt)("picture",null,(0,i.kt)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,i.kt)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",width:"1280",height:"768",loading:"lazy"})))),(0,i.kt)("admonition",{title:"Tile usage",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"Do NOT use tiles for 1080p and below, use 1 ",(0,i.kt)("inlineCode",{parentName:"p"},"tile-columns")," at 1440p (2K), 2 ",(0,i.kt)("inlineCode",{parentName:"p"},"tile-columns")," and 1 ",(0,i.kt)("inlineCode",{parentName:"p"},"tile-rows")," for 2160p (4K)")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--lag-in-frames=64")," Knockoff of x264/x265 ",(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Group_of_pictures"},"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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--aq-mode")," adaptive quantization mode, 0 is better most of the time")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--tune-content=psy --tune=ssim")," As the name suggests they are tunes that affect the video output, for the better, and for the worst"))),(0,i.kt)("admonition",{title:"Tunes to use",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Set ",(0,i.kt)("inlineCode",{parentName:"p"},"tune-content")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"animation")," if you're encoding above ",(0,i.kt)("inlineCode",{parentName:"p"},"cq-level=30")," A.K.A lower quality, despite it's name\nSet ",(0,i.kt)("inlineCode",{parentName:"p"},"tune-content")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"psy")," for everything else, ",(0,i.kt)("strong",{parentName:"p"},"do not use if you encode above ",(0,i.kt)("inlineCode",{parentName:"strong"},"cq-level=30")),"\nFor ",(0,i.kt)("inlineCode",{parentName:"p"},"tune"),", this is a bit tricky. For now, the meta seems to be ",(0,i.kt)("inlineCode",{parentName:"p"},"ssim"),", but back then it was ",(0,i.kt)("inlineCode",{parentName:"p"},"lavish")," which is considered THE best tune because it's based on ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/google/butteraugli"},"butteraugli"),". Now it's fallen behind because its more blurry than ",(0,i.kt)("inlineCode",{parentName:"p"},"ssim"),", and before that it was ",(0,i.kt)("inlineCode",{parentName:"p"},"butteraugli"),", and then ",(0,i.kt)("inlineCode",{parentName:"p"},"ipq_vmaf_psy"),", and finally just ",(0,i.kt)("inlineCode",{parentName:"p"},"ipq"),".\nIf you use any of the VMAF tunes, ",(0,i.kt)("strong",{parentName:"p"},"you need to specify ",(0,i.kt)("inlineCode",{parentName:"strong"},"--vmaf-model-path=")," to where you put it"),".")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--sb-size=dynamic")," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--deltaq-mode")," set to 0 because its just better.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--disable-kf --enable-fwd-kf=0")," We're disabling keyframes cause ",(0,i.kt)("strong",{parentName:"p"},"Av1an already did scene detection, so we wont have to."),". And it speeds things up.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1")," Parameters that give you free efficiency boost.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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."))),(0,i.kt)("admonition",{title:"Concatenation Error on Linux",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Run ",(0,i.kt)("inlineCode",{parentName:"p"},"ulimit -n 200000"),", resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ",(0,i.kt)("inlineCode",{parentName:"p"},"mkvmerge @../options.json"))),(0,i.kt)("h2",{id:"merging-everything"},"Merging Everything"),(0,i.kt)("p",null,"Once you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into ",(0,i.kt)("inlineCode",{parentName:"p"},"mp4"),", just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental."),(0,i.kt)("h2",{id:"tips--tricks"},"Tips & Tricks"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--denoise-noise-level=10")," Alternative to ",(0,i.kt)("inlineCode",{parentName:"p"},"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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--butteraugli-resize-factor=2")," if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and ",(0,i.kt)("inlineCode",{parentName:"p"},"--butteraugli-intensity-target=250")," to match the content light level."))),(0,i.kt)("h2",{id:"final-thoughts"},"Final Thoughts"),(0,i.kt)("p",null,'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!'),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},(0,i.kt)("strong",{parentName:"p"},"Guide originally hosted on ",(0,i.kt)("a",{parentName:"strong",href:"https://rentry.co/AV1"},"https://rentry.co/AV1"),", rewrite and migration by Simulping."))))}d.isMDXComponent=!0},9081:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/compare-guide-6feb966fbd9d73be4a3097c41691c4ad.webp"},5900:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/python-path-a89fc4fe6c6eb4c2ea0a7610dd2cf09a.webp"}}]); \ No newline at end of file diff --git a/assets/js/632d0ef1.e6e421a3.js b/assets/js/632d0ef1.e6e421a3.js new file mode 100644 index 000000000..7d19d5213 --- /dev/null +++ b/assets/js/632d0ef1.e6e421a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1979],{2233:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=t(5893),i=t(1151);const r={title:"VTM",sidebar_position:11},s="VTM",c={id:"encoders/VTM",title:"VTM",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/encoders/VTM.mdx",sourceDirName:"encoders",slug:"/encoders/VTM",permalink:"/docs/encoders/VTM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/VTM.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"VTM",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"uvg266",permalink:"/docs/encoders/uvg266"},next:{title:"AVM",permalink:"/docs/encoders/AVM"}},d={},a=[];function u(e){const n={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"vtm",children:"VTM"}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(n.p,{children:["VTM is the original ",(0,o.jsx)(n.a,{href:"/docs/video/VVC",children:"H.266"})," (better known as VVC) reference encoder, in competition with alternatives like ",(0,o.jsx)(n.a,{href:"/docs/encoders/VVenC",children:"VVenC"}),". In the modern day, it joins other MPEG reference encoders such as ",(0,o.jsx)(n.a,{href:"/docs/encoders/HM",children:"HM"})," & ",(0,o.jsx)(n.a,{href:"/docs/encoders/JM",children:"JM"})," in their reputations for being highly niche offerings that are used rarely due to their usage complexity & speed disadvantages; however, VTM may be more useful due to the current difficulty facing VVC encoding regardless of the encoding implementation one chooses to use. x264 is more efficient than JM."]})]})}function l(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(7294);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6549b2b5.e40d93c8.js b/assets/js/6549b2b5.e40d93c8.js new file mode 100644 index 000000000..8691c90a5 --- /dev/null +++ b/assets/js/6549b2b5.e40d93c8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7198],{4461:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>n,metadata:()=>r,toc:()=>c});var s=t(5893),o=t(1151);const n={title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/site-optimization",source:"@site/blog/2023-07-21-site-optimization.mdx",title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"image",permalink:"/blog/tags/image"},{label:"web",permalink:"/blog/tags/web"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:9.255,hasTruncateMarker:!0,authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg",imageURL:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg",imageURL:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},l={authorsImageUrls:[void 0,void 0]},c=[{value:"Fire & Forget",id:"fire--forget",level:2},{value:"Massive Improvement",id:"massive-improvement",level:2},{value:"Lazy Loading",id:"lazy-loading",level:3},{value:"New Codecs",id:"new-codecs",level:2},{value:"Fallbacks",id:"fallbacks",level:3},{value:"Compression Efficacy",id:"compression-efficacy",level:3},{value:"Responsive Images",id:"responsive-images",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.p,{children:"A big part of understanding any multimedia codec technology is knowing the application for such technology."}),"\n",(0,s.jsx)(i.p,{children:"For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics."}),"\n",(0,s.jsx)(i.admonition,{type:"caution",children:(0,s.jsxs)(i.p,{children:["These instructions are for ",(0,s.jsx)(i.em,{children:"photographic"})," images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently."]})}),"\n",(0,s.jsxs)(i.admonition,{type:"danger",children:[(0,s.jsx)(i.p,{children:"Many images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:"}),(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})," | ",(0,s.jsxs)(i.em,{children:["Linux, ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"macOS"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/thorium/releases/",children:"Windows"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"Android"})]})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://www.waterfox.net/",children:"Waterfox"})," | ",(0,s.jsxs)(i.em,{children:[(0,s.jsx)(i.a,{href:"https://flathub.org/apps/net.waterfox.waterfox",children:"Linux"}),", ",(0,s.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"macOS"}),", ",(0,s.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"Windows"})]})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})," | ",(0,s.jsxs)(i.em,{children:[(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Linux"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Windows"})]})]}),"\n"]})]}),"\n",(0,s.jsx)(i.h2,{id:"fire--forget",children:"Fire & Forget"}),"\n",(0,s.jsxs)(i.p,{children:["First, we'll illustrate what ",(0,s.jsx)(i.em,{children:"not"})," to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.em,{children:"exported straight from Darktable at JPEG q90, with no scaling"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"bloated_jpeg",src:t(3372).Z+"",width:"5470",height:"3656"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"2.2 MB"})}),"\n",(0,s.jsx)(i.h2,{id:"massive-improvement",children:"Massive Improvement"}),"\n",(0,s.jsx)(i.p,{children:"The easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway."}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.img,{alt:"box-size-mac",src:t(6819).Z+""}),"\n",(0,s.jsx)(i.em,{children:"Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here."})]}),"\n",(0,s.jsxs)(i.p,{children:["The width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with ",(0,s.jsx)(i.code,{children:"cjpegli"}),", looks like this:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jpeg",src:t(4642).Z+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:["Obviously, there's lost fidelity compared to the original, but considering this is ",(0,s.jsx)(i.em,{children:"so much smaller"}),", it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of ",(0,s.jsx)(i.code,{children:"cjpegli"}),", although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size."]}),"\n",(0,s.jsxs)(i.p,{children:["2.2 MB -> ",(0,s.jsx)(i.strong,{children:"233 kB"})]}),"\n",(0,s.jsx)(i.h3,{id:"lazy-loading",children:"Lazy Loading"}),"\n",(0,s.jsxs)(i.p,{children:["A bonus tip is to add the ",(0,s.jsx)(i.code,{children:'loading="lazy"'})," attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'<picture>\n <img src="/images/jpeg_fallback.jpg" alt="alt text" width="XX" height="YY" loading="lazy" />\n</picture> \n'})}),"\n",(0,s.jsx)(i.h2,{id:"new-codecs",children:"New Codecs"}),"\n",(0,s.jsxs)(i.p,{children:["If you desire further improvement, it may be time to consider using a newer codec like ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/AVIF",children:"AVIF"})," or ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/JXL",children:"JPEG-XL"}),". These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider ",(0,s.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"})," or ",(0,s.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering ",(0,s.jsx)(i.em,{children:"lossy"})," compression for ",(0,s.jsx)(i.em,{children:"photographic"})," images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now."]}),"\n",(0,s.jsx)(i.h3,{id:"fallbacks",children:"Fallbacks"}),"\n",(0,s.jsx)(i.p,{children:"AVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'<picture>\n <source srcset="/img/jxl_image.jxl" type="image/jxl" />\n <source srcset="/img/avif_image.avif" type="image/avif" />\n <source srcset="/img/webp_fback.webp" type="image/webp" />\n <img src="/images/jpeg_fallback.jpg" alt="alt text" width="XX" height="YY" loading="lazy" />\n</picture> \n'})}),"\n",(0,s.jsx)(i.p,{children:"Here is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most."}),"\n",(0,s.jsx)(i.h3,{id:"compression-efficacy",children:"Compression Efficacy"}),"\n",(0,s.jsxs)(i.p,{children:["Let's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with ",(0,s.jsx)(i.code,{children:"cjpegli"})," (which scores ~",(0,s.jsx)(i.code,{children:"83.01"})," with the ",(0,s.jsx)(i.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," visual fidelity metric)."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jxl",src:t(3086).Z+""})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"137.0 kB"})," ",(0,s.jsxs)(i.em,{children:["JPEG-XL image, encoded with ",(0,s.jsx)(i.code,{children:"cjxl lossless.png out.jxl -d 1.49 -e 9"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.04"})]})," ",(0,s.jsx)(i.em,{children:"3.06s user time"})]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_avif",src:t(6309).Z+""})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"124.8 kB"})," ",(0,s.jsxs)(i.em,{children:["AVIF image, encoded with ",(0,s.jsx)(i.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.03"})]})," ",(0,s.jsx)(i.em,{children:"7.54s user time"})]}),"\n",(0,s.jsxs)(i.p,{children:["JXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the ",(0,s.jsx)(i.code,{children:"ssimulacra2"})," program decodes JPEG & JXL. Either way, the scores are fairly close."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jxl_jpeg-recomp",src:t(8545).Z+""})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"189.4 kB"})," ",(0,s.jsxs)(i.em,{children:["JPEG-XL image from JPEG, encoded with ",(0,s.jsx)(i.code,{children:"cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11"}),". Score: ~",(0,s.jsx)(i.code,{children:"84.92"})," (???)"]})," ",(0,s.jsx)(i.em,{children:"0.67s user time"})]}),"\n",(0,s.jsxs)(i.p,{children:["The final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with ",(0,s.jsx)(i.code,{children:"cjpegli"})," encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine)."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jpeg_xyb",src:t(2282).Z+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"208.3 kB"})," ",(0,s.jsxs)(i.em,{children:["XYB JPEG, encoded with ",(0,s.jsx)(i.code,{children:"cjpegli lossless.png out.jpg --xyb -d 1.155"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.04"})]})," ",(0,s.jsx)(i.em,{children:"0.10s user time"})]}),"\n",(0,s.jsx)(i.p,{children:"In this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode."}),"\n",(0,s.jsx)(i.h2,{id:"responsive-images",children:"Responsive Images"}),"\n",(0,s.jsxs)(i.p,{children:["Displaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the ",(0,s.jsx)(i.a,{href:"https://ausi.github.io/respimagelint/",children:"Responsive Image Linter"})," that can help us figure out which image sizes we should be using."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"responsive_image_linter",src:t(6294).Z+""})}),"\n",(0,s.jsx)(i.p,{children:"In our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'<picture>\n\u2003\u2003<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)" />\n\u2003\u2003<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)" />\n\u2003\u2003<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" />\n</picture>\n'})}),"\n",(0,s.jsx)(i.p,{children:"It is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"srcset"})," = the images available to your browser to serve, & their respective widths"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"sizes"})," = the conditions given to the browser explaining under what conditions should it serve which image"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"(min-width: XXXpx) YYYpx"})," = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels * display scaling."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"calc(100vw - 24px)"})," = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have ",(0,s.jsx)(i.code,{children:"(min-width: 997px) calc(75vw - 257px)"}),". This means given the viewport is at least 997px wide, calculate 0.75 * the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified."]}),"\n"]}),"\n",(0,s.jsx)("picture",{children:(0,s.jsxs)(i.p,{children:["\u2003\u2003",(0,s.jsx)("source",{type:"image/jxl",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jxl 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jxl 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jxl 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jxl 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jxl 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),"\n\u2003\u2003",(0,s.jsx)("source",{type:"image/avif",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.avif 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.avif 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.avif 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.avif 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.avif 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),"\n\u2003\u2003",(0,s.jsx)("img",{loading:"lazy",width:"1699",height:"1136",alt:"alt text",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jpg 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jpg 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jpg 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jpg 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jpg 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)",src:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/_DSC8466-smaller.jpg"})]})}),"\n",(0,s.jsxs)(i.p,{children:["That's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their ",(0,s.jsx)(i.a,{href:"https://autocompressor.net/blog/reduce-image-load",children:"Reduce Your Page's Image Load"})," blog post when writing this entry. I have ",(0,s.jsx)(i.a,{href:"https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI",children:"confirmed"})," with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0."]})]})}function d(e={}){const{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8545:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-recomp-f3af6d54a8c1c62cda0c2d3ba048e1fc.jxl"},2282:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-xyb-0372077e225cf7b460ec9238bb2a65f9.jpg"},6309:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-452ed8f5a33da727be398450e7e580a3.avif"},4642:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-48eaf650a417558ea976bf40eee82f67.jpg"},3086:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-492a0639fb771671738062a57b2015a2.jxl"},3372:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/_DSC8466-d51a7e87bed86d101412ba728ebc6be2.jpg"},6819:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/box-size-mac-f49e702b0cb4a531f65283ad604d4b4c.avif"},6294:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/responsive_image_linter-178eb56c12557c53a2b129dd75925fe9.avif"},1151:(e,i,t)=>{t.d(i,{Z:()=>r,a:()=>a});var s=t(7294);const o={},n=s.createContext(o);function a(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/68409bcb.1b3a7739.js b/assets/js/68409bcb.1b3a7739.js deleted file mode 100644 index 2df9ee474..000000000 --- a/assets/js/68409bcb.1b3a7739.js +++ /dev/null @@ -1 +0,0 @@ -"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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=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<o;p++)i[p]=r[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}u.displayName="MDXCreateElement"},995:(e,t,r)=>{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/6875c492.3e329360.js b/assets/js/6875c492.3e329360.js deleted file mode 100644 index c06db70b3..000000000 --- a/assets/js/6875c492.3e329360.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8610],{9703:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(7294),l=a(5999),r=a(2244);function s(e){const{metadata:t}=e,{previousPage:a,nextPage:s}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),s&&n.createElement(r.Z,{permalink:s,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(7294),l=a(9460),r=a(390);function s(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},1714:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var n=a(7294),l=a(6010),r=a(5999),s=a(8824),o=a(1944),i=a(5281),c=a(9960),g=a(9058),m=a(9703),p=a(197),u=a(9985);function d(e){const t=function(){const{selectMessage:e}=(0,s.c)();return t=>e(t,(0,r.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,r.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function h(e){let{tag:t}=e;const a=d(t);return n.createElement(n.Fragment,null,n.createElement(o.d,{title:a}),n.createElement(p.Z,{tag:"blog_tags_posts"}))}function b(e){let{tag:t,items:a,sidebar:l,listMetadata:s}=e;const o=d(t);return n.createElement(g.Z,{sidebar:l},n.createElement("header",{className:"margin-bottom--xl"},n.createElement("h1",null,o),n.createElement(c.Z,{href:t.allTagsPath},n.createElement(r.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),n.createElement(u.Z,{items:a}),n.createElement(m.Z,{metadata:s}))}function E(e){return n.createElement(o.FG,{className:(0,l.Z)(i.k.wrapper.blogPages,i.k.page.blogTagPostListPage)},n.createElement(h,e),n.createElement(b,e))}}}]); \ No newline at end of file diff --git a/assets/js/6875c492.af4fc838.js b/assets/js/6875c492.af4fc838.js new file mode 100644 index 000000000..af89841b0 --- /dev/null +++ b/assets/js/6875c492.af4fc838.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8610],{9703:(e,t,n)=>{n.d(t,{Z:()=>l});n(7294);var s=n(5999),a=n(2244),i=n(5893);function l(e){const{metadata:t}=e,{previousPage:n,nextPage:l}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.Z,{permalink:n,title:(0,i.jsx)(s.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),l&&(0,i.jsx)(a.Z,{permalink:l,title:(0,i.jsx)(s.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},9985:(e,t,n)=>{n.d(t,{Z:()=>l});n(7294);var s=n(9460),a=n(390),i=n(5893);function l(e){let{items:t,component:n=a.Z}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.n,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},1714:(e,t,n)=>{n.r(t),n.d(t,{default:()=>f});n(7294);var s=n(6010),a=n(5999),i=n(8824),l=n(1944),r=n(5281),o=n(9960),c=n(1460),d=n(9703),g=n(197),u=n(9985),h=n(2212),p=n(7955),m=n(5893);function x(e){const t=function(){const{selectMessage:e}=(0,i.c)();return t=>e(t,(0,a.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,a.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function j(e){let{tag:t}=e;const n=x(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(l.d,{title:n}),(0,m.jsx)(g.Z,{tag:"blog_tags_posts"})]})}function b(e){let{tag:t,items:n,sidebar:s,listMetadata:i}=e;const l=x(t);return(0,m.jsxs)(c.Z,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(h.Z,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(p.Z,{as:"h1",children:l}),(0,m.jsx)(o.Z,{href:t.allTagsPath,children:(0,m.jsx)(a.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(u.Z,{items:n}),(0,m.jsx)(d.Z,{metadata:i})]})}function f(e){return(0,m.jsxs)(l.FG,{className:(0,s.Z)(r.k.wrapper.blogPages,r.k.page.blogTagPostListPage),children:[(0,m.jsx)(j,{...e}),(0,m.jsx)(b,{...e})]})}},2212:(e,t,n)=>{n.d(t,{Z:()=>h});n(7294);var s=n(6010),a=n(5999),i=n(5742),l=n(5893);function r(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.Z,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(5281),g=n(9047);function u(e){let{className:t}=e;return(0,l.jsx)(g.Z,{type:"caution",title:(0,l.jsx)(r,{}),className:(0,s.Z)(t,d.k.common.unlistedBanner),children:(0,l.jsx)(o,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(u,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/68768e4f.e985787d.js b/assets/js/68768e4f.e985787d.js deleted file mode 100644 index 77f12da58..000000000 --- a/assets/js/68768e4f.e985787d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5676],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=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 a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(n),m=i,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:i,o[1]=l;for(var s=2;s<a;s++)o[s]=n[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},6433:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var r=n(7462),i=(n(7294),n(3905));const a={label:"HM",sidebar_position:13},o="HM",l={unversionedId:"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.",source:"@site/docs/encoders/HM.md",sourceDirName:"encoders",slug:"/encoders/HM",permalink:"/docs/encoders/HM",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/HM.md",tags:[],version:"current",sidebarPosition:13,frontMatter:{label:"HM",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"AVM",permalink:"/docs/encoders/AVM"},next:{title:"JM",permalink:"/docs/encoders/JM"}},c={},s=[{value:"Building",id:"building",level:2},{value:"Usage",id:"usage",level:2}],p={toc:s},u="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"hm"},"HM"),(0,i.kt)("admonition",{title:"Pending Review",type:"caution"},(0,i.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,i.kt)("p",null,"HM is the original ",(0,i.kt)("a",{parentName:"p",href:"/docs/video/HEVC"},"H.265")," reference encoder, predating alternatives like ",(0,i.kt)("a",{parentName:"p",href:"/docs/encoders/x265"},"x265"),". In the modern day, it joins other MPEG reference encoders such as ",(0,i.kt)("a",{parentName:"p",href:"/docs/encoders/JM"},"JM")," & ",(0,i.kt)("a",{parentName:"p",href:"/docs/encoders/VTM"},"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."),(0,i.kt)("p",null,"HM is capable of producing higher quality streams than highly tuned x265, even at excruciatingly slow speeds. This is only a theoretical advantage, though, as HM is incapable of placing keyframes automatically with scene detection & would need a chunking too reminiscent of ",(0,i.kt)("a",{parentName:"p",href:"/docs/utilities/av1an"},"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."),(0,i.kt)("h2",{id:"building"},"Building"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://vcgit.hhi.fraunhofer.de/jvet/HM\ncd HM/\nmkdir build && cd build\ncmake .. -DCMAKE_BUILD_TYPE=Release\nmake -j$(nproc)\n")),(0,i.kt)("p",null,"The binary ",(0,i.kt)("inlineCode",{parentName:"p"},"TAppEncoderStatic")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"TAppEncoder")," can be found within the cloned directories, & can be copied to ",(0,i.kt)("inlineCode",{parentName:"p"},"/usr/local/bin")," for encoding. Decoding & other functions of the reference codec implementation aren't covered in this entry."),(0,i.kt)("h2",{id:"usage"},"Usage"),(0,i.kt)("p",null,"Here is a sample command: ",(0,i.kt)("inlineCode",{parentName:"p"},"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")),(0,i.kt)("p",null,"Make sure only to use only YUV input when encoding with HM. Each parameter does the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-i input.yuv -b out.265"))),(0,i.kt)("p",null,"Specifies a raw YUV input file & an output raw h265 bitstream. To mux into an MP4 container, it is recommended that you use ",(0,i.kt)("a",{parentName:"p",href:"/docs/utilities/mp4box"},"mp4box")," instead of muxing with ",(0,i.kt)("a",{parentName:"p",href:"/docs/utilities/ffmpeg"},"FFmpeg"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-c [path/to/config]"))),(0,i.kt)("p",null,"Specifies the desired path to your HM configuration file. This makes it easier to encode without having to manually specify a plethora of settings."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-wdt 1280 -hgt 720"))),(0,i.kt)("p",null,"Sets the input & output width & height."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-fr 50 -f 500"))),(0,i.kt)("p",null,"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."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-q 27"))),(0,i.kt)("p",null,"Sets a quality target for the encoder."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-xPS 0"))),(0,i.kt)("p",null,"Zero clue what this does. If someone has an idea, please contribute!"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6bdd9a40.56f3b23d.js b/assets/js/6bdd9a40.56f3b23d.js deleted file mode 100644 index c974deef9..000000000 --- a/assets/js/6bdd9a40.56f3b23d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[60],{5745:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/6be474c2.aa437e6f.js b/assets/js/6be474c2.aa437e6f.js deleted file mode 100644 index fc0ff5692..000000000 --- a/assets/js/6be474c2.aa437e6f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1157],{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 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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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},u=function(e){var t=p(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)}},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"]),l=p(r),f=o,m=l["".concat(s,".").concat(f)]||l[f]||d[f]||i;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));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 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 p=2;p<i;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},3296:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={label:"VP9",sidebar_position:5},a="VP9",c={unversionedId:"video/VP9",id:"video/VP9",title:"VP9",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VP9.md",sourceDirName:"video",slug:"/video/VP9",permalink:"/docs/video/VP9",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VP9.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"VP9",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"VP8",permalink:"/docs/video/VP8"},next:{title:"AV1",permalink:"/docs/video/AV1"}},s={},p=[],u={toc:p},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:"vp9"},"VP9"),(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,"VP9, famous for being YouTube's codec of choice for many years, is a royalty free video compression format that competes with ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/HEVC"},"HEVC")," and ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AVC"},"AVC"),". It is slightly less efficient than HEVC in terms of visual quality, but VP9 is a computationally much simpler codec and therefore is very easy on system resources when decoding. If you're interested in VP9 encoding, please see the ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/vpxenc"},"vpxenc")," or ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/SVT-VP9"},"SVT-VP9")," sections."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6bf0f114.c6008a52.js b/assets/js/6bf0f114.c6008a52.js new file mode 100644 index 000000000..9a6f16977 --- /dev/null +++ b/assets/js/6bf0f114.c6008a52.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6838],{6985:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>n,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var s=t(5893),o=t(1151);const a={label:"ZIP",sidebar_position:1},n="ZIP",r={id:"data/zip",title:"ZIP",description:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.",source:"@site/docs/data/zip.mdx",sourceDirName:"data",slug:"/data/zip",permalink:"/docs/data/zip",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/zip.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"ZIP",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"ProRes",permalink:"/docs/video/prores"},next:{title:"gzip",permalink:"/docs/data/gzip"}},d={},c=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"History",id:"history",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Linux & macOS",id:"linux--macos",level:4},{value:"Windows",id:"windows",level:4},{value:"Conclusion",id:"conclusion",level:2}];function l(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"zip",children:"ZIP"}),"\n",(0,s.jsx)(i.admonition,{title:"Pending Review",type:"caution",children:(0,s.jsx)(i.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,s.jsxs)(i.p,{children:["ZIP is an archive file format that supports lossless data compression. A ZIP file may contain one or more files or directories that may have been compressed using any one of a number of different algorithms present in the ZIP specification. The most common algorithm used in ZIP is DEFLATE, which is also used in ",(0,s.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," & ",(0,s.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"Deflate acts as a combination of LZ77 lossless coding & Huffman coding, where it can first use LZ77 to find patterns in the data & reduce redundancy. This is followed by using Huffman coding to assign smaller bit values to patterns found more frequently by LZ77."}),"\n",(0,s.jsx)(i.p,{children:"Additionally, files in a ZIP archive are compressed individually so it is possible to extract existing files or add new ones without applying compression or decompression to the entire archive."}),"\n",(0,s.jsxs)(i.p,{children:['ZIP is noteworthy for its nearly universal compatibility. "Traditional ZIP" (compression method 8 in the ZIP specification) limits the size of compressed archives to 4 GB, though most ZIP compressors use Deflate64(tm) (compression level 9 in the ZIP specification) to bypass this limitation. ZIP is competitive with ',(0,s.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," and has been succeeded many times by formats & algorithms such as ",(0,s.jsx)(i.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/brotli",children:"brotli"})," (to a degree), and ",(0,s.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,s.jsx)(i.p,{children:'DEFLATE is an LZ77-based compressor that finds repeated sequences of bytes in the input data and replaces them with shorter references to previous occurrences. It also uses Huffman coding to encode the symbols with variable-length codes based on how frequently they occur. DEFLATE has two modes for each block of compressed data: These are specified as either "static" or "dynamic" Huffman compressed blocks. In static mode, the Huffman codes are fixed and predefined. In dynamic mode, the Huffman codes are generated dynamically & transmitted along with the compressed data.'}),"\n",(0,s.jsx)(i.p,{children:"ZIP files have a specific structure that consists of four main file header components: local file headers, central directory file headers, end of central directory record, and data descriptors. The local file headers store information about each compressed file, such as its name, size, CRC-32 checksum, compression method, and optional extra fields. The central directory file headers store similar information as the local file headers, but also include the offset of each local file header in the ZIP file. The end of central directory record marks the end of the ZIP file and contains information about the number and size of the central directory file headers. The data descriptors are optional and store additional information about the compressed data, such as its CRC-32 checksum, uncompressed size, & compressed size."}),"\n",(0,s.jsxs)(i.p,{children:["ZIP files can also support other compression methods, such as Deflate64(tm), BZIP2, LZMA, & ",(0,s.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),". These methods are not widely supported by most ZIP utilities and may cause compatibility issues. ZIP files can also contain uncompressed data. The format also supports encryption to protect the data from unauthorized access. There are two types of encryption supported by ZIP: traditional ZipCrypto encryption and strong encryption. ZipCrypto encryption is considered insecure, while stronger encryption in ZIP uses more resilient algorithms albiet spread across a number of standards. Because of this, strong encryption is not standardized and may cause compatibility issues."]}),"\n",(0,s.jsx)(i.p,{children:"ZIP files can reduce the size of files and folders by more efficiently representing redundant data. They can also combine multiple files and folders into a single archive that can be easily transferred or stored. You will not find a more popular implementation than ZIP for general data compression purposes like these. ZIP files can also preserve the metadata of the original files, such as their names, paths, dates, and attributes. However, ZIP files also have some limitations and concerns. For example, traditional ZIP files (that aren't ZIP64) have a maximum size of 4 gigabytes for each compressed file and 65,535 entries for each archive. Most ZIP implementations do not support symbolic links or hard links within the archive."}),"\n",(0,s.jsxs)(i.p,{children:['Additionally, ZIP can be encoded in a number of different ways. Apple has a default "Compress" option in Finder that compresses selected files into a ZIP file, and many Linux desktops offer GUI functionality for creating ZIP files easily as well. It is common to compress to ZIP on Windows using the 7-zip data compression & decompression utility (not to be confused with the ',(0,s.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip compression format"}),", though the two are related)."]}),"\n",(0,s.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,s.jsx)(i.p,{children:"The ZIP format was developed by Phil Katz as an open format with an open specification, where his implementation, PKZIP, was shareware."}),"\n",(0,s.jsxs)(i.p,{children:["A ",(0,s.jsx)(i.a,{href:"http://www.digitalpreservation.gov/formats/fdd/fdd000361.shtml",children:"restricted ZIP format"})," exists and is used in other filetypes such as Java .jar archives, a slew of Microsoft Office file formats, Office Document Format files (.odt, .ods, .odp), and EPUB files for e-readers."]}),"\n",(0,s.jsxs)(i.p,{children:['In around 1990, Info-ZIP came onto the scene. "Info-ZIP\'s purpose is to provide free, portable, high-quality versions of the Zip and UnZip compressor-archiver utilities that are compatible with the DOS-based PKZIP by PKWARE, Inc." (',(0,s.jsx)(i.a,{href:"https://infozip.sourceforge.net/",children:"https://infozip.sourceforge.net/"}),"). They did this successfully, leading to increased adoption of the ZIP format."]}),"\n",(0,s.jsxs)(i.p,{children:["In the early 1990s the ",(0,s.jsx)(i.a,{href:"/docs/data/gzip",children:"gzip"})," format was developed, derived from the Deflate code in the Info-ZIP utilities. It was designed to replace the Unix ",(0,s.jsx)(i.code,{children:"compress"})," utility, which used the (at the time) patented LZW compression algorithm which threatened its free use. Though some specific implementations of Deflate were patented by Phil Katz, the format was not, so a Deflate implementation that did not infringe on any patents was written."]}),"\n",(0,s.jsxs)(i.p,{children:["Unlike ",(0,s.jsx)(i.code,{children:".tar"}),", ",(0,s.jsx)(i.code,{children:".zip"})," has a central directory at the end, which provides a list of the contents. That and the separate compression provides random access to the individual entries in a ",(0,s.jsx)(i.code,{children:".zip"})," file. A ",(0,s.jsx)(i.code,{children:".tar"})," file would have to be decompressed and scanned from start to end in order to build a directory."]}),"\n",(0,s.jsxs)(i.p,{children:["The popular ",(0,s.jsx)(i.code,{children:"tar"})," utility, which creates an archive of files, has an option to compress directly to the ",(0,s.jsx)(i.code,{children:".tar.gz"})," format and is a very popular use caze for gzip. Since the compression of a ",(0,s.jsx)(i.code,{children:".tar"})," can take advantage of redundancy across files, ZIP often compresses less effectively than the marriage of tar & gz. ",(0,s.jsx)(i.code,{children:".tar.gz"})," is the most common archive format in use on Unix due to its very high portability, but there are better compression methods available. Some of these include ",(0,s.jsx)(i.a,{href:"/docs/data/xz",children:"XZ"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/bzip2",children:"bzip2"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/brotli",children:"brotli"}),", ",(0,s.jsx)(i.a,{href:"/docs/data/7z",children:"7-zip"}),", & ",(0,s.jsx)(i.a,{href:"/docs/data/zstd",children:"Zstandard"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["In this case, the benefit of ZIP is that because it compresses files separately and builds a central directory at the end of the archive which provides a list of the contents, ZIP provides random access to the individual entries in a ",(0,s.jsx)(i.code,{children:".zip"})," file. A ",(0,s.jsx)(i.code,{children:".tar"})," file would have to be decompressed and scanned from start to end in order to build a directory."]}),"\n",(0,s.jsx)(i.h2,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsx)(i.h4,{id:"linux--macos",children:"Linux & macOS"}),"\n",(0,s.jsxs)(i.p,{children:['To encode to a ZIP file most efficiently on Linux or macOS, it is worth using the 7-zip implementation of DEFLATE for ZIP compression. The 7zip website\'s homepage claims: "For ZIP and GZIP formats, 7-Zip provides a compression ratio that is 2-10 % better than the ratio provided by PKZip and WinZip." You can use the highly flexible 7-zip CLI utility through binaries available on ',(0,s.jsx)(i.a,{href:"https://www.7-zip.org/download.html",children:"7-zip's Download page"}),". Here are some direct download links: ",(0,s.jsx)(i.a,{href:"https://www.7-zip.org/a/7z2301-linux-x64.tar.xz",children:"Linux x86_64"})," | ",(0,s.jsx)(i.a,{href:"https://www.7-zip.org/a/7z2301-mac.tar.xz",children:"macOS Universal"})]}),"\n",(0,s.jsxs)(i.p,{children:["Once you've downloaded the utility, remember whether you are choosing to use the ",(0,s.jsx)(i.code,{children:"7zz"})," binary or the static ",(0,s.jsx)(i.code,{children:"7zzs"})," binary. Commands run using ",(0,s.jsx)(i.code,{children:"7zz"})," should run using ",(0,s.jsx)(i.code,{children:"7zzs"})," as well, so please replace ",(0,s.jsx)(i.code,{children:"7zz"})," in our examples as appropriate if you choose not to use it. Additionally, please copy your choice of binary to your ",(0,s.jsx)(i.code,{children:"/usr/local/bin"})," if you want to be able to use it everywhere."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"To encode a ZIP file at the lowest effort setting using one thread:"}),"\n"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:'7zz a -bso0 -tzip -mmt1 -mx1 "Output.zip" "Input"\n'})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"To encode a ZIP file at the highest effort setting using eight threads:"}),"\n"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:'7zz a -bso0 -tzip -mmt8 -mx9 "Output.zip" "Input"\n'})}),"\n",(0,s.jsx)(i.h4,{id:"windows",children:"Windows"}),"\n",(0,s.jsx)(i.p,{children:"To be filled."}),"\n",(0,s.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,s.jsx)(i.p,{children:"The only real benefit of using ZIP over more modern formats currently is compatibility. It may be viable when compared to 7z & XZ due to a reduction in complexity that improves encode & decode speed, but Zstandard is incredibly performant in both of these areas and generally outperforms ZIP. When it comes to content delivery on the Web, Brotli has been adopted across all modern web browsers and offers a better alternative to older compression technologies used on the Web that resemble ZIP."})]})}function h(e={}){const{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>r,a:()=>n});var s=t(7294);const o={},a=s.createContext(o);function n(e){const i=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:n(e.components),s.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6c179ac5.8c847a8d.js b/assets/js/6c179ac5.8c847a8d.js new file mode 100644 index 000000000..82dd4e1d9 --- /dev/null +++ b/assets/js/6c179ac5.8c847a8d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5332],{6276:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var n=i(5893),t=i(1151);const r={label:"Theora",sidebar_position:9},s="Theora",d={id:"video/Theora",title:"Theora",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/Theora.mdx",sourceDirName:"video",slug:"/video/Theora",permalink:"/docs/video/Theora",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/Theora.mdx",tags:[],version:"current",sidebarPosition:9,frontMatter:{label:"Theora",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"VC-1",permalink:"/docs/video/VC-1"},next:{title:"FFV1",permalink:"/docs/video/FFV1"}},c={},a=[{value:"Encoding",id:"encoding",level:2}];function l(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",p:"p",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"theora",children:"Theora"}),"\n",(0,n.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(o.p,{children:["Theora is a legacy video codec first released in 2004. It is derived from VP3, part of the same family of codecs that formed ",(0,n.jsx)(o.a,{href:"/docs/video/VP8",children:"VP8"}),", ",(0,n.jsx)(o.a,{href:"/docs/video/VP9",children:"VP9"})," and ",(0,n.jsx)(o.a,{href:"/docs/video/AV1",children:"AV1"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"encoding",children:"Encoding"}),"\n",(0,n.jsxs)(o.p,{children:["Theora is frequently contained within a ogg (",(0,n.jsx)(o.code,{children:".ogg"})," or ",(0,n.jsx)(o.code,{children:".ogv"}),") container with ",(0,n.jsx)(o.a,{href:"/docs/audio/Vorbis",children:"vorbis"})," audio."]}),"\n",(0,n.jsx)(o.p,{children:"To be filled."})]})}function h(e={}){const{wrapper:o}={...(0,t.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,o,i)=>{i.d(o,{Z:()=>d,a:()=>s});var n=i(7294);const t={},r=n.createContext(t);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6d85920a.647ad565.js b/assets/js/6d85920a.647ad565.js new file mode 100644 index 000000000..a5aeeb6b0 --- /dev/null +++ b/assets/js/6d85920a.647ad565.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4329],{2313:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var n=t(5893),o=t(1151);const s={title:"Terminology",sidebar_position:2},r="Terminology",a={id:"introduction/terminology",title:"Terminology",description:"When learning about encoding technology, it is important to understand the vast terminology that is often used to describe concepts that are often not very complex to understand.",source:"@site/docs/introduction/terminology.mdx",sourceDirName:"introduction",slug:"/introduction/terminology",permalink:"/docs/introduction/terminology",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/terminology.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Terminology",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Prologue",permalink:"/docs/introduction/prologue"},next:{title:"Spotting Video Artifacts",permalink:"/docs/introduction/video-artifacts"}},c={},d=[{value:"Bitstream",id:"bitstream",level:2},{value:"Lossy / Lossless",id:"lossy--lossless",level:2},{value:"Elementary stream",id:"elementary-stream",level:2},{value:"Muxing",id:"muxing",level:2},{value:"Codec",id:"codec",level:2},{value:"Filter",id:"filter",level:2},{value:"Muxer/Demuxer",id:"muxerdemuxer",level:2},{value:"Bitstream filter",id:"bitstream-filter",level:2},{value:"Container",id:"container",level:2},{value:"MP4 / M4V",id:"mp4--m4v",level:4},{value:"MOV",id:"mov",level:4},{value:"MKV / MKA / MKS / MK3D",id:"mkv--mka--mks--mk3d",level:4},{value:"WebM",id:"webm",level:4},{value:"Transcoding",id:"transcoding",level:2},{value:"RDO",id:"rdo",level:2},{value:"Perceputal / Psychovisual / Psychoacoustic",id:"perceputal--psychovisual--psychoacoustic",level:2},{value:"Discrete Cosine Transform (DCT)",id:"discrete-cosine-transform-dct",level:2}];function l(e){const i={a:"a",em:"em",h1:"h1",h2:"h2",h4:"h4",p:"p",strong:"strong",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"terminology",children:"Terminology"}),"\n",(0,n.jsx)(i.p,{children:"When learning about encoding technology, it is important to understand the vast terminology that is often used to describe concepts that are often not very complex to understand."}),"\n",(0,n.jsx)(i.h2,{id:"bitstream",children:"Bitstream"}),"\n",(0,n.jsxs)(i.p,{children:["A ",(0,n.jsx)(i.em,{children:"bitstream"})," or ",(0,n.jsx)(i.em,{children:"bit stream"})," is a media file, the kind that is played in a media player. It consists of a ",(0,n.jsx)(i.a,{href:"#container",children:"container"})," wrapping multiple ",(0,n.jsx)(i.a,{href:"#elementary-stream",children:"elementary streams"})]}),"\n",(0,n.jsx)(i.h2,{id:"lossy--lossless",children:"Lossy / Lossless"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.em,{children:"Lossy"})," encoding throws out some of the detail to achieve a smaller size. Often, this is an acceptable trade-off, but if you need a perfect recreation of the data, you need ",(0,n.jsx)(i.em,{children:"lossless"})," encoding."]}),"\n",(0,n.jsx)(i.h2,{id:"elementary-stream",children:"Elementary stream"}),"\n",(0,n.jsxs)(i.p,{children:["An elementary stream is an audio, video, or subtitle track. Basically, it's the compressed data you want to ",(0,n.jsx)(i.a,{href:"#muxing",children:"mux"})," into the container."]}),"\n",(0,n.jsx)(i.h2,{id:"muxing",children:"Muxing"}),"\n",(0,n.jsx)(i.p,{children:"Putting elementary streams into a container, which preserves them without making any changes to the data."}),"\n",(0,n.jsx)(i.h2,{id:"codec",children:"Codec"}),"\n",(0,n.jsxs)(i.p,{children:["A codec (",(0,n.jsx)(i.strong,{children:"co"}),"der/",(0,n.jsx)(i.strong,{children:"dec"}),"oder) is the piece of code that actually encodes the data you put in. It takes as input and produces as output an elementary stream. More information is provided ",(0,n.jsx)(i.a,{href:"/docs/introduction/prologue#what-is-a-codec",children:"in the prologue"}),' under "What is a Codec".']}),"\n",(0,n.jsx)(i.h2,{id:"filter",children:"Filter"}),"\n",(0,n.jsx)(i.p,{children:"A filter is a piece of code you can apply to the data to make something about it different, for instance sharpening, removing artifacts, shakiness, denoising, scaling, overlay, etc."}),"\n",(0,n.jsx)(i.h2,{id:"muxerdemuxer",children:"Muxer/Demuxer"}),"\n",(0,n.jsxs)(i.p,{children:["The pieces of code that ",(0,n.jsx)(i.a,{href:"#muxing",children:"mux"})," or do the reverse, getting elementary streams from the container."]}),"\n",(0,n.jsx)(i.h2,{id:"bitstream-filter",children:"Bitstream filter"}),"\n",(0,n.jsxs)(i.p,{children:["A bitstream filter is a filter that is directly applied to the ",(0,n.jsx)(i.a,{href:"#bitstream",children:"bitstream"})," in order to change something about the container, for instance, convert frame types, or corrupt some packets."]}),"\n",(0,n.jsx)(i.h2,{id:"container",children:"Container"}),"\n",(0,n.jsxs)(i.p,{children:["A container is a format for putting one or more elementary streams into one file, which is then called a ",(0,n.jsx)(i.a,{href:"#bitstream",children:"bitstream"}),"."]}),"\n",(0,n.jsx)(i.p,{children:'A video container is a digital file format that holds video and audio data, as well as additional information such as subtitles, metadata, and chapter markers. It acts as a "wrapper" that packages all these elements into a single file that can be played on various devices and software platforms. Think of it like a container you might use to transport goods - the video and audio data are like the items being transported, while the container itself provides a structure and organization for the contents.'}),"\n",(0,n.jsx)(i.p,{children:"Some kinds of containers:"}),"\n",(0,n.jsx)(i.h4,{id:"mp4--m4v",children:"MP4 / M4V"}),"\n",(0,n.jsxs)(i.p,{children:["This is likely the most common container you've encountered, & has near universal compatibility. Has a limited maximum amount of streams. The supported video codecs are ",(0,n.jsx)(i.a,{href:"/docs/video/AVC",children:"H.264"}),", ",(0,n.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,n.jsx)(i.a,{href:"/docs/video/VVC",children:"H.266"}),", DivX, Xvid, ",(0,n.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"})," (Unofficial, hacky), and ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," (Unofficial, hacky). For audio codecs it's many of the various flavors of ",(0,n.jsx)(i.a,{href:"/docs/audio/AAC",children:"AAC"}),", ",(0,n.jsx)(i.a,{href:"/docs/audio/MP3",children:"MP3"}),", ",(0,n.jsx)(i.a,{href:"/docs/audio/FLAC",children:"FLAC"})," (Unofficial), ",(0,n.jsx)(i.a,{href:"/docs/audio/Opus",children:"Opus"})," (Unofficial, hacky). For subtitles only MPEG-4 Timed Text (TTXT) is supported."]}),"\n",(0,n.jsx)(i.p,{children:"The best tool to work with this container is MP4Box, but FFmpeg also works."}),"\n",(0,n.jsx)(i.h4,{id:"mov",children:"MOV"}),"\n",(0,n.jsx)(i.p,{children:"Similar to MP4, but less supported. Made with Apple Quicktime in mind, supports ProRes."}),"\n",(0,n.jsx)(i.h4,{id:"mkv--mka--mks--mk3d",children:"MKV / MKA / MKS / MK3D"}),"\n",(0,n.jsx)(i.p,{children:"Also known as Matroska, allows an unlimited amount of video/audio/subtitle streams and any codec that probably still exists in Area 51, you can put literally anything in there and it won't even care, MPEG-2/DivX/H.266/Theora/Thor/RealVideo/MJPEG/AVS3/AMR-WB, you name it. All around best container for working with if you have the choice."}),"\n",(0,n.jsx)(i.h4,{id:"webm",children:"WebM"}),"\n",(0,n.jsxs)(i.p,{children:["A container made with web streaming in mind. WebM is stripped-down MKV that only allows free & open source codecs such as VP8, VP9 & AV1 for video, Vorbis & Opus for audio, and ",(0,n.jsx)(i.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," for subtitles."]}),"\n",(0,n.jsx)(i.h2,{id:"transcoding",children:"Transcoding"}),"\n",(0,n.jsxs)(i.p,{children:["Taking an elementary stream & converting it to another format, lossless or lossy, using an encoder of some kind. For example, if I convert a lossless ",(0,n.jsx)(i.a,{href:"/docs/video/FFV1",children:"FFV1"})," video to lossy AV1 using an encoder, let's say ",(0,n.jsx)(i.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", I have ",(0,n.jsx)(i.em,{children:"transcoded"})," this lossless video to AV1. Transcoding doesn't have anything to do with the container."]}),"\n",(0,n.jsx)(i.h2,{id:"rdo",children:"RDO"}),"\n",(0,n.jsxs)(i.p,{children:["RDO, or Rate-Distortion Optimization, is a technique used to find the best trade-off between the bit rate & the quality of lossily encoded content. RDO can be metric-based, optimizing to score well on metrics like ",(0,n.jsx)(i.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," or ",(0,n.jsx)(i.a,{href:"/docs/metrics/SSIM",children:"SSIM"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"perceputal--psychovisual--psychoacoustic",children:"Perceputal / Psychovisual / Psychoacoustic"}),"\n",(0,n.jsxs)(i.p,{children:['"Psychovisual quality" (for videos), "Psychoacoustic quality" (for audio), or "perceptual quality" is a term used to describe the perception of quality of 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 ',(0,n.jsx)(i.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," & ",(0,n.jsx)(i.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"discrete-cosine-transform-dct",children:"Discrete Cosine Transform (DCT)"}),"\n",(0,n.jsx)(i.p,{children:"The Discrete Cosine Transform is a mathematical transformation that can transform discrete data into the frequency domain. This discrete data could be pixels in an image/video compression block or data points recorded temporally representing an audio recording. This algorithm is a particularly good choice for image, video, music, & speech compression because it has high energy compaction relative to our understanding of 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."})]})}function h(e={}){const{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>a,a:()=>r});var n=t(7294);const o={},s=n.createContext(o);function r(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6ed27c39.27a2aa80.js b/assets/js/6ed27c39.27a2aa80.js deleted file mode 100644 index ca3458224..000000000 --- a/assets/js/6ed27c39.27a2aa80.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3241],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var u=n.createContext({}),l=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=l(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="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,u=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=l(r),m=i,b=p["".concat(u,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(b,a(a({ref:t},s),{},{components:r})):n.createElement(b,a({ref:t},s))}));function b(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 c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c[p]="string"==typeof e?e:i,a[1]=c;for(var l=2;l<o;l++)a[l]=r[l];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},543:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var n=r(7462),i=(r(7294),r(3905));const o={label:"Butteraugli",sidebar_position:1},a="Butteraugli",c={unversionedId:"metrics/butteraugli",id:"metrics/butteraugli",title:"Butteraugli",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/butteraugli.md",sourceDirName:"metrics",slug:"/metrics/butteraugli",permalink:"/docs/metrics/butteraugli",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/butteraugli.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"Butteraugli",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"VMAF",permalink:"/docs/metrics/VMAF"},next:{title:"\u25b6\ufe0f Video Players",permalink:"/docs/video-players"}},u={},l=[],s={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,i.kt)(p,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"butteraugli"},"Butteraugli"),(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!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6f58bdf2.205a89bf.js b/assets/js/6f58bdf2.205a89bf.js deleted file mode 100644 index 6c4109839..000000000 --- a/assets/js/6f58bdf2.205a89bf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1444],{3905:(e,t,o)=>{o.d(t,{Zo:()=>c,kt:()=>v});var i=o(7294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function r(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,i)}return o}function l(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?r(Object(o),!0).forEach((function(t){n(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):r(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function a(e,t){if(null==e)return{};var o,i,n=function(e,t){if(null==e)return{};var o,i,n={},r=Object.keys(e);for(i=0;i<r.length;i++)o=r[i],t.indexOf(o)>=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i<r.length;i++)o=r[i],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var s=i.createContext({}),u=function(e){var t=i.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},c=function(e){var t=u(e.components);return i.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var o=e.components,n=e.mdxType,r=e.originalType,s=e.parentName,c=a(e,["components","mdxType","originalType","parentName"]),p=u(o),m=n,v=p["".concat(s,".").concat(m)]||p[m]||d[m]||r;return o?i.createElement(v,l(l({ref:t},c),{},{components:o})):i.createElement(v,l({ref:t},c))}));function v(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=o.length,l=new Array(r);l[0]=m;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a[p]="string"==typeof e?e:n,l[1]=a;for(var u=2;u<r;u++)l[u]=o[u];return i.createElement.apply(null,l)}return i.createElement.apply(null,o)}m.displayName="MDXCreateElement"},64:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>u});var i=o(7462),n=(o(7294),o(3905));const r={label:"dovi_tool",sidebar_position:6},l="dovi_tool",a={unversionedId:"utilities/dovi_tool",id:"utilities/dovi_tool",title:"dovi_tool",description:"dovi_tool is a command line tool written in Rust combining multiple utilities for working with Dolby Vision.",source:"@site/docs/utilities/dovi_tool.md",sourceDirName:"utilities",slug:"/utilities/dovi_tool",permalink:"/docs/utilities/dovi_tool",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/dovi_tool.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"dovi_tool",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"NMKODER",permalink:"/docs/utilities/nmkoder"},next:{title:"mp4box",permalink:"/docs/utilities/mp4box"}},s={},u=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}],c={toc:u},p="wrapper";function d(e){let{components:t,...o}=e;return(0,n.kt)(p,(0,i.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"dovi_tool"},"dovi_tool"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"dovi_tool")," is a command line tool written in Rust combining multiple utilities for working with Dolby Vision."),(0,n.kt)("h2",{id:"installation"},"Installation"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Download pre-built binaries from ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/quietvoid/dovi_tool/releases"},"here"))),(0,n.kt)("p",null,"or"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Compile yourself (Rust must be installed, minimum v1.64.0 at the time of writing)")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n')),(0,n.kt)("p",null,"on Windows:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n")),(0,n.kt)("h2",{id:"usage"},"Usage"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"dovi_tool [OPTIONS] <SUBCOMMAND>\n")),(0,n.kt)("p",null,"To get more detailed options for a subcommand"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"dovi_tool <SUBCOMMAND> --help\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7015859e.7817d71b.js b/assets/js/7015859e.7817d71b.js deleted file mode 100644 index c8efd8fae..000000000 --- a/assets/js/7015859e.7817d71b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5496],{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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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)}},b=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),b=o,f=l["".concat(p,".").concat(b)]||l[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 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<i;s++)a[s]=r[s];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}b.displayName="MDXCreateElement"},4754:(e,t,r)=>{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:"bzip2",sidebar_position:3},a="bzip2",c={unversionedId:"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!",source:"@site/docs/data/bzip2.md",sourceDirName:"data",slug:"/data/bzip2",permalink:"/docs/data/bzip2",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/bzip2.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"bzip2",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"gzip",permalink:"/docs/data/gzip"},next:{title:"7-zip (7z)",permalink:"/docs/data/7z"}},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:"bzip2"},"bzip2"),(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/71e8630b.13731e2f.js b/assets/js/71e8630b.13731e2f.js deleted file mode 100644 index 5678d016d..000000000 --- a/assets/js/71e8630b.13731e2f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1015],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>f});var o=t(7294);function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function i(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?a(Object(t),!0).forEach((function(r){n(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function c(e,r){if(null==e)return{};var t,o,n=function(e,r){if(null==e)return{};var t,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)t=a[o],r.indexOf(t)>=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)t=a[o],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var s=o.createContext({}),u=function(e){var r=o.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},p=function(e){var r=u(e.components);return o.createElement(s.Provider,{value:r},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return o.createElement(o.Fragment,{},r)}},m=o.forwardRef((function(e,r){var t=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),l=u(t),m=n,f=l["".concat(s,".").concat(m)]||l[m]||d[m]||a;return t?o.createElement(f,i(i({ref:r},p),{},{components:t})):o.createElement(f,i({ref:r},p))}));function f(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var a=t.length,i=new Array(a);i[0]=m;var c={};for(var s in r)hasOwnProperty.call(r,s)&&(c[s]=r[s]);c.originalType=e,c[l]="string"==typeof e?e:n,i[1]=c;for(var u=2;u<a;u++)i[u]=t[u];return o.createElement.apply(null,i)}return o.createElement.apply(null,t)}m.displayName="MDXCreateElement"},6669:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var o=t(7462),n=(t(7294),t(3905));const a={label:"Aurora1 AV1",sidebar_position:6},i="Aurora1 AV1",c={unversionedId:"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.',source:"@site/docs/encoders/Aurora1.md",sourceDirName:"encoders",slug:"/encoders/Aurora1",permalink:"/docs/encoders/Aurora1",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/Aurora1.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"Aurora1 AV1",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"rav1e",permalink:"/docs/encoders/rav1e"},next:{title:"Kvazaar",permalink:"/docs/encoders/Kvazaar"}},s={},u=[],p={toc:u},l="wrapper";function d(e){let{components:r,...t}=e;return(0,n.kt)(l,(0,o.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"aurora1-av1"},"Aurora1 AV1"),(0,n.kt)("p",null,"Aurora1 AV1 is a proprietary software AV1 encoder developed by ",(0,n.kt)("a",{parentName:"p",href:"https://www.visionular.com/en"},"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.'))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/729fe1da.98753165.js b/assets/js/729fe1da.98753165.js deleted file mode 100644 index 4e4ad7dd6..000000000 --- a/assets/js/729fe1da.98753165.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3173],{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 c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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):c(c({},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)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=a(e,["components","mdxType","originalType","parentName"]),l=u(r),f=o,m=l["".concat(s,".").concat(f)]||l[f]||d[f]||i;return r?n.createElement(m,c(c({ref:t},p),{},{components:r})):n.createElement(m,c({ref:t},p))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=f;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a[l]="string"==typeof e?e:o,c[1]=a;for(var u=2;u<i;u++)c[u]=r[u];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},7527:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={title:"SVT-VP9",sidebar_position:8},c="SVT-VP9",a={unversionedId:"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!",source:"@site/docs/encoders/SVT-VP9.md",sourceDirName:"encoders",slug:"/encoders/SVT-VP9",permalink:"/docs/encoders/SVT-VP9",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-VP9.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"SVT-VP9",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC"},next:{title:"VVenC",permalink:"/docs/encoders/VVenC"}},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:"svt-vp9"},"SVT-VP9"),(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/7385c97b.590697a4.js b/assets/js/7385c97b.590697a4.js new file mode 100644 index 000000000..c5065cf60 --- /dev/null +++ b/assets/js/7385c97b.590697a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4929],{7885:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>t,metadata:()=>a,toc:()=>c});var n=s(5893),o=s(1151);const t={label:"AVIF",sidebar_position:6},r="AVIF",a={id:"images/AVIF",title:"AVIF",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/images/AVIF.mdx",sourceDirName:"images",slug:"/images/AVIF",permalink:"/docs/images/AVIF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/AVIF.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"AVIF",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"JPEG 2000",permalink:"/docs/images/JPEG2000"},next:{title:"JPEG-XL",permalink:"/docs/images/JXL"}},l={},c=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Pros",id:"pros",level:2},{value:"Cons",id:"cons",level:2},{value:"Conclusion",id:"conclusion",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components},{Details:s}=i;return s||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"avif",children:"AVIF"}),"\n",(0,n.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(i.p,{children:["AVIF, which stands for AV1 Image File Format, is a newer image codec that is based on the ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," video codec. AVIF supersedes ",(0,n.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", & uses the same HEIF container as HEIC. AVIF is designed to have a better featureset & better general lossy compression than older image codecs, including ",(0,n.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"}),", HEIC, & ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),". AVIF is often compared to ",(0,n.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),", though in practice, the two have very different strengths."]}),"\n",(0,n.jsx)(i.p,{children:"There are two AVIF profiles available for encoding: Baseline & Advanced, which are based on AV1's Main & High profiles respectively. The AVIF Baseline profile supports up to 8,192*4,352 resolution specified by the requirement of using AV1 Level 5.1 or lower. Using tiling, it is possible to increase the maximum resolution of the AVIF Baseline profile to 65536*65536, although this hurts coding efficiency as visual anomalies may be encountered along the edges of the tile boundaries. AVIF is also limited to 10 bit color precision in its Baseline profile."}),"\n",(0,n.jsx)(i.p,{children:"In the AVIF Advanced profile, the maximum image dimensions extend to 16,384*8,704. Tiling may be used in the Advanced profile to create larger images, but the same limitations regarding visual artifacts apply. The AVIF Advanced profile extends the allowed AV1 Level to 6.0 or lower, & the highest bit depth offered by this profile is 12 BPC. It is worth noting that while it is currently a near certainty that AVIF implementations will support both the Baseline & Advanced profiles, this may not always be the case. This is a problem that affects HEIC currently, & is a known potential weakness of video-based image codecs."}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"Poorly"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"8 BPC, 10 BPC, 12 BPC"})]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"No"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Compatible Browsers"})," (full support)"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.google.com/chrome/",children:"Google Chrome"})," 85+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.apple.com/safari/",children:"Safari"})," 16.4+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.mozilla.org/en-US/firefox/new/",children:"Firefox"})," 113+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.opera.com/",children:"Opera"})," 71+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://apps.gnome.org/app/org.gnome.Epiphany/",children:"GNOME Web"})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"pros",children:"Pros"}),"\n",(0,n.jsx)(i.p,{children:"AVIF is known for its extremely strong lossy compression performance for non-photographic images as well as photographic images in the low to medium fidelity range. AVIF is consistently better than JPEG visually, except for with complex images that contain a lot of highly entropic data like random noise."}),"\n",(0,n.jsx)(i.p,{children:"AVIF compatibility has grown rapidly since its adoption in Google Chrome in 2020. For a relatively new image format, its level of penetration has been stellar, especially in the browser market. At this point in time, it would be a safe bet to ship AVIF images for your site given they compress better than JPEG & have older formats provided as fallbacks."}),"\n",(0,n.jsx)(i.p,{children:"AVIF's wider featureset enables new experiences through images, including HDR. AVIF also presents astonishing animation prowess, as it is capable of using AV1's inter-frame coding techniques which make it easily the best animated image format for most use cases where it is compatible."}),"\n",(0,n.jsx)(i.h2,{id:"cons",children:"Cons"}),"\n",(0,n.jsx)(i.p,{children:"AVIF encoding implementations are difficult to use, and images require much longer encoding times for what can be considered competitive quality. Making encoding more difficult, AVIF's use of intra-frame coding techniques that share data between blocks reduces parallelization capability & worsens generation loss. Theoretically, this improves coding efficiency, though. Via the AVIF Encoding section of the aomenc page:"}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"AVIF Encoding with aomenc through avifenc"}),(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders."}),(0,n.jsx)("p",{children:"A sample command for encoding AVIF looks like this:"}),(0,n.jsx)("pre",{children:(0,n.jsx)("code",{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),(0,n.jsx)("p",{children:"Where:"}),(0,n.jsxs)("ul",{children:[(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-c aom"})," is the encoder"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't paralellize perfectly. Test using a speed benchmark to verify which value works best for you."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8 bit source image."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,n.jsx)(i.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]})]})]})]}),"\n",(0,n.jsx)(i.p,{children:"Additionally, AVIF tends to be underwhelming at high fidelity with photographic images. Compared to older codecs it usually outperforms the competition, but since medium to high fidelity tends to be the target for a lot of modern web delivery, it is disappointing to see AVIF not performing as well here."}),"\n",(0,n.jsx)(i.p,{children:"AVIF also does not have progressive decode. This is a common weakness of video-based image codecs. While there is a hacky way to do progressive AVIF by encoding a low fidelity frame & then a high fidelity frame in an animated AVIF at a high framerate so the low fidelity frame is loaded & plays first, this is far from ideal for the average user & adds to an already burdensome encoding process. Additionally, this has issues with Firefox, which only recently got support for animated AVIF."}),"\n",(0,n.jsx)(i.p,{children:"Finally, AVIF's lossless mode is incredibly underwhelming, often producing larger files than PNG. When compressing losslessly, avoid AVIF entirely."}),"\n",(0,n.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(i.p,{children:"While AVIF is certainly promising, its shortcomings"})]})}function d(e={}){const{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1151:(e,i,s)=>{s.d(i,{Z:()=>a,a:()=>r});var n=s(7294);const o={},t=n.createContext(o);function r(e){const i=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/74450489.a76acfc9.js b/assets/js/74450489.6906ed66.js similarity index 85% rename from assets/js/74450489.a76acfc9.js rename to assets/js/74450489.6906ed66.js index af74b2bfa..8689d863b 100644 --- a/assets/js/74450489.a76acfc9.js +++ b/assets/js/74450489.6906ed66.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[489],{9159:e=>{e.exports=JSON.parse('{"label":"web","permalink":"/blog/tags/web","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[489],{9159:e=>{e.exports=JSON.parse('{"label":"web","permalink":"/blog/tags/web","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/7574d07a.80bcaa63.js b/assets/js/7574d07a.80bcaa63.js deleted file mode 100644 index 0476bd1fa..000000000 --- a/assets/js/7574d07a.80bcaa63.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[17],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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},l=function(e){var t=u(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,l=c(e,["components","mdxType","originalType","parentName"]),p=u(r),f=o,m=p["".concat(s,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(m,a(a({ref:t},l),{},{components:r})):n.createElement(m,a({ref:t},l))}));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 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 u=2;u<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},9685:(e,t,r)=>{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:"AVM",sidebar_position:12},a="AVM",c={unversionedId:"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!",source:"@site/docs/encoders/AVM.md",sourceDirName:"encoders",slug:"/encoders/AVM",permalink:"/docs/encoders/AVM",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/AVM.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{label:"AVM",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"VTM",permalink:"/docs/encoders/VTM"},next:{title:"HM",permalink:"/docs/encoders/HM"}},s={},u=[],l={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"avm"},"AVM"),(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/76096a15.66e5da00.js b/assets/js/76096a15.66e5da00.js new file mode 100644 index 000000000..17448a52c --- /dev/null +++ b/assets/js/76096a15.66e5da00.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2630],{4115:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var i=s(5893),n=s(1151);const r={title:"SRT"},o="SRT",l={id:"subtitles/SRT",title:"SRT",description:"SubRip Text (SRT) is a text format for subtitles, described as 'the most basic of all subtitle formats'. SRT files are plain text with the extension .srt.",source:"@site/docs/subtitles/SRT.mdx",sourceDirName:"subtitles",slug:"/subtitles/SRT",permalink:"/docs/subtitles/SRT",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/SRT.mdx",tags:[],version:"current",frontMatter:{title:"SRT"},sidebar:"tutorialSidebar",previous:{title:"JM",permalink:"/docs/encoders/JM"},next:{title:"WebVTT",permalink:"/docs/subtitles/webvtt"}},c={},a=[{value:"Format",id:"format",level:2},{value:"Unoffical features",id:"unoffical-features",level:3},{value:"Example",id:"example",level:2}];function d(e){const t={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"srt",children:"SRT"}),"\n",(0,i.jsxs)(t.p,{children:["SubRip Text (SRT) is a text format for subtitles, described as 'the most basic of all subtitle formats'. SRT files are plain text with the extension ",(0,i.jsx)(t.code,{children:".srt"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"format",children:"Format"}),"\n",(0,i.jsxs)(t.p,{children:["Subtitles are placed into sequentially ordered groups, with a starting and ending timestamp, encoded ",(0,i.jsx)(t.code,{children:"hours:minutes:seconds,milliseconds"}),". Note the seperator for the millisecond value is a comma. The starting and ending value are seperated by ",(0,i.jsx)(t.code,{children:"--\x3e"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"unoffical-features",children:"Unoffical features"}),"\n",(0,i.jsx)(t.p,{children:"Some basic HTML tags are supported by some viewers, such as:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"<b>bold</b>"})," ",(0,i.jsx)(t.strong,{children:"bold"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"<i>italics</i>"})," ",(0,i.jsx)(t.em,{children:"italics"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"<u></u>"})," underlined"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:'<font color="#0000FF">Blue</font>'})," colored text."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Note these will be displayed verbatim on viewers that don't support these features."}),"\n",(0,i.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"1\n00:00:00,000 --\x3e 00:01:00,000\nThis subtitle will be visible for the first minute of the stream\n\n2\n00:01:00,000 --\x3e 00:01:30,000\nand this one for thirty seconds after that.\n"})})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>o});var i=s(7294);const n={},r=i.createContext(n);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7680a4d5.1dde6da0.js b/assets/js/7680a4d5.1dde6da0.js deleted file mode 100644 index 0a723d28d..000000000 --- a/assets/js/7680a4d5.1dde6da0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1746],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(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 r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(n),m=o,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||i;return n?a.createElement(f,r(r({ref:t},u),{},{components:n})):a.createElement(f,r({ref:t},u))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:o,r[1]=l;for(var c=2;c<i;c++)r[c]=n[c];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},7931:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=n(7462),o=(n(7294),n(3905));const i={label:"eac3to",sidebar_position:8},r="eac3to",l={unversionedId:"utilities/eac3to",id:"utilities/eac3to",title:"eac3to",description:"eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV).",source:"@site/docs/utilities/eac3to.md",sourceDirName:"utilities",slug:"/utilities/eac3to",permalink:"/docs/utilities/eac3to",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/eac3to.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{label:"eac3to",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool"},next:{title:"FFmpeg",permalink:"/docs/utilities/ffmpeg"}},s={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Audio conversion",id:"audio-conversion",level:3},{value:"Get BDMV info",id:"get-bdmv-info",level:3},{value:"Demux",id:"demux",level:3},{value:"Delay audio",id:"delay-audio",level:3}],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"eac3to"},"eac3to"),(0,o.kt)("p",null,"eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV)."),(0,o.kt)("admonition",{title:"Compatibility",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"This is a Windows only software, although usage with Wine is possible.")),(0,o.kt)("admonition",{title:"Avoid using when possible",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"There is absolutely no reason whatsoever to use this software unless required by paleolithic ",(0,o.kt)("a",{parentName:"p",href:"https://wiki.installgentoo.com/wiki/Private_trackers"},"private trackers"),", due to a bajillion dependencies needed that aren't bundled with the download itself. Use something like FFmpeg instead.")),(0,o.kt)("h2",{id:"installation"},"Installation"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Download from ",(0,o.kt)("a",{parentName:"li",href:"https://www.videohelp.com/software/eac3to"},"VideoHelp"),", drag and drop into your designated folder, add to PATH when necessary.")),(0,o.kt)("h2",{id:"usage"},"Usage"),(0,o.kt)("h3",{id:"audio-conversion"},"Audio conversion"),(0,o.kt)("p",null,"Examples:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"eac3to source.pcm destination.flac\n")),(0,o.kt)("p",null,"(Convert PCM audio to FLAC)"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"eac3to source.thd destination.flac destination.ac3\n")),(0,o.kt)("p",null,"(Convert TrueHD to FLAC while also extracting the AC-3 compatibility layer)"),(0,o.kt)("h3",{id:"get-bdmv-info"},"Get BDMV info"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"eac3to Movie.2024.Bluray/BDMV\n")),(0,o.kt)("h3",{id:"demux"},"Demux"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"eac3to Movie.2024.Bluray/BDMV -demux\n")),(0,o.kt)("h3",{id:"delay-audio"},"Delay audio"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"eac3to input.eac3 output.eac3 1000ms\n")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7d09a242.818390ea.js b/assets/js/7d09a242.818390ea.js new file mode 100644 index 000000000..ffb0e6bec --- /dev/null +++ b/assets/js/7d09a242.818390ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9918],{1147:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>c});var s=i(5893),o=i(1151);const t={title:"aomenc",sidebar_position:3},a="aomenc",l={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.",source:"@site/docs/encoders/aomenc.mdx",sourceDirName:"encoders",slug:"/encoders/aomenc",permalink:"/docs/encoders/aomenc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aomenc.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"aomenc",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"x265",permalink:"/docs/encoders/x265"},next:{title:"vpxenc",permalink:"/docs/encoders/vpxenc"}},r={},c=[{value:"Choosing forks",id:"choosing-forks",level:2},{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3},{value:"MacOS",id:"macos",level:3},{value:"Linux",id:"linux",level:3},{value:"Usage",id:"usage",level:2},{value:"AV1 Encoding",id:"av1-encoding",level:3},{value:"AVIF Encoding",id:"avif-encoding",level:3},{value:"Recommendations",id:"recommendations",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"aomenc",children:"aomenc"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc or ",(0,s.jsx)(n.strong,{children:"libaom"})," is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1."]}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h2,{id:"choosing-forks",children:"Choosing forks"}),"\n",(0,s.jsxs)(n.p,{children:["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 ",(0,s.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"})," which was created by BlueSwordM. ",(0,s.jsx)(n.strong,{children:"But it is no longer maintained as of 13th January 2023"}),", another fork called ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"})," was then created off of it by Clybius to continue on the legacy."]}),"\n",(0,s.jsx)(n.p,{children:"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."}),"\n",(0,s.jsxs)(n.p,{children:["TL;DR use ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc is available in FFmpeg via ",(0,s.jsx)(n.code,{children:"libaom-av1"}),", check if you have it by running ",(0,s.jsx)(n.code,{children:"ffmpeg -h encoder=libaom-av1"}),". You can input non-FFmpeg standard aomenc parameters via ",(0,s.jsx)(n.code,{children:"-aom-params"}),"."]}),"\n",(0,s.jsx)(n.admonition,{title:"Mainline aomenc",type:"caution",children:(0,s.jsx)(n.p,{children:"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."})}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(n.h3,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"The Easy Way:"})," Download the pre-built versions, which can be found below (Current as of Sept 6, 2023):"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Join the ",(0,s.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," and head to #community-builds for updated versions, you can opt to compile it yourself with the instructions below."]})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"The Compiling Route:"})}),"\n",(0,s.jsx)(n.admonition,{title:"Credits",type:"info",children:(0,s.jsxs)(n.p,{children:["Full credits to u/Turbulent-Bend-7416 on Reddit for ",(0,s.jsx)(n.a,{href:"https://www.reddit.com/r/AV1/comments/s6eh5f/how_to_compile_av1_in_windows_without_crying",children:"this post"})," on how to compile aomenc."]})}),"\n",(0,s.jsxs)(n.p,{children:["This guide requires ",(0,s.jsx)(n.strong,{children:"MSYS2"}),", specifically ",(0,s.jsx)(n.strong,{children:"MinGW-W64"}),". Install it if you haven't yet."]}),"\n",(0,s.jsx)(n.p,{children:"First, install the required dependencies:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pacman -S cmake git perl yasm nasm python3 doxygen mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel\n"})}),"\n",(0,s.jsx)(n.p,{children:"Now, clone the aom-av1-lavish repo in the Endless_Merging branch and create the folders:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n"})}),"\n",(0,s.jsx)(n.p,{children:"Then we can start compiling with some build optimizations for your CPU:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The resulting binary will be available within your home folder of the location where you installed MSYS2 (usually ",(0,s.jsx)(n.code,{children:"C:"}),"), navigate there and the to the aom-av1-lavish folder and it should be there."]}),"\n",(0,s.jsx)(n.p,{children:'Built files should be in the "Debug" folder'}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsx)(n.p,{children:"Don't share binaries compiled with native CPU optimizations unless the person you're sharing to has the same CPU architecture, as this will lead to missing instructions being used and slowing down encode speeds."})}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h3,{id:"macos",children:"MacOS"}),"\n",(0,s.jsxs)(n.p,{children:["macOS is very similar to Linux. Note that some commands may have to be run with ",(0,s.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Homebrew"})}),"\n",(0,s.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),"\n",(0,s.jsx)(n.p,{children:"Installing mainline libaom is as simple as running the following:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install aom\n"})}),"\n",(0,s.jsx)(n.p,{children:"FFmpeg can also be installed via brew."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Building From Source"})}),"\n",(0,s.jsx)(n.p,{children:"If you want aom-av1-lavish instead of mainline, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,s.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Homebrew installs ",(0,s.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from libvmaf, libjxl, etc, make sure to copy them from ",(0,s.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,s.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,s.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,s.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. aom-av1-lavish requires some additional steps, though."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch, which contains all of the latest lavish improvements:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"})," is merged to fix build errors."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the line ",(0,s.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,s.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,s.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,s.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,s.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,s.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools. While still in the ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root. If it doesn\'t work properly, you can always copy the binary into /usr/local/bin manually:\nmake install\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Now you can run ",(0,s.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,s.jsx)(n.code,{children:"aomenc"})," executable to ",(0,s.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,s.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,s.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Notice how it says ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish."]}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(n.p,{children:"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."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Compiling aom-av1-lavish, all-in-one-command:"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.h3,{id:"av1-encoding",children:"AV1 Encoding"}),"\n",(0,s.jsxs)(n.p,{children:["Simple Y4M input with CQ 22, 1 pass, and raw ",(0,s.jsx)(n.code,{children:".ivf"})," bitstream output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"aomenc --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf input.y4m\n"})}),"\n",(0,s.jsx)(n.p,{children:"Pipe from FFmpeg:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.p,{children:"Pipe from FFmpeg, 2-pass:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=1 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=2 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"The way aomenc was developed requires 2-pass to take full advantage of its efficiency which include better rate controls and encoding features. So always use 2 passes when encoding."})}),"\n",(0,s.jsx)(n.h3,{id:"avif-encoding",children:"AVIF Encoding"}),"\n",(0,s.jsx)(n.p,{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders. A sample command for encoding AVIF looks like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),"\n",(0,s.jsx)(n.p,{children:"Where:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-c aom"})," is the encoder"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't parallelize perfectly. Test using a speed benchmark to verify which value works best for you."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8-bit source image."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,s.jsx)(n.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc unfortunately lacks the ability to take advantage of multiple threads, so therefore a tool like ",(0,s.jsx)(n.a,{href:"/docs/utilities/Av1an",children:"Av1an"})," will be needed for parallelization. The parameters shown will be biased towards Av1an usage, so if you plan on using standalone aomenc then adjust as needed."]}),"\n",(0,s.jsx)(n.p,{children:"Here are some recommended parameters:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 --denoise-noise-level=8"})}),"\n",(0,s.jsx)(n.p,{children:"Now let's break it down shall we."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because it makes the video smaller and reduces banding."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",width:"1280",height:"768",loading:"lazy"})]}),"\n",(0,s.jsx)(n.admonition,{title:"Tile usage",type:"note",children:(0,s.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,s.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,s.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,s.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)"]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--lag-in-frames=64"})," Knockoff of x264/x265 ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Group_of_pictures",children:"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."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--aq-mode=0"})," adaptive quantization mode, a mostly debatable area nowadays. 0 is better most of the time but some say 1 is also good."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["Do not use ",(0,s.jsx)(n.code,{children:"tune-content=psy"})," if you encode live action above ",(0,s.jsx)(n.code,{children:"cq-level=30"}),"."]})}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["If you use any of the VMAF tunes, you need to specify ",(0,s.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put VMAF models in."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg can't input it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--deltaq-mode=0"})," set to 0 b its better"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering (smoothing) will be, always been a hot topic. Most agree on the default of 4. Others think 1 is good for 3D Pixar CGI-like and 2D animation and 4 for live action content, and a higher value for lower bitrate encodes."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause Av1an already did scene detection, so we wont have to. Plus it speeds things up."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since Av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1"})," Parameters that give you free efficiency boost, ignore it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well (NLMeans is the denoiser used)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--denoise-noise-level=8"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness). Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Alternative",type:"info",children:(0,s.jsxs)(n.p,{children:["You can use photon noise tables as an alternative, which is also conveniently available in Av1an as ",(0,s.jsx)(n.code,{children:"--photon-noise=X"})]})}),"\n",(0,s.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Use ",(0,s.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes to speed it up without much losses (lavish, butteraugli) and ",(0,s.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n",(0,s.jsxs)(n.li,{children:["Use ",(0,s.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>a});var s=i(7294);const o={},t=s.createContext(o);function a(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7dc56e97.3d9e0625.js b/assets/js/7dc56e97.3d9e0625.js deleted file mode 100644 index 00f913c20..000000000 --- a/assets/js/7dc56e97.3d9e0625.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8039],{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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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},u=function(e){var t=p(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)}},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"]),l=p(r),f=o,b=l["".concat(s,".").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 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 p=2;p<i;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},6665:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={label:"ProRes",sidebar_position:14},a="ProRes",c={unversionedId:"video/prores",id:"video/prores",title:"ProRes",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/prores.md",sourceDirName:"video",slug:"/video/prores",permalink:"/docs/video/prores",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/prores.md",tags:[],version:"current",sidebarPosition:14,frontMatter:{label:"ProRes",sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"UT Video Codec Suite",permalink:"/docs/video/utvideo"},next:{title:"ZIP",permalink:"/docs/data/zip"}},s={},p=[],u={toc:p},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:"prores"},"ProRes"),(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/7ec778da.5ffe6777.js b/assets/js/7ec778da.7faa8f59.js similarity index 83% rename from assets/js/7ec778da.5ffe6777.js rename to assets/js/7ec778da.7faa8f59.js index 341c5c402..452eb4a44 100644 --- a/assets/js/7ec778da.5ffe6777.js +++ b/assets/js/7ec778da.7faa8f59.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9112],{3759:e=>{e.exports=JSON.parse('{"label":"video","permalink":"/blog/tags/video","allTagsPath":"/blog/tags","count":2}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9112],{3759:e=>{e.exports=JSON.parse('{"label":"video","permalink":"/blog/tags/video","allTagsPath":"/blog/tags","count":2,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/7ecaa93b.59c1713d.js b/assets/js/7ecaa93b.59c1713d.js deleted file mode 100644 index 111c0d1aa..000000000 --- a/assets/js/7ecaa93b.59c1713d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[819],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=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 o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(n),f=i,m=p["".concat(s,".").concat(f)]||p[f]||d[f]||o;return n?r.createElement(m,a(a({ref:t},u),{},{components:n})):r.createElement(m,a({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);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:i,a[1]=c;for(var l=2;l<o;l++)a[l]=n[l];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}f.displayName="MDXCreateElement"},8797:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var r=n(7462),i=(n(7294),n(3905));const o={title:"Denoise",sidebar_position:4},a="Denoise",c={unversionedId:"filtering/denoise",id:"filtering/denoise",title:"Denoise",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/denoise.md",sourceDirName:"filtering",slug:"/filtering/denoise",permalink:"/docs/filtering/denoise",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/denoise.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Denoise",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Deinterlace",permalink:"/docs/filtering/deinterlace"},next:{title:"Detelecine / Inverse Telecine",permalink:"/docs/filtering/detelecine"}},s={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"denoise"},"Denoise"),(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!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7eff0f1a.7444ae81.js b/assets/js/7eff0f1a.7444ae81.js new file mode 100644 index 000000000..7716c1024 --- /dev/null +++ b/assets/js/7eff0f1a.7444ae81.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3460],{5041:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var n=o(5893),t=o(1151);const s={label:"AVC / H.264",sidebar_position:1},r="H.264",a={id:"video/AVC",title:"H.264",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/AVC.mdx",sourceDirName:"video",slug:"/video/AVC",permalink:"/docs/video/AVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AVC.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"AVC / H.264",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"WavPack",permalink:"/docs/audio/WavPack"},next:{title:"H.265",permalink:"/docs/video/HEVC"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"h264",children:"H.264"}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(i.p,{children:["H.264, also known as AVC (Advanced Video Coding), is a video compression standard that has played a significant role in multimedia codec technology. H.264 revolutionized video encoding by offering vastly more efficient compression than predecessors, and has been the nearly universal defacto video compression standard since. Its history is marked by continuous refinement and widespread adoption, especially as it pertains to the highly optimized ",(0,n.jsx)(i.a,{href:"/docs/encoders/x264",children:"x264"})," video encoder. Despite being over a decade old, H.264 remains relevant today. Newer codecs like ",(0,n.jsx)(i.a,{href:"/docs/video/HEVC",children:"H.265"}),", ",(0,n.jsx)(i.a,{href:"/docs/video/VP9",children:"VP9"}),", and ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," aim to provide more efficient compression than H.264 but are currently not as universal. The choice between these codecs largely depends on the specific requirements of the application, compatibility and support, and the balance between compression efficiency and computational complexity."]})]})}function u(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,i,o)=>{o.d(i,{Z:()=>a,a:()=>r});var n=o(7294);const t={},s=n.createContext(t);function r(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7f76a12e.e9346a56.js b/assets/js/7f76a12e.e9346a56.js new file mode 100644 index 000000000..1d23d5292 --- /dev/null +++ b/assets/js/7f76a12e.e9346a56.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8117],{1651:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var s=i(5893),t=i(1151);const o={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/av1-encoding-for-dummies",source:"@site/blog/2023-09-03-av1-for-dummies.mdx",title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",date:"2023-09-03T00:00:00.000Z",formattedDate:"September 3, 2023",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:15.145,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",permalink:"/blog/embedding-the-un-embeddable"},nextItem:{title:"Site Optimization by Reducing Image Load on the Web",permalink:"/blog/site-optimization"}},l={authorsImageUrls:[void 0,void 0]},c=[{value:"Installing the Tools",id:"installing-the-tools",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3},{value:"macOS",id:"macos",level:3},{value:"Linux",id:"linux",level:3},{value:"The Easy Ways",id:"the-easy-ways",level:4},{value:"The Compiling Route",id:"the-compiling-route",level:4},{value:"Ubuntu",id:"ubuntu",level:5},{value:"Arch",id:"arch",level:5},{value:"Compiling aom-av1-lavish",id:"compiling-aom-av1-lavish",level:4},{value:"Encoding",id:"encoding",level:2},{value:"Merging Everything",id:"merging-everything",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2},{value:"Final Thoughts",id:"final-thoughts",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["This guide will show you how to encode in AV1 the ",(0,s.jsx)(n.em,{children:"right"})," and ",(0,s.jsx)(n.em,{children:"optimal"})," way. Yes, you using standalone ",(0,s.jsx)(n.code,{children:"libaom"}),", ",(0,s.jsx)(n.code,{children:"libsvtav1"}),", and ",(0,s.jsx)(n.code,{children:"librav1e"})," from FFmpeg or even piping ",(0,s.jsx)(n.code,{children:"yuv4mpeg"})," into ",(0,s.jsx)(n.strong,{children:"mainline"})," aomenc are all unoptimal."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Compare",src:i(8804).Z+"",width:"1045",height:"588"})}),"\n",(0,s.jsxs)(n.p,{children:["In this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is ",(0,s.jsx)(n.strong,{children:"RAM consumption"}),", encoding 2160p (4K) with ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"})," with 4 workers could take upwards of ",(0,s.jsx)(n.strong,{children:"16GB"})," of RAM! So do keep this in mind."]}),"\n",(0,s.jsx)(n.h2,{id:"installing-the-tools",children:"Installing the Tools"}),"\n",(0,s.jsx)(n.h3,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"The GUI Way:"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://github.com/n00mkrad/nmkoder",children:"NMKODER"})," which is a GUI front-end to av1an with all dependencies installed."]}),"\n",(0,s.jsx)(n.li,{children:"You're done, you can skip to the encoding part"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Almost abandonware",type:"danger",children:(0,s.jsx)(n.p,{children:"Since Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal."})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"The Automated Way:"})}),"\n",(0,s.jsxs)(n.p,{children:["There is now a batch script for automating the install process, which can be found ",(0,s.jsx)(n.a,{href:"https://github.com/Hishiro64/av1an-win-script",children:"here"}),". The instructions are in the README file."]}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["The script will download outdated version encoders and tools such as ",(0,s.jsx)(n.code,{children:"aom-av1-psy"})," and MKVToolNix v76.0, if you are fine with these you can proceed."]})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"The Manual Way:"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.strong,{children:"Python 3.10.x, this will change so consult from the"})," ",(0,s.jsx)(n.a,{href:"http://www.vapoursynth.com/doc/installation.html",children:"Vapoursynth website"})," ",(0,s.jsx)(n.strong,{children:"if you're reading this from the future"})," from ",(0,s.jsx)(n.a,{href:"https://www.python.org/downloads/windows/",children:"here"}),' and select "Windows Installer 64-bit". Upon installation check the tick for adding Python to PATH like so\n',(0,s.jsx)(n.img,{alt:"Python PATH",src:i(7843).Z+"",width:"672",height:"417"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download and install Vapoursynth from ",(0,s.jsx)(n.a,{href:"https://github.com/vapoursynth/vapoursynth/releases",children:"here"}),' and select "VapourSynth64-RXX.exe"']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Open the terminal and type ",(0,s.jsx)(n.code,{children:"vsrepo.py install lsmas ffms2"})," to install some plugins for Av1an to work."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download MKVToolNix from ",(0,s.jsx)(n.a,{href:"https://mkvtoolnix.download/downloads.html#windows",children:"here"}),', select "mkvtoolnix-64bit-XX.X.X-setup.exe", and install ',(0,s.jsx)(n.strong,{children:"(Also available on winget!)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download Av1an from ",(0,s.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases",children:"here"}),' (SELECT LATEST AND CLICK THE "ASSETS" DROPDOWN)']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download ",(0,s.jsx)(n.strong,{children:"shared libraries"})," FFmpeg from ",(0,s.jsx)(n.a,{href:"https://www.gyan.dev/ffmpeg/builds",children:"gyan.dev"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download a pre-built fork of Aomenc (",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging",children:"aom-av1-lavish"}),") which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows ",(0,s.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"here"})," ",(0,s.jsx)(n.em,{children:"(Current as of Sept 6, 2023)"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["If you opt to compile aomenc yourself, you can view the instructions on how to do that ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc/#installation",children:"here"}),"."]})}),"\n",(0,s.jsxs)(n.ol,{start:"8",children:["\n",(0,s.jsxs)(n.li,{children:["Move Av1an, FFmpeg ",(0,s.jsx)(n.strong,{children:"(Including the FFmpeg DLLs)"}),", and aomenc to somewhere preferable, eg ",(0,s.jsx)(n.code,{children:"C:\\Encoding"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Add the folder ",(0,s.jsx)(n.strong,{children:"AND MKVTOOLNIX INSTALLATION FOLDER"})," to the ",(0,s.jsx)(n.a,{href:"https://www.maketecheasier.com/what-is-the-windows-path/",children:"Windows PATH environment"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"written by gb82 (Gianni Rosato)"})}),"\n",(0,s.jsx)(n.p,{children:"macOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Homebrew + Macports for Av1an + rav1e:"}),"\n",(0,s.jsxs)(n.em,{children:["Note that some commands may have to be run with ",(0,s.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]})]}),"\n",(0,s.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["As is installing MacPorts. Install the relevent ",(0,s.jsx)(n.code,{children:".pkg"})," for your macOS version from the MacPorts Project website:\n",(0,s.jsx)(n.a,{href:"https://www.macports.org/install.php",children:"www.macports.org/install.php"})]}),"\n",(0,s.jsx)(n.p,{children:"Now, you can run the following commands:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install rav1e aom mkvtoolnix ffmpeg\n# Usually you must run MacPorts commands for package installations as root\nport upgrade outdated\nport install av1an\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This is the easiest way to get everything set up & working to produce AV1 video with ",(0,s.jsx)(n.code,{children:"rav1e"})," or mainline ",(0,s.jsx)(n.code,{children:"aomenc"})," & Av1an. You can check that things are installed by running the following commands & parsing their output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% av1an --version\nav1an 0.4.1-unstable (rev e10880d) (Release)\n\n* Compiler\n rustc 1.70.0 (LLVM 16.0)\n\n* Target Triple\n aarch64-apple-darwin\n\n* Date Info\n Commit Date: 2023-06-25\n\n* VapourSynth Plugins\n systems.innocent.lsmas : Not found\n com.vapoursynth.ffms2 : Not found\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'% rav1e --version | grep "release" -C 1 \nrav1e 0.6.6 () (release)\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'% aomenc --help | grep "AOMedia" -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\n\n Use --codec to switch to a non-default encoder.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Notice ",(0,s.jsx)(n.code,{children:"systems.innocent.lsmas : Not found"})," in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through ",(0,s.jsx)(n.code,{children:"-m hybrid"}),". This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'av1an -i "input" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v " --tiles 8 -s 4 --quantizer 80 --no-scene-detection" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o "output.mkv"\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Building From Source"})}),"\n",(0,s.jsx)(n.p,{children:"If you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,s.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Homebrew installs ",(0,s.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from ",(0,s.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,s.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,s.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,s.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'brew install git rust nasm\ngit clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\ncd .. && cd target/release\ncp av1an /usr/local/bin\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"More Difficult: Building aom-av1-lavish from Source"})}),"\n",(0,s.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until Clybius merges ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the line ",(0,s.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,s.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,s.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,s.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,s.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,s.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root:\nmake install\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Now you can run ",(0,s.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,s.jsx)(n.code,{children:"aomenc"})," executable to ",(0,s.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,s.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,s.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Notice how it says ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below."]}),"\n",(0,s.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"Yet again, try using Arch. It's way easier."})}),"\n",(0,s.jsx)(n.h4,{id:"the-easy-ways",children:"The Easy Ways"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/aviator",children:"Aviator"})," (",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"})," + ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/FFmpeg",children:"FFmpeg"}),") or ",(0,s.jsx)(n.a,{href:"https://giannirosato.com/blog/post/aviator-1/",children:"rAV1ator"})," basically same thing but ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an.mdx",children:"Av1an"})," + ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"}),". Both are only available as ",(0,s.jsx)(n.a,{href:"https://beta.flathub.org/apps/net.natesales.Aviator",children:"Flatpaks"}),". Keep in mind Aviator ships with ",(0,s.jsx)(n.strong,{children:"SVT-AV1"})," and rAV1ator with ",(0,s.jsx)(n.strong,{children:"rav1e"})," instead of aomenc/AOM-AV1, which I will not be covering here."]}),"\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rav1ator-cli"}),", a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation",children:"this page"})," for more info."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"the-compiling-route",children:"The Compiling Route"}),"\n",(0,s.jsx)(n.h5,{id:"ubuntu",children:"Ubuntu"}),"\n",(0,s.jsxs)(n.p,{children:["The guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via ",(0,s.jsx)(n.code,{children:"rustup"})," first, as apt version of Rust is severely outdated, then you can continue."]}),"\n",(0,s.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install l-smash:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/l-smash/l-smash.git\ncd l-smash\n./configure --enable-shared --extra-cflags="-march=native"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,s.jsx)(n.p,{children:"Install zimg:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone --recursive https://github.com/sekrit-twc/zimg.git\ncd zimg\n./autogen.sh\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install ImageMagick:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/ImageMagick/ImageMagick\ncd ImageMagick\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install Vapoursynth R63:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'wget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\nunzip R63.zip\ncd vapoursynth-R63\n./autogen.sh\n./configure CFLAGS="-march=native" CXXFLAGS="-march=native" --libdir=/usr/lib\nmake -j$(nproc)\nsudo make install\nsudo mkdir /usr/lib/vapoursynth\nsudo ldconfig\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The plugin directory will be located in ",(0,s.jsx)(n.code,{children:"/usr/lib/vapoursynth"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Install L-SMASH-Works Vapoursynth Plugin:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args="-march=native" -Dcpp_args="-march=native"\nninja -j$(nproc)\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"danger",children:(0,s.jsxs)(n.p,{children:["L-SMASH-Works doesn't work on ",(0,s.jsx)(n.strong,{children:"aarch64"}),", it is recommended to use other plugins instead."]})}),"\n",(0,s.jsx)(n.p,{children:"Install FFMS2 Vapoursynth Plugin:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/FFMS/ffms2\ncd ffms2\n./autogen.sh\n./configure CFLAGS="-O3 -march=native" CXXFLAGS="-O3 -march=native"\nmake -j$(nproc)\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\n'})}),"\n",(0,s.jsx)(n.p,{children:"Install Av1an:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\nsudo cp target/release/av1an /usr/local/bin\n'})}),"\n",(0,s.jsxs)(n.p,{children:["When there's no errors, proceed to compiling ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"}),"."]}),"\n",(0,s.jsx)(n.h5,{id:"arch",children:"Arch"}),"\n",(0,s.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\n"})}),"\n",(0,s.jsx)(n.p,{children:"you're done, proceed."}),"\n",(0,s.jsx)(n.h4,{id:"compiling-aom-av1-lavish",children:"Compiling aom-av1-lavish"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,s.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsxs)(n.p,{children:["The moment you've all been waiting for, let's just get into it. Here's an example ",(0,s.jsx)(n.em,{children:"recommended"})," parameter as of now (09/03/23) [MM/DD/YY]:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'av1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a " -an " -f " -an " -v " --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 " -o "output.mkv"\n'})}),"\n",(0,s.jsx)(n.admonition,{title:"Parameter Meta",type:"info",children:(0,s.jsxs)(n.p,{children:["It is strongly recommended to join the ",(0,s.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general."]})}),"\n",(0,s.jsx)(n.p,{children:"Now let's dissect it one-by-one"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Av1an parameters:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-i"})," Input."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-x 300"})," Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-w 4"}),' Specifies the amount of "workers" or amount of encoders working on the video.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--verbose"})," Sets logging to verbose."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--resume"})," Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \"resumed\" without the parameter in place."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-e aom"})," Specifies we're using aomenc encoder which should be the default option."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-c mkvmerge"})," Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-m lsmash"})," Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-f " -an "'})," ",(0,s.jsx)(n.code,{children:"-f"})," Stands for ffmpeg parameters, ",(0,s.jsx)(n.code,{children:"-an"})," is to remove all audio since its better to encode and merge it separately. To crop use ",(0,s.jsx)(n.code,{children:'-f " -an -vf crop=1920:800 "'})," for example to crop the video to 1920x800."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-v " "'})," Is where you put the encoder's parameters in."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-a " -an "'})," FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: ",(0,s.jsx)(n.code,{children:'-a " -c:a libopus -b:a 128k "'}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--photon-noise=10"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--set-thread-affinity=2"})," Pins the thread to the encoder, aligns with ",(0,s.jsx)(n.code,{children:"--threads=2"})," in the encoder parameter so set them accordingly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"aomenc parameters:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because it makes the video smaller and reduces ",(0,s.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring",children:"banding"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--threads=2"})," Sets the amount of threads the encoder can use, aligns with ",(0,s.jsx)(n.code,{children:"--set-thread-affinity"})," in Av1an."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",width:"1280",height:"768",loading:"lazy"})]}),"\n",(0,s.jsx)(n.admonition,{title:"Tile usage",type:"note",children:(0,s.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,s.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,s.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,s.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)"]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--lag-in-frames=64"})," Knockoff of x264/x265 ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Group_of_pictures",children:"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."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--aq-mode"})," adaptive quantization mode, 0 is better most of the time"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Tunes to use",type:"info",children:(0,s.jsxs)(n.p,{children:["Set ",(0,s.jsx)(n.code,{children:"tune-content"})," to ",(0,s.jsx)(n.code,{children:"animation"})," if you're encoding above ",(0,s.jsx)(n.code,{children:"cq-level=30"})," A.K.A lower quality, despite it's name\nSet ",(0,s.jsx)(n.code,{children:"tune-content"})," to ",(0,s.jsx)(n.code,{children:"psy"})," for everything else, ",(0,s.jsxs)(n.strong,{children:["do not use if you encode above ",(0,s.jsx)(n.code,{children:"cq-level=30"})]}),"\nFor ",(0,s.jsx)(n.code,{children:"tune"}),", this is a bit tricky. For now, the meta seems to be ",(0,s.jsx)(n.code,{children:"ssim"}),", but back then it was ",(0,s.jsx)(n.code,{children:"lavish"})," which is considered THE best tune because it's based on ",(0,s.jsx)(n.a,{href:"https://github.com/google/butteraugli",children:"butteraugli"}),". Now it's fallen behind because its more blurry than ",(0,s.jsx)(n.code,{children:"ssim"}),", and before that it was ",(0,s.jsx)(n.code,{children:"butteraugli"}),", and then ",(0,s.jsx)(n.code,{children:"ipq_vmaf_psy"}),", and finally just ",(0,s.jsx)(n.code,{children:"ipq"}),".\nIf you use any of the VMAF tunes, ",(0,s.jsxs)(n.strong,{children:["you need to specify ",(0,s.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put it"]}),"."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--deltaq-mode"})," set to 0 because its just better."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause ",(0,s.jsx)(n.strong,{children:"Av1an already did scene detection, so we wont have to."}),". And it speeds things up."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1"})," Parameters that give you free efficiency boost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Concatenation Error on Linux",type:"info",children:(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"ulimit -n 200000"}),", resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ",(0,s.jsx)(n.code,{children:"mkvmerge @../options.json"})]})}),"\n",(0,s.jsx)(n.h2,{id:"merging-everything",children:"Merging Everything"}),"\n",(0,s.jsxs)(n.p,{children:["Once you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into ",(0,s.jsx)(n.code,{children:"mp4"}),", just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental."]}),"\n",(0,s.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--denoise-noise-level=10"})," Alternative to ",(0,s.jsx)(n.code,{children:"photon-noise"}),", slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and ",(0,s.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"final-thoughts",children:"Final Thoughts"}),"\n",(0,s.jsx)(n.p,{children:'Encoding has always been about experimentation for the best, there is really no "One size fits all" for encoding content, as they differ from scene complexity, how it\'s captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.strong,{children:["Guide originally hosted on ",(0,s.jsx)(n.a,{href:"https://rentry.co/AV1",children:"https://rentry.co/AV1"}),", rewrite and migration by Simulping."]})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8804:(e,n,i)=>{i.d(n,{Z:()=>s});const s=i.p+"assets/images/compare-guide-6feb966fbd9d73be4a3097c41691c4ad.webp"},7843:(e,n,i)=>{i.d(n,{Z:()=>s});const s=i.p+"assets/images/python-path-a89fc4fe6c6eb4c2ea0a7610dd2cf09a.webp"},1151:(e,n,i)=>{i.d(n,{Z:()=>r,a:()=>a});var s=i(7294);const t={},o=s.createContext(t);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7fa695a7.2eae892e.js b/assets/js/7fa695a7.2eae892e.js new file mode 100644 index 000000000..753e7ff4a --- /dev/null +++ b/assets/js/7fa695a7.2eae892e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5615],{4596:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=n(5893),t=n(1151);const r={label:"GIF",sidebar_position:3},o="GIF",a={id:"images/GIF",title:"GIF",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/GIF.mdx",sourceDirName:"images",slug:"/images/GIF",permalink:"/docs/images/GIF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/GIF.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"GIF",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"PNG",permalink:"/docs/images/PNG"},next:{title:"HEIC",permalink:"/docs/images/HEIC"}},c={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2}];function l(e){const i={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",p:"p",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"gif",children:"GIF"}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(i.p,{children:["Graphics Interchange Format (GIF) is an image file format first released by CompuServe in 1987. It remains popular due to it's widespread support for animated images despite its obsolete efficency. Other animated image formats like Animated ",(0,s.jsx)(i.a,{href:"/docs/images/AVIF",children:"AVIF"})," & Animated ",(0,s.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"})," have since surpassed GIF in functionality, as has the animated ",(0,s.jsx)(i.a,{href:"/docs/images/PNG",children:"PNG"})," variant APNG."]}),"\n",(0,s.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,s.jsxs)(i.p,{children:["Lossless? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Lossy? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Supported Bit Depth:\n",(0,s.jsx)(i.em,{children:"256 colors"})]}),"\n",(0,s.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Animation? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Transparency? ",(0,s.jsx)(i.em,{children:"Yes"})]}),"\n",(0,s.jsxs)(i.p,{children:["Progressive Decode? ",(0,s.jsx)(i.em,{children:"No"})]}),"\n",(0,s.jsxs)(i.p,{children:["Royalty Free? ",(0,s.jsx)(i.em,{children:"Yes"})]})]})}function m(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>o});var s=n(7294);const t={},r=s.createContext(t);function o(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80447496.c6d91e71.js b/assets/js/80447496.c6d91e71.js new file mode 100644 index 000000000..891a878b4 --- /dev/null +++ b/assets/js/80447496.c6d91e71.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6465],{4286:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=i(5893),n=i(1151);const s={label:"VVC / H.266",sidebar_position:3},r="H.266",c={id:"video/VVC",title:"H.266",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VVC.mdx",sourceDirName:"video",slug:"/video/VVC",permalink:"/docs/video/VVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VVC.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"VVC / H.266",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"H.265",permalink:"/docs/video/HEVC"},next:{title:"VP8",permalink:"/docs/video/VP8"}},d={},a=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"h266",children:"H.266"}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(t.p,{children:["H.266, or VVC (Versatile Video Coding), is a codec standardized in 2020 by the Joint Video Experts Team (JVET). It succeeds ",(0,o.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265"}),", and claims to be 40% more efficient. In practice, it is currently about as efficient as ",(0,o.jsx)(t.a,{href:"/docs/video/AV1",children:"AV1"})," when using the ",(0,o.jsx)(t.a,{href:"/docs/encoders/VVenC",children:"VVenC"})," encoder, although it is inherently a more complex format which means it will be more difficult to decode. It is encumbered by royalties."]})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>c,a:()=>r});var o=i(7294);const n={},s=o.createContext(n);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80bfa96b.caf2a3e8.js b/assets/js/80bfa96b.caf2a3e8.js new file mode 100644 index 000000000..fa30e9e74 --- /dev/null +++ b/assets/js/80bfa96b.caf2a3e8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7924],{7746:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>o,metadata:()=>c,toc:()=>a});var s=n(5893),i=n(1151);const o={title:"Resources",sidebar_label:"\ud83d\uddc3\ufe0f Resources",sidebar_position:12},r="Resources",c={id:"resources",title:"Resources",description:"Encoding resources that you might find useful.",source:"@site/docs/resources.mdx",sourceDirName:".",slug:"/resources",permalink:"/docs/resources",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/resources.mdx",tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"Resources",sidebar_label:"\ud83d\uddc3\ufe0f Resources",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"\u25b6\ufe0f Video Players",permalink:"/docs/video-players"},next:{title:"\u2712\ufe0f Contribution Guide",permalink:"/docs/contribution-guide"}},d={},a=[];function u(e){const t={a:"a",h1:"h1",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"resources",children:"Resources"}),"\n",(0,s.jsx)(t.p,{children:"Encoding resources that you might find useful."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://guide.encode.moe",children:"https://guide.encode.moe"})," - Filtering and fansubbing."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://lvsfunc.encode.moe/en/latest",children:"https://lvsfunc.encode.moe/en/latest"})," - lvsfunc documentation."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://silentaperture.gitlab.io/mdbook-guide/introduction.html",children:"https://silentaperture.gitlab.io/mdbook-guide/introduction.html"})," - SilentAperture's Advanced Encoding guide, mostly about filtering."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://encoding.bluefalcon.cc/",children:"https://encoding.bluefalcon.cc/"}),' - Soichiro\'s "Encoding in Depth".']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://x265.readthedocs.io/en/master",children:"https://x265.readthedocs.io/en/master"})," - x265 technical documentation, made by MulticoreWare themselves."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"http://www.chaneru.com/Roku/HLS/X264_Settings.htm",children:"http://www.chaneru.com/Roku/HLS/X264_Settings.htm"})," - x264 settings."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac",children:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac"})," - Anime encoding guide by Kokomins. Has some pretty good advices regarding psychovisual stuff and x265."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://wiki.xiph.org/Main_Page",children:"https://wiki.xiph.org/Main_Page"})," - Xiph Wiki."]}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var s=n(7294);const i={},o=s.createContext(i);function r(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8112becb.ad893fda.js b/assets/js/8112becb.ad893fda.js deleted file mode 100644 index b68b89846..000000000 --- a/assets/js/8112becb.ad893fda.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6335],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>d});var a=n(7294);function o(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 i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),l=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=l(e.components);return a.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=l(n),g=o,d=m["".concat(s,".").concat(g)]||m[g]||u[g]||r;return n?a.createElement(d,i(i({ref:t},p),{},{components:n})):a.createElement(d,i({ref:t},p))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=g;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[m]="string"==typeof e?e:o,i[1]=c;for(var l=2;l<r;l++)i[l]=n[l];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}g.displayName="MDXCreateElement"},8641:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var a=n(7462),o=(n(7294),n(3905));const r={title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},i=void 0,c={permalink:"/blog/site-optimization",source:"@site/blog/2023-07-21-site-optimization.md",title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"image",permalink:"/blog/tags/image"},{label:"web",permalink:"/blog/tags/web"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:9.255,hasTruncateMarker:!0,authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg",imageURL:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg",imageURL:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},prevItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},s={authorsImageUrls:[void 0,void 0]},l=[],p={toc:l},m="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"A big part of understanding any multimedia codec technology is knowing the application for such technology."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/814f3328.1d3d3e55.js b/assets/js/814f3328.1d3d3e55.js deleted file mode 100644 index eb7cc187a..000000000 --- a/assets/js/814f3328.1d3d3e55.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others","permalink":"/blog/embedding-the-un-embeddable"},{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies"},{"title":"Site Optimization by Reducing Image Load on the Web","permalink":"/blog/site-optimization"}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.98e3fcbf.js b/assets/js/814f3328.98e3fcbf.js new file mode 100644 index 000000000..c644c2501 --- /dev/null +++ b/assets/js/814f3328.98e3fcbf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others","permalink":"/blog/embedding-the-un-embeddable","unlisted":false},{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies","unlisted":false},{"title":"Site Optimization by Reducing Image Load on the Web","permalink":"/blog/site-optimization","unlisted":false}]}')}}]); \ No newline at end of file diff --git a/assets/js/81739261.39da8aa5.js b/assets/js/81739261.39da8aa5.js new file mode 100644 index 000000000..df676fc33 --- /dev/null +++ b/assets/js/81739261.39da8aa5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1514],{3276:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var i=t(5893),n=t(1151);const r={label:"ProRes",sidebar_position:14},s="ProRes",c={id:"video/prores",title:"ProRes",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/prores.mdx",sourceDirName:"video",slug:"/video/prores",permalink:"/docs/video/prores",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/prores.mdx",tags:[],version:"current",sidebarPosition:14,frontMatter:{label:"ProRes",sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"UT Video Codec Suite",permalink:"/docs/video/utvideo"},next:{title:"ZIP",permalink:"/docs/data/zip"}},d={},a=[];function u(e){const o={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h1,{id:"prores",children:"ProRes"}),"\n",(0,i.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>c,a:()=>s});var i=t(7294);const n={},r=i.createContext(n);function s(e){const o=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),i.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/83732ada.09f29086.js b/assets/js/83732ada.09f29086.js new file mode 100644 index 000000000..a00d7cfc5 --- /dev/null +++ b/assets/js/83732ada.09f29086.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7911],{3489:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=o(5893),i=o(1151);const s={label:"HEVC / H.265",sidebar_position:2},r="H.265",c={id:"video/HEVC",title:"H.265",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/HEVC.mdx",sourceDirName:"video",slug:"/video/HEVC",permalink:"/docs/video/HEVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/HEVC.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"HEVC / H.265",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"H.264",permalink:"/docs/video/AVC"},next:{title:"H.266",permalink:"/docs/video/VVC"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"h265",children:"H.265"}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>c,a:()=>r});var n=o(7294);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/842a7beb.02e62546.js b/assets/js/842a7beb.02e62546.js new file mode 100644 index 000000000..ae0292394 --- /dev/null +++ b/assets/js/842a7beb.02e62546.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8506],{9546:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=i(5893),o=i(1151);const s={label:"rAV1ator",sidebar_position:2},r="rAV1ator",a={id:"utilities/rAV1ator",title:"rAV1ator",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/utilities/rAV1ator.mdx",sourceDirName:"utilities",slug:"/utilities/rAV1ator",permalink:"/docs/utilities/rAV1ator",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rAV1ator.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"rAV1ator",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"MKVToolNix",permalink:"/docs/utilities/MKVToolNix"},next:{title:"FFMetrics",permalink:"/docs/utilities/FFMetrics"}},c={},l=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"rav1ator",children:"rAV1ator"}),"\n",(0,n.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(t.p,{children:["rAV1ator is a fork of ",(0,n.jsx)(t.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," designed to use ",(0,n.jsx)(t.a,{href:"/docs/utilities/av1an",children:"Av1an"})," & ",(0,n.jsx)(t.a,{href:"/docs/encoders/rav1e",children:"rav1e"})," instead of ",(0,n.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),". It is also distributed as a Flatpak with bundled dependencies outside of Flathub; running the following command will allow you to install it:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"flatpak --user remote-add --no-gpg-verify project-volo https://giannirosato.com/repo && flatpak --user install project-volo net.natesales.rAV1ator\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Initially, Aviator was supposed to switch to using the Av1an + rav1e backend that currently serves rAV1ator 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 ",(0,n.jsx)(t.em,{children:"specifically"})," Av1an & rav1e easier for interested codec enthusiasts. rAV1ator is actively maintained by Gianni Rosato & Trix."]})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var n=i(7294);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8443.72431470.js b/assets/js/8443.72431470.js new file mode 100644 index 000000000..19726a4c4 --- /dev/null +++ b/assets/js/8443.72431470.js @@ -0,0 +1,2 @@ +/*! For license information please see 8443.72431470.js.LICENSE.txt */ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8443],{8443:(t,e,n)=>{"use strict";t.exports=n(295)},1228:(t,e,n)=>{"use strict";var i=n(2856),s={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:"0"},defaultClasses:{root:"algolia-autocomplete",prefix:"aa",noPrefix:!1,dropdownMenu:"dropdown-menu",input:"input",hint:"hint",suggestions:"suggestions",suggestion:"suggestion",cursor:"cursor",dataset:"dataset",empty:"empty"},appendTo:{wrapper:{position:"absolute",zIndex:"100",display:"none"},input:{},inputWithNoHint:{},dropdown:{display:"block"}}};i.isMsie()&&i.mixin(s.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),i.isMsie()&&i.isMsie()<=7&&i.mixin(s.input,{marginTop:"-1px"}),t.exports=s},9050:(t,e,n)=>{"use strict";var i="aaDataset",s="aaValue",r="aaDatum",o=n(2856),a=n(4910),u=n(3561),c=n(1228),l=n(3109);function h(t){var e;(t=t||{}).templates=t.templates||{},t.source||o.error("missing source"),t.name&&(e=t.name,!/^[_a-zA-Z0-9-]+$/.test(e))&&o.error("invalid dataset name: "+t.name),this.query=null,this._isEmpty=!0,this.highlight=!!t.highlight,this.name=void 0===t.name||null===t.name?o.getUniqueId():t.name,this.source=t.source,this.displayFn=function(t){return t=t||"value",o.isFunction(t)?t:e;function e(e){return e[t]}}(t.display||t.displayKey),this.debounce=t.debounce,this.cache=!1!==t.cache,this.templates=function(t,e){return{empty:t.empty&&o.templatify(t.empty),header:t.header&&o.templatify(t.header),footer:t.footer&&o.templatify(t.footer),suggestion:t.suggestion||n};function n(t){return"<p>"+e(t)+"</p>"}}(t.templates,this.displayFn),this.css=o.mixin({},c,t.appendTo?c.appendTo:{}),this.cssClasses=t.cssClasses=o.mixin({},c.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix||o.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix);var n=o.className(this.cssClasses.prefix,this.cssClasses.dataset);this.$el=t.$menu&&t.$menu.find(n+"-"+this.name).length>0?a.element(t.$menu.find(n+"-"+this.name)[0]):a.element(u.dataset.replace("%CLASS%",this.name).replace("%PREFIX%",this.cssClasses.prefix).replace("%DATASET%",this.cssClasses.dataset)),this.$menu=t.$menu,this.clearCachedSuggestions()}h.extractDatasetName=function(t){return a.element(t).data(i)},h.extractValue=function(t){return a.element(t).data(s)},h.extractDatum=function(t){var e=a.element(t).data(r);return"string"==typeof e&&(e=JSON.parse(e)),e},o.mixin(h.prototype,l,{_render:function(t,e){if(this.$el){var n,c=this,l=[].slice.call(arguments,2);if(this.$el.empty(),n=e&&e.length,this._isEmpty=!n,!n&&this.templates.empty)this.$el.html(function(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!0}].concat(e),c.templates.empty.apply(this,e)}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(n)this.$el.html(function(){var t,n,l=[].slice.call(arguments,0),h=this,p=u.suggestions.replace("%PREFIX%",this.cssClasses.prefix).replace("%SUGGESTIONS%",this.cssClasses.suggestions);return t=a.element(p).css(this.css.suggestions),n=o.map(e,f),t.append.apply(t,n),t;function f(t){var e,n=u.suggestion.replace("%PREFIX%",h.cssClasses.prefix).replace("%SUGGESTION%",h.cssClasses.suggestion);return(e=a.element(n).attr({role:"option",id:["option",Math.floor(1e8*Math.random())].join("-")}).append(c.templates.suggestion.apply(this,[t].concat(l)))).data(i,c.name),e.data(s,c.displayFn(t)||void 0),e.data(r,JSON.stringify(t)),e.children().each((function(){a.element(this).css(h.css.suggestionChild)})),e}}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(e&&!Array.isArray(e))throw new TypeError("suggestions must be an array");this.$menu&&this.$menu.addClass(this.cssClasses.prefix+(n?"with":"without")+"-"+this.name).removeClass(this.cssClasses.prefix+(n?"without":"with")+"-"+this.name),this.trigger("rendered",t)}function h(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!n}].concat(e),c.templates.header.apply(this,e)}function p(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!n}].concat(e),c.templates.footer.apply(this,e)}},getRoot:function(){return this.$el},update:function(t){function e(e){if(!this.canceled&&t===this.query){var n=[].slice.call(arguments,1);this.cacheSuggestions(t,e,n),this._render.apply(this,[t,e].concat(n))}}if(this.query=t,this.canceled=!1,this.shouldFetchFromCache(t))e.apply(this,[this.cachedSuggestions].concat(this.cachedRenderExtraArgs));else{var n=this,i=function(){n.canceled||n.source(t,e.bind(n))};if(this.debounce){clearTimeout(this.debounceTimeout),this.debounceTimeout=setTimeout((function(){n.debounceTimeout=null,i()}),this.debounce)}else i()}},cacheSuggestions:function(t,e,n){this.cachedQuery=t,this.cachedSuggestions=e,this.cachedRenderExtraArgs=n},shouldFetchFromCache:function(t){return this.cache&&this.cachedQuery===t&&this.cachedSuggestions&&this.cachedSuggestions.length},clearCachedSuggestions:function(){delete this.cachedQuery,delete this.cachedSuggestions,delete this.cachedRenderExtraArgs},cancel:function(){this.canceled=!0},clear:function(){this.$el&&(this.cancel(),this.$el.empty(),this.trigger("rendered",""))},isEmpty:function(){return this._isEmpty},destroy:function(){this.clearCachedSuggestions(),this.$el=null}}),t.exports=h},3354:(t,e,n)=>{"use strict";var i=n(2856),s=n(4910),r=n(3109),o=n(9050),a=n(1228);function u(t){var e,n,r,o=this;(t=t||{}).menu||i.error("menu is required"),i.isArray(t.datasets)||i.isObject(t.datasets)||i.error("1 or more datasets required"),t.datasets||i.error("datasets is required"),this.isOpen=!1,this.isEmpty=!0,this.minLength=t.minLength||0,this.templates={},this.appendTo=t.appendTo||!1,this.css=i.mixin({},a,t.appendTo?a.appendTo:{}),this.cssClasses=t.cssClasses=i.mixin({},a.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix||i.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),e=i.bind(this._onSuggestionClick,this),n=i.bind(this._onSuggestionMouseEnter,this),r=i.bind(this._onSuggestionMouseLeave,this);var c=i.className(this.cssClasses.prefix,this.cssClasses.suggestion);this.$menu=s.element(t.menu).on("mouseenter.aa",c,n).on("mouseleave.aa",c,r).on("click.aa",c,e),this.$container=t.appendTo?t.wrapper:this.$menu,t.templates&&t.templates.header&&(this.templates.header=i.templatify(t.templates.header),this.$menu.prepend(this.templates.header())),t.templates&&t.templates.empty&&(this.templates.empty=i.templatify(t.templates.empty),this.$empty=s.element('<div class="'+i.className(this.cssClasses.prefix,this.cssClasses.empty,!0)+'"></div>'),this.$menu.append(this.$empty),this.$empty.hide()),this.datasets=i.map(t.datasets,(function(e){return function(t,e,n){return new u.Dataset(i.mixin({$menu:t,cssClasses:n},e))}(o.$menu,e,t.cssClasses)})),i.each(this.datasets,(function(t){var e=t.getRoot();e&&0===e.parent().length&&o.$menu.append(e),t.onSync("rendered",o._onRendered,o)})),t.templates&&t.templates.footer&&(this.templates.footer=i.templatify(t.templates.footer),this.$menu.append(this.templates.footer()));var l=this;s.element(window).resize((function(){l._redraw()}))}i.mixin(u.prototype,r,{_onSuggestionClick:function(t){this.trigger("suggestionClicked",s.element(t.currentTarget))},_onSuggestionMouseEnter:function(t){var e=s.element(t.currentTarget);if(!e.hasClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0))){this._removeCursor();var n=this;setTimeout((function(){n._setCursor(e,!1)}),0)}},_onSuggestionMouseLeave:function(t){if(t.relatedTarget&&s.element(t.relatedTarget).closest("."+i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).length>0)return;this._removeCursor(),this.trigger("cursorRemoved")},_onRendered:function(t,e){if(this.isEmpty=i.every(this.datasets,(function(t){return t.isEmpty()})),this.isEmpty)if(e.length>=this.minLength&&this.trigger("empty"),this.$empty)if(e.length<this.minLength)this._hide();else{var n=this.templates.empty({query:this.datasets[0]&&this.datasets[0].query});this.$empty.html(n),this.$empty.show(),this._show()}else i.any(this.datasets,(function(t){return t.templates&&t.templates.empty}))?e.length<this.minLength?this._hide():this._show():this._hide();else this.isOpen&&(this.$empty&&(this.$empty.empty(),this.$empty.hide()),e.length>=this.minLength?this._show():this._hide());this.trigger("datasetRendered")},_hide:function(){this.$container.hide()},_show:function(){this.$container.css("display","block"),this._redraw(),this.trigger("shown")},_redraw:function(){this.isOpen&&this.appendTo&&this.trigger("redrawn")},_getSuggestions:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.suggestion))},_getCursor:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.cursor)).first()},_setCursor:function(t,e){t.first().addClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).attr("aria-selected","true"),this.trigger("cursorMoved",e)},_removeCursor:function(){this._getCursor().removeClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).removeAttr("aria-selected")},_moveCursor:function(t){var e,n,i,s;this.isOpen&&(n=this._getCursor(),e=this._getSuggestions(),this._removeCursor(),-1!==(i=((i=e.index(n)+t)+1)%(e.length+1)-1)?(i<-1&&(i=e.length-1),this._setCursor(s=e.eq(i),!0),this._ensureVisible(s)):this.trigger("cursorRemoved"))},_ensureVisible:function(t){var e,n,i,s;n=(e=t.position().top)+t.height()+parseInt(t.css("margin-top"),10)+parseInt(t.css("margin-bottom"),10),i=this.$menu.scrollTop(),s=this.$menu.height()+parseInt(this.$menu.css("padding-top"),10)+parseInt(this.$menu.css("padding-bottom"),10),e<0?this.$menu.scrollTop(i+e):s<n&&this.$menu.scrollTop(i+(n-s))},close:function(){this.isOpen&&(this.isOpen=!1,this._removeCursor(),this._hide(),this.trigger("closed"))},open:function(){this.isOpen||(this.isOpen=!0,this.isEmpty||this._show(),this.trigger("opened"))},setLanguageDirection:function(t){this.$menu.css("ltr"===t?this.css.ltr:this.css.rtl)},moveCursorUp:function(){this._moveCursor(-1)},moveCursorDown:function(){this._moveCursor(1)},getDatumForSuggestion:function(t){var e=null;return t.length&&(e={raw:o.extractDatum(t),value:o.extractValue(t),datasetName:o.extractDatasetName(t)}),e},getCurrentCursor:function(){return this._getCursor().first()},getDatumForCursor:function(){return this.getDatumForSuggestion(this._getCursor().first())},getDatumForTopSuggestion:function(){return this.getDatumForSuggestion(this._getSuggestions().first())},cursorTopSuggestion:function(){this._setCursor(this._getSuggestions().first(),!1)},update:function(t){i.each(this.datasets,(function(e){e.update(t)}))},empty:function(){i.each(this.datasets,(function(t){t.clear()})),this.isEmpty=!0},isVisible:function(){return this.isOpen&&!this.isEmpty},destroy:function(){this.$menu.off(".aa"),this.$menu=null,i.each(this.datasets,(function(t){t.destroy()}))}}),u.Dataset=o,t.exports=u},50:(t,e,n)=>{"use strict";var i=n(2856),s=n(4910);function r(t){t&&t.el||i.error("EventBus initialized without el"),this.$el=s.element(t.el)}i.mixin(r.prototype,{trigger:function(t,e,n,s){var r=i.Event("autocomplete:"+t);return this.$el.trigger(r,[e,n,s]),r}}),t.exports=r},3109:(t,e,n)=>{"use strict";var i=n(624),s=/\s+/;function r(t,e,n,i){var r;if(!n)return this;for(e=e.split(s),n=i?function(t,e){return t.bind?t.bind(e):function(){t.apply(e,[].slice.call(arguments,0))}}(n,i):n,this._callbacks=this._callbacks||{};r=e.shift();)this._callbacks[r]=this._callbacks[r]||{sync:[],async:[]},this._callbacks[r][t].push(n);return this}function o(t,e,n){return function(){for(var i,s=0,r=t.length;!i&&s<r;s+=1)i=!1===t[s].apply(e,n);return!i}}t.exports={onSync:function(t,e,n){return r.call(this,"sync",t,e,n)},onAsync:function(t,e,n){return r.call(this,"async",t,e,n)},off:function(t){var e;if(!this._callbacks)return this;t=t.split(s);for(;e=t.shift();)delete this._callbacks[e];return this},trigger:function(t){var e,n,r,a,u;if(!this._callbacks)return this;t=t.split(s),r=[].slice.call(arguments,1);for(;(e=t.shift())&&(n=this._callbacks[e]);)a=o(n.sync,this,[e].concat(r)),u=o(n.async,this,[e].concat(r)),a()&&i(u);return this}}},3561:t=>{"use strict";t.exports={wrapper:'<span class="%ROOT%"></span>',dropdown:'<span class="%PREFIX%%DROPDOWN_MENU%"></span>',dataset:'<div class="%PREFIX%%DATASET%-%CLASS%"></div>',suggestions:'<span class="%PREFIX%%SUGGESTIONS%"></span>',suggestion:'<div class="%PREFIX%%SUGGESTION%"></div>'}},2534:(t,e,n)=>{"use strict";var i;i={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"};var s=n(2856),r=n(4910),o=n(3109);function a(t){var e,n,o,a,u,c=this;(t=t||{}).input||s.error("input is missing"),e=s.bind(this._onBlur,this),n=s.bind(this._onFocus,this),o=s.bind(this._onKeydown,this),a=s.bind(this._onInput,this),this.$hint=r.element(t.hint),this.$input=r.element(t.input).on("blur.aa",e).on("focus.aa",n).on("keydown.aa",o),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=s.noop),s.isMsie()?this.$input.on("keydown.aa keypress.aa cut.aa paste.aa",(function(t){i[t.which||t.keyCode]||s.defer(s.bind(c._onInput,c,t))})):this.$input.on("input.aa",a),this.query=this.$input.val(),this.$overflowHelper=(u=this.$input,r.element('<pre aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:u.css("font-family"),fontSize:u.css("font-size"),fontStyle:u.css("font-style"),fontVariant:u.css("font-variant"),fontWeight:u.css("font-weight"),wordSpacing:u.css("word-spacing"),letterSpacing:u.css("letter-spacing"),textIndent:u.css("text-indent"),textRendering:u.css("text-rendering"),textTransform:u.css("text-transform")}).insertAfter(u))}function u(t){return t.altKey||t.ctrlKey||t.metaKey||t.shiftKey}a.normalizeQuery=function(t){return(t||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},s.mixin(a.prototype,o,{_onBlur:function(){this.resetInputValue(),this.$input.removeAttr("aria-activedescendant"),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(t){var e=i[t.which||t.keyCode];this._managePreventDefault(e,t),e&&this._shouldTrigger(e,t)&&this.trigger(e+"Keyed",t)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(t,e){var n,i,s;switch(t){case"tab":i=this.getHint(),s=this.getInputValue(),n=i&&i!==s&&!u(e);break;case"up":case"down":n=!u(e);break;default:n=!1}n&&e.preventDefault()},_shouldTrigger:function(t,e){var n;if("tab"===t)n=!u(e);else n=!0;return n},_checkInputValue:function(){var t,e,n,i,s;t=this.getInputValue(),i=t,s=this.query,n=!(!(e=a.normalizeQuery(i)===a.normalizeQuery(s))||!this.query)&&this.query.length!==t.length,this.query=t,e?n&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(t){this.query=t},getInputValue:function(){return this.$input.val()},setInputValue:function(t,e){void 0===t&&(t=this.query),this.$input.val(t),e?this.clearHint():this._checkInputValue()},expand:function(){this.$input.attr("aria-expanded","true")},collapse:function(){this.$input.attr("aria-expanded","false")},setActiveDescendant:function(t){this.$input.attr("aria-activedescendant",t)},removeActiveDescendant:function(){this.$input.removeAttr("aria-activedescendant")},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(t){this.$hint.val(t)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var t,e,n;n=(t=this.getInputValue())!==(e=this.getHint())&&0===e.indexOf(t),""!==t&&n&&!this.hasOverflow()||this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var t=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=t},isCursorAtEnd:function(){var t,e,n;return t=this.$input.val().length,e=this.$input[0].selectionStart,s.isNumber(e)?e===t:!document.selection||((n=document.selection.createRange()).moveStart("character",-t),t===n.text.length)},destroy:function(){this.$hint.off(".aa"),this.$input.off(".aa"),this.$hint=this.$input=this.$overflowHelper=null}}),t.exports=a},6549:(t,e,n)=>{"use strict";var i="aaAttrs",s=n(2856),r=n(4910),o=n(50),a=n(2534),u=n(3354),c=n(3561),l=n(1228);function h(t){var e,n;if((t=t||{}).input||s.error("missing input"),this.isActivated=!1,this.debug=!!t.debug,this.autoselect=!!t.autoselect,this.autoselectOnBlur=!!t.autoselectOnBlur,this.openOnFocus=!!t.openOnFocus,this.minLength=s.isNumber(t.minLength)?t.minLength:1,this.autoWidth=void 0===t.autoWidth||!!t.autoWidth,this.clearOnSelected=!!t.clearOnSelected,this.tabAutocomplete=void 0===t.tabAutocomplete||!!t.tabAutocomplete,t.hint=!!t.hint,t.hint&&t.appendTo)throw new Error("[autocomplete.js] hint and appendTo options can't be used at the same time");this.css=t.css=s.mixin({},l,t.appendTo?l.appendTo:{}),this.cssClasses=t.cssClasses=s.mixin({},l.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix=s.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),this.listboxId=t.listboxId=[this.cssClasses.root,"listbox",s.getUniqueId()].join("-");var a=function(t){var e,n,o,a;e=r.element(t.input),n=r.element(c.wrapper.replace("%ROOT%",t.cssClasses.root)).css(t.css.wrapper),t.appendTo||"block"!==e.css("display")||"table"!==e.parent().css("display")||n.css("display","table-cell");var u=c.dropdown.replace("%PREFIX%",t.cssClasses.prefix).replace("%DROPDOWN_MENU%",t.cssClasses.dropdownMenu);o=r.element(u).css(t.css.dropdown).attr({role:"listbox",id:t.listboxId}),t.templates&&t.templates.dropdownMenu&&o.html(s.templatify(t.templates.dropdownMenu)());a=e.clone().css(t.css.hint).css(function(t){return{backgroundAttachment:t.css("background-attachment"),backgroundClip:t.css("background-clip"),backgroundColor:t.css("background-color"),backgroundImage:t.css("background-image"),backgroundOrigin:t.css("background-origin"),backgroundPosition:t.css("background-position"),backgroundRepeat:t.css("background-repeat"),backgroundSize:t.css("background-size")}}(e)),a.val("").addClass(s.className(t.cssClasses.prefix,t.cssClasses.hint,!0)).removeAttr("id name placeholder required").prop("readonly",!0).attr({"aria-hidden":"true",autocomplete:"off",spellcheck:"false",tabindex:-1}),a.removeData&&a.removeData();e.data(i,{"aria-autocomplete":e.attr("aria-autocomplete"),"aria-expanded":e.attr("aria-expanded"),"aria-owns":e.attr("aria-owns"),autocomplete:e.attr("autocomplete"),dir:e.attr("dir"),role:e.attr("role"),spellcheck:e.attr("spellcheck"),style:e.attr("style"),type:e.attr("type")}),e.addClass(s.className(t.cssClasses.prefix,t.cssClasses.input,!0)).attr({autocomplete:"off",spellcheck:!1,role:"combobox","aria-autocomplete":t.datasets&&t.datasets[0]&&t.datasets[0].displayKey?"both":"list","aria-expanded":"false","aria-label":t.ariaLabel,"aria-owns":t.listboxId}).css(t.hint?t.css.input:t.css.inputWithNoHint);try{e.attr("dir")||e.attr("dir","auto")}catch(l){}return n=t.appendTo?n.appendTo(r.element(t.appendTo).eq(0)).eq(0):e.wrap(n).parent(),n.prepend(t.hint?a:null).append(o),{wrapper:n,input:e,hint:a,menu:o}}(t);this.$node=a.wrapper;var u=this.$input=a.input;e=a.menu,n=a.hint,t.dropdownMenuContainer&&r.element(t.dropdownMenuContainer).css("position","relative").append(e.css("top","0")),u.on("blur.aa",(function(t){var n=document.activeElement;s.isMsie()&&(e[0]===n||e[0].contains(n))&&(t.preventDefault(),t.stopImmediatePropagation(),s.defer((function(){u.focus()})))})),e.on("mousedown.aa",(function(t){t.preventDefault()})),this.eventBus=t.eventBus||new o({el:u}),this.dropdown=new h.Dropdown({appendTo:t.appendTo,wrapper:this.$node,menu:e,datasets:t.datasets,templates:t.templates,cssClasses:t.cssClasses,minLength:this.minLength}).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onSync("shown",this._onShown,this).onSync("empty",this._onEmpty,this).onSync("redrawn",this._onRedrawn,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=new h.Input({input:u,hint:n}).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._bindKeyboardShortcuts(t),this._setLanguageDirection()}s.mixin(h.prototype,{_bindKeyboardShortcuts:function(t){if(t.keyboardShortcuts){var e=this.$input,n=[];s.each(t.keyboardShortcuts,(function(t){"string"==typeof t&&(t=t.toUpperCase().charCodeAt(0)),n.push(t)})),r.element(document).keydown((function(t){var i=t.target||t.srcElement,s=i.tagName;if(!i.isContentEditable&&"INPUT"!==s&&"SELECT"!==s&&"TEXTAREA"!==s){var r=t.which||t.keyCode;-1!==n.indexOf(r)&&(e.focus(),t.stopPropagation(),t.preventDefault())}}))}},_onSuggestionClicked:function(t,e){var n;(n=this.dropdown.getDatumForSuggestion(e))&&this._select(n,{selectionMethod:"click"})},_onCursorMoved:function(t,e){var n=this.dropdown.getDatumForCursor(),i=this.dropdown.getCurrentCursor().attr("id");this.input.setActiveDescendant(i),n&&(e&&this.input.setInputValue(n.value,!0),this.eventBus.trigger("cursorchanged",n.raw,n.datasetName))},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint(),this.eventBus.trigger("cursorremoved")},_onDatasetRendered:function(){this._updateHint(),this.eventBus.trigger("updated")},_onOpened:function(){this._updateHint(),this.input.expand(),this.eventBus.trigger("opened")},_onEmpty:function(){this.eventBus.trigger("empty")},_onRedrawn:function(){this.$node.css("top","0px"),this.$node.css("left","0px");var t=this.$input[0].getBoundingClientRect();this.autoWidth&&this.$node.css("width",t.width+"px");var e=this.$node[0].getBoundingClientRect(),n=t.bottom-e.top;this.$node.css("top",n+"px");var i=t.left-e.left;this.$node.css("left",i+"px"),this.eventBus.trigger("redrawn")},_onShown:function(){this.eventBus.trigger("shown"),this.autoselect&&this.dropdown.cursorTopSuggestion()},_onClosed:function(){this.input.clearHint(),this.input.removeActiveDescendant(),this.input.collapse(),this.eventBus.trigger("closed")},_onFocused:function(){if(this.isActivated=!0,this.openOnFocus){var t=this.input.getQuery();t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty(),this.dropdown.open()}},_onBlurred:function(){var t,e;t=this.dropdown.getDatumForCursor(),e=this.dropdown.getDatumForTopSuggestion();var n={selectionMethod:"blur"};this.debug||(this.autoselectOnBlur&&t?this._select(t,n):this.autoselectOnBlur&&e?this._select(e,n):(this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()))},_onEnterKeyed:function(t,e){var n,i;n=this.dropdown.getDatumForCursor(),i=this.dropdown.getDatumForTopSuggestion();var s={selectionMethod:"enterKey"};n?(this._select(n,s),e.preventDefault()):this.autoselect&&i&&(this._select(i,s),e.preventDefault())},_onTabKeyed:function(t,e){if(this.tabAutocomplete){var n;(n=this.dropdown.getDatumForCursor())?(this._select(n,{selectionMethod:"tabKey"}),e.preventDefault()):this._autocomplete(!0)}else this.dropdown.close()},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){"rtl"===this.dir&&this._autocomplete()},_onRightKeyed:function(){"ltr"===this.dir&&this._autocomplete()},_onQueryChanged:function(t,e){this.input.clearHintIfInvalid(),e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var t=this.input.getLanguageDirection();this.dir!==t&&(this.dir=t,this.$node.css("direction",t),this.dropdown.setLanguageDirection(t))},_updateHint:function(){var t,e,n,i,r;(t=this.dropdown.getDatumForTopSuggestion())&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(e=this.input.getInputValue(),n=a.normalizeQuery(e),i=s.escapeRegExChars(n),(r=new RegExp("^(?:"+i+")(.+$)","i").exec(t.value))?this.input.setHint(e+r[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(t){var e,n,i,s;e=this.input.getHint(),n=this.input.getQuery(),i=t||this.input.isCursorAtEnd(),e&&n!==e&&i&&((s=this.dropdown.getDatumForTopSuggestion())&&this.input.setInputValue(s.value),this.eventBus.trigger("autocompleted",s.raw,s.datasetName))},_select:function(t,e){void 0!==t.value&&this.input.setQuery(t.value),this.clearOnSelected?this.setVal(""):this.input.setInputValue(t.value,!0),this._setLanguageDirection(),!1===this.eventBus.trigger("selected",t.raw,t.datasetName,e).isDefaultPrevented()&&(this.dropdown.close(),s.defer(s.bind(this.dropdown.empty,this.dropdown)))},open:function(){if(!this.isActivated){var t=this.input.getInputValue();t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty()}this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(t){t=s.toStr(t),this.isActivated?this.input.setInputValue(t):(this.input.setQuery(t),this.input.setInputValue(t,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){this.input.destroy(),this.dropdown.destroy(),function(t,e){var n=t.find(s.className(e.prefix,e.input));s.each(n.data(i),(function(t,e){void 0===t?n.removeAttr(e):n.attr(e,t)})),n.detach().removeClass(s.className(e.prefix,e.input,!0)).insertAfter(t),n.removeData&&n.removeData(i);t.remove()}(this.$node,this.cssClasses),this.$node=null},getWrapper:function(){return this.dropdown.$container[0]}}),h.Dropdown=u,h.Input=a,h.sources=n(8840),t.exports=h},4910:t=>{"use strict";t.exports={element:null}},6177:t=>{"use strict";t.exports=function(t){var e=t.match(/Algolia for JavaScript \((\d+\.)(\d+\.)(\d+)\)/)||t.match(/Algolia for vanilla JavaScript (\d+\.)(\d+\.)(\d+)/);if(e)return[e[1],e[2],e[3]]}},2856:(t,e,n)=>{"use strict";var i,s=n(8820),r=n(4910);function o(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(t){if(void 0===t&&(t=navigator.userAgent),/(msie|trident)/i.test(t)){var e=t.match(/(msie |rv:)(\d+(.\d+)?)/i);if(e)return e[2]}return!1},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return null==t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,(function(t,i){t&&(n.isArray(t)?e[i]=[].concat(t):n.isObject(t)&&(e[i]=n.cloneDeep(t)))})),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,(function(i,s){n&&(n=e.call(null,i,s,t)&&n)})),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,(function(i,s){if(e.call(null,i,s,t))return n=!0,!1})),n):n},getUniqueId:(i=0,function(){return i++}),templatify:function(t){if(this.isFunction(t))return t;var e=r.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return n?t+e:"."+s(t+e,{isIdentifier:!0})},escapeHighlightedString:function(t,e,n){e=e||"<em>";var i=document.createElement("div");i.appendChild(document.createTextNode(e)),n=n||"</em>";var s=document.createElement("div");s.appendChild(document.createTextNode(n));var r=document.createElement("div");return r.appendChild(document.createTextNode(t)),r.innerHTML.replace(RegExp(o(i.innerHTML),"g"),e).replace(RegExp(o(s.innerHTML),"g"),n)}}},9983:(t,e,n)=>{"use strict";var i=n(2856),s=n(533),r=n(6177);var o,a,u=(o=[],a=window.Promise.resolve(),function(t,e){return function(n,s){(function(t,e){return window.Promise.resolve().then((function(){return o.length&&(a=t.search(o),o=[]),a})).then((function(t){if(t)return t.results[e]}))})(t.as,o.push({indexName:t.indexName,query:n,params:e})-1).then((function(t){t&&s(t.hits,t)})).catch((function(t){i.error(t.message)}))}});t.exports=function(t,e){var n=r(t.as._ua);if(n&&n[0]>=3&&n[1]>20){var i="autocomplete.js "+s;-1===t.as._ua.indexOf(i)&&(t.as._ua+="; "+i)}return u(t,e)}},8840:(t,e,n)=>{"use strict";t.exports={hits:n(9983),popularIn:n(4445)}},4445:(t,e,n)=>{"use strict";var i=n(2856),s=n(533),r=n(6177);t.exports=function(t,e,n,o){var a=r(t.as._ua);if(a&&a[0]>=3&&a[1]>20&&((e=e||{}).additionalUA="autocomplete.js "+s),!n.source)return i.error("Missing 'source' key");var u=i.isFunction(n.source)?n.source:function(t){return t[n.source]};if(!n.index)return i.error("Missing 'index' key");var c=n.index;return o=o||{},function(a,l){t.search(a,e,(function(t,a){if(t)i.error(t.message);else{if(a.hits.length>0){var h=a.hits[0],p=i.mixin({hitsPerPage:0},n);delete p.source,delete p.index;var f=r(c.as._ua);return f&&f[0]>=3&&f[1]>20&&(e.additionalUA="autocomplete.js "+s),void c.search(u(h),p,(function(t,e){if(t)i.error(t.message);else{var n=[];if(o.includeAll){var s=o.allTitle||"All departments";n.push(i.mixin({facet:{value:s,count:e.nbHits}},i.cloneDeep(h)))}i.each(e.facets,(function(t,e){i.each(t,(function(t,s){n.push(i.mixin({facet:{facet:e,value:s,count:t}},i.cloneDeep(h)))}))}));for(var r=1;r<a.hits.length;++r)n.push(a.hits[r]);l(n,a)}}))}l([])}}))}}},295:(t,e,n)=>{"use strict";var i=n(6990);n(4910).element=i;var s=n(2856);s.isArray=i.isArray,s.isFunction=i.isFunction,s.isObject=i.isPlainObject,s.bind=i.proxy,s.each=function(t,e){i.each(t,(function(t,n){return e(n,t)}))},s.map=i.map,s.mixin=i.extend,s.Event=i.Event;var r="aaAutocomplete",o=n(6549),a=n(50);function u(t,e,n,u){n=s.isArray(n)?n:[].slice.call(arguments,2);var c=i(t).each((function(t,s){var c=i(s),l=new a({el:c}),h=u||new o({input:c,eventBus:l,dropdownMenuContainer:e.dropdownMenuContainer,hint:void 0===e.hint||!!e.hint,minLength:e.minLength,autoselect:e.autoselect,autoselectOnBlur:e.autoselectOnBlur,tabAutocomplete:e.tabAutocomplete,openOnFocus:e.openOnFocus,templates:e.templates,debug:e.debug,clearOnSelected:e.clearOnSelected,cssClasses:e.cssClasses,datasets:n,keyboardShortcuts:e.keyboardShortcuts,appendTo:e.appendTo,autoWidth:e.autoWidth,ariaLabel:e.ariaLabel||s.getAttribute("aria-label")});c.data(r,h)}));return c.autocomplete={},s.each(["open","close","getVal","setVal","destroy","getWrapper"],(function(t){c.autocomplete[t]=function(){var e,n=arguments;return c.each((function(s,o){var a=i(o).data(r);e=a[t].apply(a,n)})),e}})),c}u.sources=o.sources,u.escapeHighlightedString=s.escapeHighlightedString;var c="autocomplete"in window,l=window.autocomplete;u.noConflict=function(){return c?window.autocomplete=l:delete window.autocomplete,u},t.exports=u},533:t=>{t.exports="0.38.1"},6990:t=>{var e;e=window,t.exports=function(t){var e,n,i=function(){var e,n,i,s,r,o,a=[],u=a.concat,c=a.filter,l=a.slice,h=t.document,p={},f={},d={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},g=/^\s*<(\w+|!)[^>]*>/,m=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,y=/^(?:body|html)$/i,w=/([A-Z])/g,b=["val","css","html","text","data","width","height","offset"],C=["after","prepend","before","append"],x=h.createElement("table"),_=h.createElement("tr"),S={tr:h.createElement("tbody"),tbody:x,thead:x,tfoot:x,td:_,th:_,"*":h.createElement("div")},E=/complete|loaded|interactive/,A=/^[\w-]*$/,$={},T=$.toString,O={},D=h.createElement("div"),N={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},k=Array.isArray||function(t){return t instanceof Array};function I(t){return null==t?String(t):$[T.call(t)]||"object"}function P(t){return"function"==I(t)}function L(t){return null!=t&&t==t.window}function M(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function F(t){return"object"==I(t)}function R(t){return F(t)&&!L(t)&&Object.getPrototypeOf(t)==Object.prototype}function q(t){var e=!!t&&"length"in t&&t.length,n=i.type(t);return"function"!=n&&!L(t)&&("array"==n||0===e||"number"==typeof e&&e>0&&e-1 in t)}function V(t){return c.call(t,(function(t){return null!=t}))}function H(t){return t.length>0?i.fn.concat.apply([],t):t}function B(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function K(t){return t in f?f[t]:f[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function j(t,e){return"number"!=typeof e||d[B(t)]?e:e+"px"}function z(t){var e,n;return p[t]||(e=h.createElement(t),h.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),p[t]=n),p[t]}function U(t){return"children"in t?l.call(t.children):i.map(t.childNodes,(function(t){if(1==t.nodeType)return t}))}function Q(t,e){var n,i=t?t.length:0;for(n=0;n<i;n++)this[n]=t[n];this.length=i,this.selector=e||""}function W(t,i,s){for(n in i)s&&(R(i[n])||k(i[n]))?(R(i[n])&&!R(t[n])&&(t[n]={}),k(i[n])&&!k(t[n])&&(t[n]=[]),W(t[n],i[n],s)):i[n]!==e&&(t[n]=i[n])}function Z(t,e){return null==e?i(t):i(t).filter(e)}function X(t,e,n,i){return P(e)?e.call(t,n,i):e}function G(t,e,n){null==n?t.removeAttribute(e):t.setAttribute(e,n)}function J(t,n){var i=t.className||"",s=i&&i.baseVal!==e;if(n===e)return s?i.baseVal:i;s?i.baseVal=n:t.className=n}function Y(t){try{return t?"true"==t||"false"!=t&&("null"==t?null:+t+""==t?+t:/^[\[\{]/.test(t)?i.parseJSON(t):t):t}catch(e){return t}}function tt(t,e){e(t);for(var n=0,i=t.childNodes.length;n<i;n++)tt(t.childNodes[n],e)}return O.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var i,s=t.parentNode,r=!s;return r&&(s=D).appendChild(t),i=~O.qsa(s,e).indexOf(t),r&&D.removeChild(t),i},r=function(t){return t.replace(/-+(.)?/g,(function(t,e){return e?e.toUpperCase():""}))},o=function(t){return c.call(t,(function(e,n){return t.indexOf(e)==n}))},O.fragment=function(t,n,s){var r,o,a;return m.test(t)&&(r=i(h.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(v,"<$1></$2>")),n===e&&(n=g.test(t)&&RegExp.$1),n in S||(n="*"),(a=S[n]).innerHTML=""+t,r=i.each(l.call(a.childNodes),(function(){a.removeChild(this)}))),R(s)&&(o=i(r),i.each(s,(function(t,e){b.indexOf(t)>-1?o[t](e):o.attr(t,e)}))),r},O.Z=function(t,e){return new Q(t,e)},O.isZ=function(t){return t instanceof O.Z},O.init=function(t,n){var s;if(!t)return O.Z();if("string"==typeof t)if("<"==(t=t.trim())[0]&&g.test(t))s=O.fragment(t,RegExp.$1,n),t=null;else{if(n!==e)return i(n).find(t);s=O.qsa(h,t)}else{if(P(t))return i(h).ready(t);if(O.isZ(t))return t;if(k(t))s=V(t);else if(F(t))s=[t],t=null;else if(g.test(t))s=O.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==e)return i(n).find(t);s=O.qsa(h,t)}}return O.Z(s,t)},(i=function(t,e){return O.init(t,e)}).extend=function(t){var e,n=l.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach((function(n){W(t,n,e)})),t},O.qsa=function(t,e){var n,i="#"==e[0],s=!i&&"."==e[0],r=i||s?e.slice(1):e,o=A.test(r);return t.getElementById&&o&&i?(n=t.getElementById(r))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:l.call(o&&!i&&t.getElementsByClassName?s?t.getElementsByClassName(r):t.getElementsByTagName(e):t.querySelectorAll(e))},i.contains=h.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},i.type=I,i.isFunction=P,i.isWindow=L,i.isArray=k,i.isPlainObject=R,i.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},i.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},i.inArray=function(t,e,n){return a.indexOf.call(e,t,n)},i.camelCase=r,i.trim=function(t){return null==t?"":String.prototype.trim.call(t)},i.uuid=0,i.support={},i.expr={},i.noop=function(){},i.map=function(t,e){var n,i,s,r=[];if(q(t))for(i=0;i<t.length;i++)null!=(n=e(t[i],i))&&r.push(n);else for(s in t)null!=(n=e(t[s],s))&&r.push(n);return H(r)},i.each=function(t,e){var n,i;if(q(t)){for(n=0;n<t.length;n++)if(!1===e.call(t[n],n,t[n]))return t}else for(i in t)if(!1===e.call(t[i],i,t[i]))return t;return t},i.grep=function(t,e){return c.call(t,e)},t.JSON&&(i.parseJSON=JSON.parse),i.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),(function(t,e){$["[object "+e+"]"]=e.toLowerCase()})),i.fn={constructor:O.Z,length:0,forEach:a.forEach,reduce:a.reduce,push:a.push,sort:a.sort,splice:a.splice,indexOf:a.indexOf,concat:function(){var t,e,n=[];for(t=0;t<arguments.length;t++)e=arguments[t],n[t]=O.isZ(e)?e.toArray():e;return u.apply(O.isZ(this)?this.toArray():this,n)},map:function(t){return i(i.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return i(l.apply(this,arguments))},ready:function(t){return E.test(h.readyState)&&h.body?t(i):h.addEventListener("DOMContentLoaded",(function(){t(i)}),!1),this},get:function(t){return t===e?l.call(this):this[t>=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each((function(){null!=this.parentNode&&this.parentNode.removeChild(this)}))},each:function(t){return a.every.call(this,(function(e,n){return!1!==t.call(e,n,e)})),this},filter:function(t){return P(t)?this.not(this.not(t)):i(c.call(this,(function(e){return O.matches(e,t)})))},add:function(t,e){return i(o(this.concat(i(t,e))))},is:function(t){return this.length>0&&O.matches(this[0],t)},not:function(t){var n=[];if(P(t)&&t.call!==e)this.each((function(e){t.call(this,e)||n.push(this)}));else{var s="string"==typeof t?this.filter(t):q(t)&&P(t.item)?l.call(t):i(t);this.forEach((function(t){s.indexOf(t)<0&&n.push(t)}))}return i(n)},has:function(t){return this.filter((function(){return F(t)?i.contains(this,t):i(this).find(t).size()}))},eq:function(t){return-1===t?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!F(t)?t:i(t)},last:function(){var t=this[this.length-1];return t&&!F(t)?t:i(t)},find:function(t){var e=this;return t?"object"==typeof t?i(t).filter((function(){var t=this;return a.some.call(e,(function(e){return i.contains(e,t)}))})):1==this.length?i(O.qsa(this[0],t)):this.map((function(){return O.qsa(this,t)})):i()},closest:function(t,e){var n=[],s="object"==typeof t&&i(t);return this.each((function(i,r){for(;r&&!(s?s.indexOf(r)>=0:O.matches(r,t));)r=r!==e&&!M(r)&&r.parentNode;r&&n.indexOf(r)<0&&n.push(r)})),i(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=i.map(n,(function(t){if((t=t.parentNode)&&!M(t)&&e.indexOf(t)<0)return e.push(t),t}));return Z(e,t)},parent:function(t){return Z(o(this.pluck("parentNode")),t)},children:function(t){return Z(this.map((function(){return U(this)})),t)},contents:function(){return this.map((function(){return this.contentDocument||l.call(this.childNodes)}))},siblings:function(t){return Z(this.map((function(t,e){return c.call(U(e.parentNode),(function(t){return t!==e}))})),t)},empty:function(){return this.each((function(){this.innerHTML=""}))},pluck:function(t){return i.map(this,(function(e){return e[t]}))},show:function(){return this.each((function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=z(this.nodeName))}))},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var e=P(t);if(this[0]&&!e)var n=i(t).get(0),s=n.parentNode||this.length>1;return this.each((function(r){i(this).wrapAll(e?t.call(this,r):s?n.cloneNode(!0):n)}))},wrapAll:function(t){if(this[0]){var e;for(i(this[0]).before(t=i(t));(e=t.children()).length;)t=e.first();i(t).append(this)}return this},wrapInner:function(t){var e=P(t);return this.each((function(n){var s=i(this),r=s.contents(),o=e?t.call(this,n):t;r.length?r.wrapAll(o):s.append(o)}))},unwrap:function(){return this.parent().each((function(){i(this).replaceWith(i(this).children())})),this},clone:function(){return this.map((function(){return this.cloneNode(!0)}))},hide:function(){return this.css("display","none")},toggle:function(t){return this.each((function(){var n=i(this);(t===e?"none"==n.css("display"):t)?n.show():n.hide()}))},prev:function(t){return i(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return i(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each((function(e){var n=this.innerHTML;i(this).empty().append(X(this,t,e,n))})):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each((function(e){var n=X(this,t,e,this.textContent);this.textContent=null==n?"":""+n})):0 in this?this.pluck("textContent").join(""):null},attr:function(t,i){var s;return"string"!=typeof t||1 in arguments?this.each((function(e){if(1===this.nodeType)if(F(t))for(n in t)G(this,n,t[n]);else G(this,t,X(this,i,e,this.getAttribute(t)))})):0 in this&&1==this[0].nodeType&&null!=(s=this[0].getAttribute(t))?s:e},removeAttr:function(t){return this.each((function(){1===this.nodeType&&t.split(" ").forEach((function(t){G(this,t)}),this)}))},prop:function(t,e){return t=N[t]||t,1 in arguments?this.each((function(n){this[t]=X(this,e,n,this[t])})):this[0]&&this[0][t]},removeProp:function(t){return t=N[t]||t,this.each((function(){delete this[t]}))},data:function(t,n){var i="data-"+t.replace(w,"-$1").toLowerCase(),s=1 in arguments?this.attr(i,n):this.attr(i);return null!==s?Y(s):e},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each((function(e){this.value=X(this,t,e,this.value)}))):this[0]&&(this[0].multiple?i(this[0]).find("option").filter((function(){return this.selected})).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each((function(t){var n=i(this),s=X(this,e,t,n.offset()),r=n.offsetParent().offset(),o={top:s.top-r.top,left:s.left-r.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)}));if(!this.length)return null;if(h.documentElement!==this[0]&&!i.contains(h.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+t.pageXOffset,top:n.top+t.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(t,e){if(arguments.length<2){var s=this[0];if("string"==typeof t){if(!s)return;return s.style[r(t)]||getComputedStyle(s,"").getPropertyValue(t)}if(k(t)){if(!s)return;var o={},a=getComputedStyle(s,"");return i.each(t,(function(t,e){o[e]=s.style[r(e)]||a.getPropertyValue(e)})),o}}var u="";if("string"==I(t))e||0===e?u=B(t)+":"+j(t,e):this.each((function(){this.style.removeProperty(B(t))}));else for(n in t)t[n]||0===t[n]?u+=B(n)+":"+j(n,t[n])+";":this.each((function(){this.style.removeProperty(B(n))}));return this.each((function(){this.style.cssText+=";"+u}))},index:function(t){return t?this.indexOf(i(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&a.some.call(this,(function(t){return this.test(J(t))}),K(t))},addClass:function(t){return t?this.each((function(e){if("className"in this){s=[];var n=J(this);X(this,t,e,n).split(/\s+/g).forEach((function(t){i(this).hasClass(t)||s.push(t)}),this),s.length&&J(this,n+(n?" ":"")+s.join(" "))}})):this},removeClass:function(t){return this.each((function(n){if("className"in this){if(t===e)return J(this,"");s=J(this),X(this,t,n,s).split(/\s+/g).forEach((function(t){s=s.replace(K(t)," ")})),J(this,s.trim())}}))},toggleClass:function(t,n){return t?this.each((function(s){var r=i(this);X(this,t,s,J(this)).split(/\s+/g).forEach((function(t){(n===e?!r.hasClass(t):n)?r.addClass(t):r.removeClass(t)}))})):this},scrollTop:function(t){if(this.length){var n="scrollTop"in this[0];return t===e?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var n="scrollLeft"in this[0];return t===e?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),s=y.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(i(t).css("margin-top"))||0,n.left-=parseFloat(i(t).css("margin-left"))||0,s.top+=parseFloat(i(e[0]).css("border-top-width"))||0,s.left+=parseFloat(i(e[0]).css("border-left-width"))||0,{top:n.top-s.top,left:n.left-s.left}}},offsetParent:function(){return this.map((function(){for(var t=this.offsetParent||h.body;t&&!y.test(t.nodeName)&&"static"==i(t).css("position");)t=t.offsetParent;return t}))}},i.fn.detach=i.fn.remove,["width","height"].forEach((function(t){var n=t.replace(/./,(function(t){return t[0].toUpperCase()}));i.fn[t]=function(s){var r,o=this[0];return s===e?L(o)?o["inner"+n]:M(o)?o.documentElement["scroll"+n]:(r=this.offset())&&r[t]:this.each((function(e){(o=i(this)).css(t,X(this,s,e,o[t]()))}))}})),C.forEach((function(n,s){var r=s%2;i.fn[n]=function(){var n,o,a=i.map(arguments,(function(t){var s=[];return"array"==(n=I(t))?(t.forEach((function(t){return t.nodeType!==e?s.push(t):i.zepto.isZ(t)?s=s.concat(t.get()):void(s=s.concat(O.fragment(t)))})),s):"object"==n||null==t?t:O.fragment(t)})),u=this.length>1;return a.length<1?this:this.each((function(e,n){o=r?n:n.parentNode,n=0==s?n.nextSibling:1==s?n.firstChild:2==s?n:null;var c=i.contains(h.documentElement,o);a.forEach((function(e){if(u)e=e.cloneNode(!0);else if(!o)return i(e).remove();o.insertBefore(e,n),c&&tt(e,(function(e){if(!(null==e.nodeName||"SCRIPT"!==e.nodeName.toUpperCase()||e.type&&"text/javascript"!==e.type||e.src)){var n=e.ownerDocument?e.ownerDocument.defaultView:t;n.eval.call(n,e.innerHTML)}}))}))}))},i.fn[r?n+"To":"insert"+(s?"Before":"After")]=function(t){return i(t)[n](this),this}})),O.Z.prototype=Q.prototype=i.fn,O.uniq=o,O.deserializeValue=Y,i.zepto=O,i}();return function(e){var n,i=1,s=Array.prototype.slice,r=e.isFunction,o=function(t){return"string"==typeof t},a={},u={},c="onfocusin"in t,l={focus:"focusin",blur:"focusout"},h={mouseenter:"mouseover",mouseleave:"mouseout"};function p(t){return t._zid||(t._zid=i++)}function f(t,e,n,i){if((e=d(e)).ns)var s=g(e.ns);return(a[p(t)]||[]).filter((function(t){return t&&(!e.e||t.e==e.e)&&(!e.ns||s.test(t.ns))&&(!n||p(t.fn)===p(n))&&(!i||t.sel==i)}))}function d(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function g(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function m(t,e){return t.del&&!c&&t.e in l||!!e}function v(t){return h[t]||c&&l[t]||t}function y(t,i,s,r,o,u,c){var l=p(t),f=a[l]||(a[l]=[]);i.split(/\s/).forEach((function(i){if("ready"==i)return e(document).ready(s);var a=d(i);a.fn=s,a.sel=o,a.e in h&&(s=function(t){var n=t.relatedTarget;if(!n||n!==this&&!e.contains(this,n))return a.fn.apply(this,arguments)}),a.del=u;var l=u||s;a.proxy=function(e){if(!(e=S(e)).isImmediatePropagationStopped()){try{var i=Object.getOwnPropertyDescriptor(e,"data");i&&!i.writable||(e.data=r)}catch(e){}var s=l.apply(t,e._args==n?[e]:[e].concat(e._args));return!1===s&&(e.preventDefault(),e.stopPropagation()),s}},a.i=f.length,f.push(a),"addEventListener"in t&&t.addEventListener(v(a.e),a.proxy,m(a,c))}))}function w(t,e,n,i,s){var r=p(t);(e||"").split(/\s/).forEach((function(e){f(t,e,n,i).forEach((function(e){delete a[r][e.i],"removeEventListener"in t&&t.removeEventListener(v(e.e),e.proxy,m(e,s))}))}))}u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",e.event={add:y,remove:w},e.proxy=function(t,n){var i=2 in arguments&&s.call(arguments,2);if(r(t)){var a=function(){return t.apply(n,i?i.concat(s.call(arguments)):arguments)};return a._zid=p(t),a}if(o(n))return i?(i.unshift(t[n],t),e.proxy.apply(null,i)):e.proxy(t[n],t);throw new TypeError("expected function")},e.fn.bind=function(t,e,n){return this.on(t,e,n)},e.fn.unbind=function(t,e){return this.off(t,e)},e.fn.one=function(t,e,n,i){return this.on(t,e,n,i,1)};var b=function(){return!0},C=function(){return!1},x=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,_={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};function S(t,i){if(i||!t.isDefaultPrevented){i||(i=t),e.each(_,(function(e,n){var s=i[e];t[e]=function(){return this[n]=b,s&&s.apply(i,arguments)},t[n]=C}));try{t.timeStamp||(t.timeStamp=Date.now())}catch(s){}(i.defaultPrevented!==n?i.defaultPrevented:"returnValue"in i?!1===i.returnValue:i.getPreventDefault&&i.getPreventDefault())&&(t.isDefaultPrevented=b)}return t}function E(t){var e,i={originalEvent:t};for(e in t)x.test(e)||t[e]===n||(i[e]=t[e]);return S(i,t)}e.fn.delegate=function(t,e,n){return this.on(e,t,n)},e.fn.undelegate=function(t,e,n){return this.off(e,t,n)},e.fn.live=function(t,n){return e(document.body).delegate(this.selector,t,n),this},e.fn.die=function(t,n){return e(document.body).undelegate(this.selector,t,n),this},e.fn.on=function(t,i,a,u,c){var l,h,p=this;return t&&!o(t)?(e.each(t,(function(t,e){p.on(t,i,a,e,c)})),p):(o(i)||r(u)||!1===u||(u=a,a=i,i=n),u!==n&&!1!==a||(u=a,a=n),!1===u&&(u=C),p.each((function(n,r){c&&(l=function(t){return w(r,t.type,u),u.apply(this,arguments)}),i&&(h=function(t){var n,o=e(t.target).closest(i,r).get(0);if(o&&o!==r)return n=e.extend(E(t),{currentTarget:o,liveFired:r}),(l||u).apply(o,[n].concat(s.call(arguments,1)))}),y(r,t,u,a,i,h||l)})))},e.fn.off=function(t,i,s){var a=this;return t&&!o(t)?(e.each(t,(function(t,e){a.off(t,i,e)})),a):(o(i)||r(s)||!1===s||(s=i,i=n),!1===s&&(s=C),a.each((function(){w(this,t,s,i)})))},e.fn.trigger=function(t,n){return(t=o(t)||e.isPlainObject(t)?e.Event(t):S(t))._args=n,this.each((function(){t.type in l&&"function"==typeof this[t.type]?this[t.type]():"dispatchEvent"in this?this.dispatchEvent(t):e(this).triggerHandler(t,n)}))},e.fn.triggerHandler=function(t,n){var i,s;return this.each((function(r,a){(i=E(o(t)?e.Event(t):t))._args=n,i.target=a,e.each(f(a,t.type||t),(function(t,e){if(s=e.proxy(i),i.isImmediatePropagationStopped())return!1}))})),s},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach((function(t){e.fn[t]=function(e){return 0 in arguments?this.bind(t,e):this.trigger(t)}})),e.Event=function(t,e){o(t)||(t=(e=t).type);var n=document.createEvent(u[t]||"Events"),i=!0;if(e)for(var s in e)"bubbles"==s?i=!!e[s]:n[s]=e[s];return n.initEvent(t,i,!0),S(n)}}(i),n=[],i.fn.remove=function(){return this.each((function(){this.parentNode&&("IMG"===this.tagName&&(n.push(this),this.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",e&&clearTimeout(e),e=setTimeout((function(){n=[]}),6e4)),this.parentNode.removeChild(this))}))},function(t){var e={},n=t.fn.data,i=t.camelCase,s=t.expando="Zepto"+ +new Date,r=[];function o(r,o){var u=r[s],c=u&&e[u];if(void 0===o)return c||a(r);if(c){if(o in c)return c[o];var l=i(o);if(l in c)return c[l]}return n.call(t(r),o)}function a(n,r,o){var a=n[s]||(n[s]=++t.uuid),c=e[a]||(e[a]=u(n));return void 0!==r&&(c[i(r)]=o),c}function u(e){var n={};return t.each(e.attributes||r,(function(e,s){0==s.name.indexOf("data-")&&(n[i(s.name.replace("data-",""))]=t.zepto.deserializeValue(s.value))})),n}t.fn.data=function(e,n){return void 0===n?t.isPlainObject(e)?this.each((function(n,i){t.each(e,(function(t,e){a(i,t,e)}))})):0 in this?o(this[0],e):void 0:this.each((function(){a(this,e,n)}))},t.data=function(e,n,i){return t(e).data(n,i)},t.hasData=function(n){var i=n[s],r=i&&e[i];return!!r&&!t.isEmptyObject(r)},t.fn.removeData=function(n){return"string"==typeof n&&(n=n.split(/\s+/)),this.each((function(){var r=this[s],o=r&&e[r];o&&t.each(n||o,(function(t){delete o[n?i(this):t]}))}))},["remove","empty"].forEach((function(e){var n=t.fn[e];t.fn[e]=function(){var t=this.find("*");return"remove"===e&&(t=t.add(this)),t.removeData(),n.call(this)}}))}(i),i}(e)},8820:t=>{"use strict";var e={}.hasOwnProperty,n=/[ -,\.\/:-@\[-\^`\{-~]/,i=/[ -,\.\/:-@\[\]\^`\{-~]/,s=/(^|\\+)?(\\[A-F0-9]{1,6})\x20(?![a-fA-F0-9\x20])/g,r=function t(r,o){"single"!=(o=function(t,n){if(!t)return n;var i={};for(var s in n)i[s]=e.call(t,s)?t[s]:n[s];return i}(o,t.options)).quotes&&"double"!=o.quotes&&(o.quotes="single");for(var a="double"==o.quotes?'"':"'",u=o.isIdentifier,c=r.charAt(0),l="",h=0,p=r.length;h<p;){var f=r.charAt(h++),d=f.charCodeAt(),g=void 0;if(d<32||d>126){if(d>=55296&&d<=56319&&h<p){var m=r.charCodeAt(h++);56320==(64512&m)?d=((1023&d)<<10)+(1023&m)+65536:h--}g="\\"+d.toString(16).toUpperCase()+" "}else g=o.escapeEverything?n.test(f)?"\\"+f:"\\"+d.toString(16).toUpperCase()+" ":/[\t\n\f\r\x0B]/.test(f)?"\\"+d.toString(16).toUpperCase()+" ":"\\"==f||!u&&('"'==f&&a==f||"'"==f&&a==f)||u&&i.test(f)?"\\"+f:f;l+=g}return u&&(/^-[-\d]/.test(l)?l="\\-"+l.slice(1):/\d/.test(c)&&(l="\\3"+c+" "+l.slice(1))),l=l.replace(s,(function(t,e,n){return e&&e.length%2?t:(e||"")+n})),!u&&o.wrap?a+l+a:l};r.options={escapeEverything:!1,isIdentifier:!1,quotes:"single",wrap:!1},r.version="3.0.0",t.exports=r},624:(t,e,n)=>{"use strict";var i,s,r,o=[n(5525),n(4785),n(8291),n(2709),n(2506),n(9176)],a=-1,u=[],c=!1;function l(){i&&s&&(i=!1,s.length?u=s.concat(u):a=-1,u.length&&h())}function h(){if(!i){c=!1,i=!0;for(var t=u.length,e=setTimeout(l);t;){for(s=u,u=[];s&&++a<t;)s[a].run();a=-1,t=u.length}s=null,a=-1,i=!1,clearTimeout(e)}}for(var p=-1,f=o.length;++p<f;)if(o[p]&&o[p].test&&o[p].test()){r=o[p].install(h);break}function d(t,e){this.fun=t,this.array=e}d.prototype.run=function(){var t=this.fun,e=this.array;switch(e.length){case 0:return t();case 1:return t(e[0]);case 2:return t(e[0],e[1]);case 3:return t(e[0],e[1],e[2]);default:return t.apply(null,e)}},t.exports=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];u.push(new d(t,e)),c||i||(c=!0,r())}},2709:(t,e,n)=>{"use strict";e.test=function(){return!n.g.setImmediate&&void 0!==n.g.MessageChannel},e.install=function(t){var e=new n.g.MessageChannel;return e.port1.onmessage=t,function(){e.port2.postMessage(0)}}},8291:(t,e,n)=>{"use strict";var i=n.g.MutationObserver||n.g.WebKitMutationObserver;e.test=function(){return i},e.install=function(t){var e=0,s=new i(t),r=n.g.document.createTextNode("");return s.observe(r,{characterData:!0}),function(){r.data=e=++e%2}}},4785:(t,e,n)=>{"use strict";e.test=function(){return"function"==typeof n.g.queueMicrotask},e.install=function(t){return function(){n.g.queueMicrotask(t)}}},2506:(t,e,n)=>{"use strict";e.test=function(){return"document"in n.g&&"onreadystatechange"in n.g.document.createElement("script")},e.install=function(t){return function(){var e=n.g.document.createElement("script");return e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},n.g.document.documentElement.appendChild(e),t}}},9176:(t,e)=>{"use strict";e.test=function(){return!0},e.install=function(t){return function(){setTimeout(t,0)}}}}]); \ No newline at end of file diff --git a/assets/js/8443.72431470.js.LICENSE.txt b/assets/js/8443.72431470.js.LICENSE.txt new file mode 100644 index 000000000..4f7ccd8a7 --- /dev/null +++ b/assets/js/8443.72431470.js.LICENSE.txt @@ -0,0 +1 @@ +/*! https://mths.be/cssesc v3.0.0 by @mathias */ diff --git a/assets/js/84e198a2.0eb27301.js b/assets/js/84e198a2.0eb27301.js new file mode 100644 index 000000000..bc3cc4ad4 --- /dev/null +++ b/assets/js/84e198a2.0eb27301.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5385],{1161:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>r});var n=t(5893),o=t(1151);const a={label:"eac3to",sidebar_position:8},s="eac3to",l={id:"utilities/eac3to",title:"eac3to",description:"eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV).",source:"@site/docs/utilities/eac3to.mdx",sourceDirName:"utilities",slug:"/utilities/eac3to",permalink:"/docs/utilities/eac3to",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/eac3to.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{label:"eac3to",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool"},next:{title:"FFmpeg",permalink:"/docs/utilities/ffmpeg"}},d={},r=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Audio conversion",id:"audio-conversion",level:3},{value:"Get BDMV info",id:"get-bdmv-info",level:3},{value:"Demux",id:"demux",level:3},{value:"Delay audio",id:"delay-audio",level:3}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"eac3to",children:"eac3to"}),"\n",(0,n.jsx)(i.p,{children:"eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV)."}),"\n",(0,n.jsx)(i.admonition,{title:"Compatibility",type:"info",children:(0,n.jsx)(i.p,{children:"This is a Windows only software, although usage with Wine is possible."})}),"\n",(0,n.jsx)(i.admonition,{title:"Avoid using when possible",type:"caution",children:(0,n.jsxs)(i.p,{children:["There is absolutely no reason whatsoever to use this software unless required by paleolithic ",(0,n.jsx)(i.a,{href:"https://wiki.installgentoo.com/wiki/Private_trackers",children:"private trackers"}),", due to a bajillion dependencies needed that aren't bundled with the download itself. Use something like FFmpeg instead."]})}),"\n",(0,n.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Download from ",(0,n.jsx)(i.a,{href:"https://www.videohelp.com/software/eac3to",children:"VideoHelp"}),", drag and drop into your designated folder, add to PATH when necessary."]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(i.h3,{id:"audio-conversion",children:"Audio conversion"}),"\n",(0,n.jsx)(i.p,{children:"Examples:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"eac3to source.pcm destination.flac\n"})}),"\n",(0,n.jsx)(i.p,{children:"(Convert PCM audio to FLAC)"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"eac3to source.thd destination.flac destination.ac3\n"})}),"\n",(0,n.jsx)(i.p,{children:"(Convert TrueHD to FLAC while also extracting the AC-3 compatibility layer)"}),"\n",(0,n.jsx)(i.h3,{id:"get-bdmv-info",children:"Get BDMV info"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"eac3to Movie.2024.Bluray/BDMV\n"})}),"\n",(0,n.jsx)(i.h3,{id:"demux",children:"Demux"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"eac3to Movie.2024.Bluray/BDMV -demux\n"})}),"\n",(0,n.jsx)(i.h3,{id:"delay-audio",children:"Delay audio"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"eac3to input.eac3 output.eac3 1000ms\n"})})]})}function u(e={}){const{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>l,a:()=>s});var n=t(7294);const o={},a=n.createContext(o);function s(e){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8634481e.09b3b3c4.js b/assets/js/8634481e.09b3b3c4.js deleted file mode 100644 index ae94d6045..000000000 --- a/assets/js/8634481e.09b3b3c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5795],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=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 o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),f=i,m=u["".concat(l,".").concat(f)]||u[f]||d[f]||o;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:i,a[1]=s;for(var c=2;c<o;c++)a[c]=n[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}f.displayName="MDXCreateElement"},5986:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(7462),i=(n(7294),n(3905));const o={title:"Intro",sidebar_position:1},a="Intro",s={unversionedId:"filtering/intro",id:"filtering/intro",title:"Intro",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/filtering/intro.md",sourceDirName:"filtering",slug:"/filtering/intro",permalink:"/docs/filtering/intro",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Intro",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"WebVTT",permalink:"/docs/subtitles/webvtt"},next:{title:"Deband",permalink:"/docs/filtering/deband"}},l={},c=[{value:"Lore",id:"lore",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"intro"},"Intro"),(0,i.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"This is where filtering comes into play, currently there are three players in the filtering game. ",(0,i.kt)("a",{parentName:"p",href:"https://ffmpeg.org"},"FFmpeg"),", ",(0,i.kt)("a",{parentName:"p",href:"https://vapoursynth.com"},"Vapoursynth"),", and ",(0,i.kt)("a",{parentName:"p",href:"http://avisynth.nl/index.php/Main_Page"},"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."),(0,i.kt)("h2",{id:"lore"},"Lore"),(0,i.kt)("p",null,"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 ",(0,i.kt)("strong",{parentName:"p"},"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)."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/86ba2311.75422132.js b/assets/js/86ba2311.75422132.js new file mode 100644 index 000000000..0be9c714c --- /dev/null +++ b/assets/js/86ba2311.75422132.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4093],{5029:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var i=t(5893),n=t(1151);const s={label:"VP9",sidebar_position:5},r="VP9",c={id:"video/VP9",title:"VP9",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VP9.mdx",sourceDirName:"video",slug:"/video/VP9",permalink:"/docs/video/VP9",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VP9.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"VP9",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"VP8",permalink:"/docs/video/VP8"},next:{title:"AV1",permalink:"/docs/video/AV1"}},d={},a=[];function u(e){const o={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h1,{id:"vp9",children:"VP9"}),"\n",(0,i.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(o.p,{children:["VP9, famous for being YouTube's codec of choice for many years, is a royalty free video compression format that competes with ",(0,i.jsx)(o.a,{href:"/docs/video/HEVC",children:"HEVC"})," and ",(0,i.jsx)(o.a,{href:"/docs/video/AVC",children:"AVC"}),". It is slightly less efficient than HEVC in terms of visual quality, but VP9 is a computationally much simpler codec and therefore is very easy on system resources when decoding. If you're interested in VP9 encoding, please see the ",(0,i.jsx)(o.a,{href:"/docs/encoders/vpxenc",children:"vpxenc"})," or ",(0,i.jsx)(o.a,{href:"/docs/encoders/SVT-VP9",children:"SVT-VP9"})," sections."]})]})}function l(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>c,a:()=>r});var i=t(7294);const n={},s=i.createContext(n);function r(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/871a984d.02dc7d86.js b/assets/js/871a984d.02dc7d86.js deleted file mode 100644 index 8501a337f..000000000 --- a/assets/js/871a984d.02dc7d86.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 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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=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<i;c++)o[c]=r[c];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},7903:(e,t,r)=>{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/87861d43.a352d04c.js b/assets/js/87861d43.a352d04c.js deleted file mode 100644 index e524e42f5..000000000 --- a/assets/js/87861d43.a352d04c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3722],{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<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),c=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=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={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=l(e,["components","mdxType","originalType","parentName"]),d=c(r),m=o,f=d["".concat(s,".").concat(m)]||d[m]||u[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 l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:o,a[1]=l;for(var c=2;c<i;c++)a[c]=r[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},328:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const i={title:"Video Players",sidebar_label:"\u25b6\ufe0f Video Players",sidebar_position:11},a="Video Players",l={unversionedId:"video-players",id:"video-players",title:"Video Players",description:"Many different players exist for video, but here are a few recommended ones:",source:"@site/docs/video-players.md",sourceDirName:".",slug:"/video-players",permalink:"/docs/video-players",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video-players.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"Video Players",sidebar_label:"\u25b6\ufe0f Video Players",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Butteraugli",permalink:"/docs/metrics/butteraugli"},next:{title:"\ud83d\uddc3\ufe0f Resources",permalink:"/docs/resources"}},s={},c=[{value:"MPV",id:"mpv",level:2},{value:"VLC",id:"vlc",level:2},{value:"MPC-HC",id:"mpc-hc",level:2}],p={toc:c},d="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"video-players"},"Video Players"),(0,o.kt)("p",null,"Many different players exist for video, but here are a few recommended ones:"),(0,o.kt)("h2",{id:"mpv"},"MPV"),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"TODO: MPV keyboard shorcuts\n","\xa0","\xa0"),(0,o.kt)("h2",{id:"vlc"},"VLC"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"VLC")," is an open source media player and toolkit. It supports almost all video and audio codecs in common use."),(0,o.kt)("p",null,"Download instructions for VLC on all relevant platforms can be found at ",(0,o.kt)("a",{parentName:"p",href:"https://www.videolan.org/vlc/#download"},"VideoLAN's website"),"\n","\xa0","\xa0"),(0,o.kt)("h2",{id:"mpc-hc"},"MPC-HC"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/89809f85.363353a9.js b/assets/js/89809f85.363353a9.js deleted file mode 100644 index 0db289652..000000000 --- a/assets/js/89809f85.363353a9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9578],{3905:(e,t,i)=>{i.d(t,{Zo:()=>h,kt:()=>u});var o=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,o)}return i}function s(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function r(e,t){if(null==e)return{};var i,o,a=function(e,t){if(null==e)return{};var i,o,a={},n=Object.keys(e);for(o=0;o<n.length;o++)i=n[o],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o<n.length;o++)i=n[o],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var l=o.createContext({}),d=function(e){var t=o.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):s(s({},t),e)),i},h=function(e){var t=d(e.components);return o.createElement(l.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,l=e.parentName,h=r(e,["components","mdxType","originalType","parentName"]),p=d(i),m=a,u=p["".concat(l,".").concat(m)]||p[m]||c[m]||n;return i?o.createElement(u,s(s({ref:t},h),{},{components:i})):o.createElement(u,s({ref:t},h))}));function u(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,s=new Array(n);s[0]=m;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r[p]="string"==typeof e?e:a,s[1]=r;for(var d=2;d<n;d++)s[d]=i[d];return o.createElement.apply(null,s)}return o.createElement.apply(null,i)}m.displayName="MDXCreateElement"},2414:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var o=i(7462),a=(i(7294),i(3905));const n={title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},s=void 0,r={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable.md",title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",formattedDate:"October 29, 2023",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.91,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],frontMatter:{title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},l={authorsImageUrls:[void 0]},d=[{value:"A Scenario",id:"a-scenario",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"The Website's End",id:"the-websites-end",level:3},{value:"Discord's End",id:"discords-end",level:3},{value:"Strengths & Limitations",id:"strengths--limitations",level:2},{value:"Strengths",id:"strengths",level:4},{value:"Limitations",id:"limitations",level:4},{value:"Differences between Sites",id:"differences-between-sites",level:2},{value:"The Lore",id:"the-lore",level:2},{value:"Dwayne",id:"dwayne",level:3},{value:"Discovery",id:"discovery",level:3},{value:"The Experiments & Interactive Site",id:"the-experiments--interactive-site",level:3},{value:"Virality",id:"virality",level:3},{value:"Closing",id:"closing",level:2}],h={toc:d},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,o.Z)({},h,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("admonition",{title:"Copyright Disclosure",type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"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.")),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Feature image",src:i(3093).Z,width:"1920",height:"1080"}),"\n",(0,a.kt)("strong",{parentName:"p"},'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"')),(0,a.kt)("h2",{id:"a-scenario"},"A Scenario"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"stolen.shoes",src:i(8449).Z,width:"1088",height:"318"})),(0,a.kt)("p",null,"The truth is, there are ",(0,a.kt)("em",{parentName:"p"},"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:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://stolen.shoes"},"https://stolen.shoes")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://discord.nfp.is"},"https://discord.nfp.is")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://embeds.video"},"https://embeds.video")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://x266.mov/discord-embed"},"https://x266.mov/discord-embed")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://autocompressor.net/av1"},"https://autocompressor.net/av1"))),(0,a.kt)("p",null,"The big question is, ",(0,a.kt)("strong",{parentName:"p"},"how do they work?")," Let's get to dissecting."),(0,a.kt)("h2",{id:"how-it-works"},"How it Works"),(0,a.kt)("p",null,"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)."),(0,a.kt)("p",null,"The technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end."),(0,a.kt)("h3",{id:"the-websites-end"},"The Website's End"),(0,a.kt)("p",null,"If you view each website's source, you will find this specific line in each one but they may have a different order:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-html"},'<meta property="og:image" content="https://example.com/i/someimageforthumbnail.jpg">\n<meta property="og:type" content="video.other">\n<meta property="og:video:url" content="https://example.com/v/video.mp4">\n<meta property="og:video:width" content="1920">\n<meta property="og:video:height" content="1080">\n')),(0,a.kt)("p",null,"These are the ",(0,a.kt)("inlineCode",{parentName:"p"},"head")," parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the ",(0,a.kt)("inlineCode",{parentName:"p"},"<html>")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"<body>")," tags. Here's an example of a static HTML site serving one specific video:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-html"},'<!DOCTYPE html>\n<html>\n<head>\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <link rel="shortcut icon" type="image/x-icon" href="../favicon.ico"/>\n <title>some embed site\n \n \n \n \n \n\n\n

Hi

\n

Just your friendly neighborhood video embed site

\n \n\n')),(0,a.kt)("br",null),"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).",(0,a.kt)("h3",{id:"discords-end"},"Discord's End"),(0,a.kt)("p",null,'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.'),(0,a.kt)("h2",{id:"strengths--limitations"},"Strengths & Limitations"),(0,a.kt)("p",null,"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."),(0,a.kt)("h4",{id:"strengths"},"Strengths"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"You can embed non-web compatible codecs such as ",(0,a.kt)("a",{parentName:"li",href:"https://wiki.x266.mov/docs/video/HEVC"},"HEVC")," in ",(0,a.kt)("a",{parentName:"li",href:"https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v"},"MP4/MOV"),", but the user must be using a compatible browser. ",(0,a.kt)("a",{parentName:"li",href:"https://thorium.rocks"},"Thorium")," or Safari version 13 or greater will work for HEVC playback."),(0,a.kt)("li",{parentName:"ul"},"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.")),(0,a.kt)("h4",{id:"limitations"},"Limitations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"You can only use ",(0,a.kt)("a",{parentName:"li",href:"https://simple.wikipedia.org/wiki/Hotlinking"},"hotlinks"),", which means direct linking to the video itself ending in the appropriate file extension such as ",(0,a.kt)("inlineCode",{parentName:"li"},".mp4"),". Cloud services like Google Drive or OneDrive will not work for storage."),(0,a.kt)("li",{parentName:"ul"},"You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but ",(0,a.kt)("strong",{parentName:"li"},"only discord.nfp.is can do this"),", as it ",(0,a.kt)("strong",{parentName:"li"},"proxies cdn.discordapp.com")," itself."),(0,a.kt)("li",{parentName:"ul"},"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.")),(0,a.kt)("h2",{id:"differences-between-sites"},"Differences between Sites"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"Here are the sites, each with one noteworthy special benefit:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://stolen.shoes"},"https://stolen.shoes")," - Recognition, as it is the OG."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://discord.nfp.is"},"https://discord.nfp.is")," - You can use Discord CDN as video source."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://embeds.video"},"https://embeds.video")," - Immediately input video source into the URL (",(0,a.kt)("inlineCode",{parentName:"li"},"https://embeds.video/https://example.com/v/video.mp4"),")"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://x266.mov/discord-embed"},"https://x266.mov/discord-embed")," - Attractive domain, simple layout."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://autocompressor.net/av1"},"https://autocompressor.net/av1")," - Lots of info dump, pretty advanced features.")),(0,a.kt)("p",null,"That concludes the technical overview! Next, let's cover the history of this exploit."),(0,a.kt)("h2",{id:"the-lore"},"The Lore"),(0,a.kt)("h3",{id:"dwayne"},"Dwayne"),(0,a.kt)("p",null,"In around April of 2022, a Reddit user going by the name of u/CreativeGamer03 ",(0,a.kt)("a",{parentName:"p",href:"https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh"},"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.'),(0,a.kt)("p",null,"The link used is now unfortunately ",(0,a.kt)("a",{parentName:"p",href:"https://archuser.de/the-rock"},"removed"),"."),(0,a.kt)("h3",{id:"discovery"},"Discovery"),(0,a.kt)("p",null,"On 23rd June 2022, a Discord user ",(0,a.kt)("em",{parentName:"p"},"Clybius")," on the AV1 Community server asked people for ",(0,a.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/docs/video/VP9"},"VP9")," or ",(0,a.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/docs/video/AVC"},"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."),(0,a.kt)("p",null,"He tried shortly afterward with ",(0,a.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/docs/video/AV1"},"AV1"),". Eureka, it also worked:"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"AV1",src:i(2194).Z,width:"497",height:"421"})),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Dwayne",src:i(1828).Z,width:"1108",height:"98"})),(0,a.kt)("h3",{id:"the-experiments--interactive-site"},"The Experiments & Interactive Site"),(0,a.kt)("p",null,"After the discovery of AV1 embedding, experimentation brought about the discovery that ",(0,a.kt)("em",{parentName:"p"},"any")," video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the ",(0,a.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/docs/introduction/terminology#container"},"Containers")," section on the ",(0,a.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/docs/introduction/terminology"},"Terminology")," page."),(0,a.kt)("p",null,"This applies to HEVC, ProRes, ",(0,a.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/docs/audio/AAC#xhe-aac"},"xHE-AAC"),", and other bizarre codecs that are rarely seen on the Web."),(0,a.kt)("p",null,"While experimentating, Clybius converted one their idle domains ",(0,a.kt)("inlineCode",{parentName:"p"},"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."),(0,a.kt)("h3",{id:"virality"},"Virality"),(0,a.kt)("p",null,"It's not long before people outside of the AV1 Community discovered ",(0,a.kt)("inlineCode",{parentName:"p"},"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."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},'The first instance featured the DreamWorks sequel of "Puss in Boots (2011)", "Puss in Boots: The Last Wish (2022)". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used ',(0,a.kt)("inlineCode",{parentName:"li"},"stolen.shoes"),".")),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"puss",src:i(8449).Z,width:"1088",height:"318"})),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},'The second instance was when highly-anticipated animated film "The Super Mario Bros. Movie (2023)" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used ',(0,a.kt)("inlineCode",{parentName:"li"},"stolen.shoes")," as the embed site.")),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"mario",src:i(3643).Z,width:"1307",height:"335"})),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},'The third instance is very recent as of the day this was posted. A streaming-service sourced "Five Nights at Freddy\'s (2023)" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining ',(0,a.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/"},"hundreds of upvotes within the r/discordapp subreddit"),". The copy seems to be a compressed 720p encode. This example used ",(0,a.kt)("inlineCode",{parentName:"li"},"discord.nfp.is"),".")),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"fnaf",src:i(314).Z,width:"1044",height:"409"})),(0,a.kt)("p",null,"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: "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Top Gun Maverick (2022)"),(0,a.kt)("li",{parentName:"ul"},"The SpongeBob trilogy (2005/2015/2020)"),(0,a.kt)("li",{parentName:"ul"},"Spider-Man: Across the Spider-Verse (2023)")),(0,a.kt)("h2",{id:"closing"},"Closing"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"Thank you for reading this blog post, I hope you learned something!"))}c.isMDXComponent=!0},2194:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/clybius-av1-28dcfefe8d58784301332b8119d2e926.webp"},1828:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/clybius-dwayne-15341f187cb8e7dbfd5c4ee00451eabd.webp"},3093:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},314:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/discordnfpis-fnaf-dab5b24a63605605e7c7882d20a992a3.webp"},3643:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/stolenshoes-mario-6de3b4071d4c09064d7323fec40530f4.webp"},8449:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/stolenshoes-puss-842a1f9165b7571d293a74be89da25c2.webp"}}]); \ No newline at end of file diff --git a/assets/js/8a31ca28.f4998259.js b/assets/js/8a31ca28.f4998259.js deleted file mode 100644 index 6197effa2..000000000 --- a/assets/js/8a31ca28.f4998259.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4445],{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 s=a.createContext({}),u=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(r),m=n,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||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]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{r.d(t,{Z:()=>i});var a=r(7294),n=r(6010);const o={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:r,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,n.Z)(o.tabItem,i),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>w});var a=r(7462),n=r(7294),o=r(6010),i=r(2466),l=r(6550),s=r(1980),u=r(7392),c=r(12);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:a,default:n}}=e;return{value:t,label:r,attributes:a,default:n}}))}function d(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const a=(0,l.k6)(),o=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,s._X)(o),(0,n.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function h(e){const{defaultValue:t,queryString:r=!1,groupId:a}=e,o=d(e),[i,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=r.find((e=>e.default))??r[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:r,groupId:a}),[p,h]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(r);return[a,(0,n.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:a}),v=(()=>{const e=s??p;return m({value:e,tabValues:o})?e:null})();(0,n.useLayoutEffect)((()=>{v&&l(v)}),[v]);return{selectedValue:i,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),h(e)}),[u,h,o]),tabValues:o}}var v=r(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:r,selectedValue:l,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,i.o5)(),d=e=>{const t=e.currentTarget,r=c.indexOf(t),a=u[r].value;a!==l&&(p(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":r},t)},u.map((e=>{let{value:t,label:r,attributes:i}=e;return n.createElement("li",(0,a.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},i,{className:(0,o.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),r??t)})))}function y(e){let{lazy:t,children:r,selectedValue:a}=e;const o=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=h(e);return n.createElement("div",{className:(0,o.Z)("tabs-container",b.tabList)},n.createElement(g,(0,a.Z)({},e,t)),n.createElement(y,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return n.createElement(k,(0,a.Z)({key:String(t)},e))}},5468:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var a=r(7462),n=(r(7294),r(3905));r(4866),r(5162);const o={label:"rav1ator-cli",sidebar_position:4,templating:!0},i="rAV1ator CLI",l={unversionedId:"utilities/rav1ator-cli",id:"utilities/rav1ator-cli",title:"rAV1ator CLI",description:"rAV1ator CLI, or just rav1ator-cli, is a TUI tool that provides an interactive command line interface for encoding videos with Av1an using various different encoders including rav1e, aomenc, SVT-AV1, x265, and x264.",source:"@site/docs/utilities/rav1ator-cli.md",sourceDirName:"utilities",slug:"/utilities/rav1ator-cli",permalink:"/docs/utilities/rav1ator-cli",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rav1ator-cli.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"rav1ator-cli",sidebar_position:4,templating:!0},sidebar:"tutorialSidebar",previous:{title:"YUView",permalink:"/docs/utilities/YUView"},next:{title:"NMKODER",permalink:"/docs/utilities/nmkoder"}},s={},u=[{value:"Installation",id:"installation",level:2},{value:"Troubleshooting",id:"troubleshooting",level:3},{value:"Demos",id:"demos",level:2}],c={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"rav1ator-cli"},"rAV1ator CLI"),(0,n.kt)("p",null,"rAV1ator CLI, or just ",(0,n.kt)("inlineCode",{parentName:"p"},"rav1ator-cli"),", is a TUI tool that provides an interactive command line interface for encoding videos with Av1an using various different encoders including ",(0,n.kt)("a",{parentName:"p",href:"/docs/encoders/rav1e"},"rav1e"),", ",(0,n.kt)("a",{parentName:"p",href:"/docs/encoders/aomenc"},"aomenc"),", ",(0,n.kt)("a",{parentName:"p",href:"/docs/encoders/SVT-AV1"},"SVT-AV1"),", ",(0,n.kt)("a",{parentName:"p",href:"/docs/encoders/x265"},"x265"),", and ",(0,n.kt)("a",{parentName:"p",href:"/docs/encoders/x264"},"x264"),"."),(0,n.kt)("p",null,"rAV1ator CLI can:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Check if it is installed & up to date on its own without a package manager")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Download AVX2-optimized encoder binaries compiled with ",(0,n.kt)("inlineCode",{parentName:"p"},"-O3 -flto")," in most cases & allow the user to install them with detailed instructions")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Encode with x264, x265, aomenc, SVT-AV1, or rav1e, set a speed preset, CRF/quality value, FFmpeg parameters, and encoder parameters")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Generate Av1an encoding commands with the user's chosen settings & run them to encode a provided input video to an MKV output")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Encode from scratch, or resume a previous rav1ator-cli encode")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Engage with rich interactivity featuring spinners, prompts, dropdowns, and the like")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Error check downloads by checking SHA256 hashes on the downloaded binaries for security & convenience"))),(0,n.kt)("p",null,"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."),(0,n.kt)("h2",{id:"installation"},"Installation"),(0,n.kt)("p",null,"These instructions are for Arch Linux specifically. Other distros should be very similar, and packages that are Arch-specific will be labelled. If you're on Ubuntu, you should see the relevant section of the ",(0,n.kt)("a",{parentName:"p",href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies"},"AV1 for Dummies")," blog post on this site."),(0,n.kt)("ol",{start:0},(0,n.kt)("li",{parentName:"ol"},"Update your system before doing anything. On Arch:")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"sudo pacman -Syu\n")),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Install ",(0,n.kt)("inlineCode",{parentName:"li"},"yay")," (Arch only) by running the following commands:")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"sudo pacman -S --needed base-devel git\ngit clone https://aur.archlinux.org/yay.git\ncd yay && makepkg -si\n")),(0,n.kt)("ol",{start:2},(0,n.kt)("li",{parentName:"ol"},"Next, you'll want to install all of rav1ator-cli's dependencies. You can do that by running:")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"yay -Sy rust ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n")),(0,n.kt)("ol",{start:3},(0,n.kt)("li",{parentName:"ol"},"Install rav1ator-cli:")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli\nsudo cp rav1ator-cli /usr/local/bin\n")),(0,n.kt)("h3",{id:"troubleshooting"},"Troubleshooting"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"I've not tested if rAV1ator CLI's decision to run ",(0,n.kt)("inlineCode",{parentName:"li"},"ulimit -n 20000"),' right away actually works. If you get the mkvmerge "Open file error" on Linux, just run ',(0,n.kt)("inlineCode",{parentName:"li"},"ulimit -n 20000")," before running rav1ator-cli."),(0,n.kt)("li",{parentName:"ul"},"If your encode features a grey screen flashing occaisonally in the output, create a lossless intermediary of your source with x264 ",(0,n.kt)("inlineCode",{parentName:"li"},"-qp 0"),". This happens because of VC-1 decoding errors."),(0,n.kt)("li",{parentName:"ul"},"If you have any more questions, please join the ",(0,n.kt)("a",{parentName:"li",href:"https://discord.gg/bbQD5MjDr3"},"AV1 for Dummies Discord server"),".")),(0,n.kt)("h2",{id:"demos"},"Demos"),(0,n.kt)("img",{width:"1536",height:"864",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo1.avif",alt:"rAV1ator-cli: Demo 1"}),(0,n.kt)("img",{width:"1536",height:"864",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo2.avif",alt:"rAV1ator-cli: Demo 2"}))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8a894f7b.790513b2.js b/assets/js/8a894f7b.790513b2.js new file mode 100644 index 000000000..a0803758b --- /dev/null +++ b/assets/js/8a894f7b.790513b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5180],{4022:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var o=i(5893),n=i(1151);const s={sidebar_position:4},a="Spotting Video Artifacts",r={id:"introduction/video-artifacts",title:"Spotting Video Artifacts",description:"https://xkcd.com/2414",source:"@site/docs/introduction/video-artifacts.mdx",sourceDirName:"introduction",slug:"/introduction/video-artifacts",permalink:"/docs/introduction/video-artifacts",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/video-artifacts.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Terminology",permalink:"/docs/introduction/terminology"},next:{title:"Psycho-visual",permalink:"/docs/introduction/psychovisual"}},c={},l=[{value:"Moir\xe9 Pattern",id:"moir\xe9-pattern",level:2},{value:"Staircase Effect",id:"staircase-effect",level:2},{value:"Color Bleed",id:"color-bleed",level:2},{value:"Ringing",id:"ringing",level:2},{value:"Blocking",id:"blocking",level:2},{value:"Banding/Contouring",id:"bandingcontouring",level:2},{value:"Mosquito Noise",id:"mosquito-noise",level:2}];function h(e){const t={a:"a",em:"em",h1:"h1",h2:"h2",p:"p",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"spotting-video-artifacts",children:"Spotting Video Artifacts"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/solar_system_compression_artifacts_2x.avif",type:"image/avif"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/solar_system_compression_artifacts_2x.png",alt:"XKCD about compression artifacts",width:"659",height:"540"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.em,{children:(0,o.jsx)(t.a,{href:"https://xkcd.com/2414",children:"https://xkcd.com/2414"})})}),"\n",(0,o.jsx)(t.p,{children:"Video artifacts are visual distortions or anomalies that appear in a video, which can affect the quality of the image. Artifacts are first categorized by whether they\u2019re time/sequence-based (temporal) or location-based (spatial). If you can see the artifact when the video is paused, then it\u2019s probably a spatial artifact. If it\u2019s much more visible while the video plays, then it\u2019s likely temporal."}),"\n",(0,o.jsx)(t.h2,{id:"moir\xe9-pattern",children:"Moir\xe9 Pattern"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/moire-pattern.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/moire-pattern.jpeg",alt:"Moir\xe9 pattern on a brick building",width:"205",height:"250"})]}),"\n",(0,o.jsx)(t.p,{children:"Moir\xe9 patterns are large-scale spatial interference pattern produced when a pattern in the source image and the manner in which the encoder operates are slightly out of alignment spatially. The artifacts generated by the encoder then introduce strange, swirling effects in the source image's pattern upon decoding. and"}),"\n",(0,o.jsx)(t.h2,{id:"staircase-effect",children:"Staircase Effect"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/staircase-effect.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/staircase-effect.jpeg",alt:"Staircase Effect",width:"452",height:"548",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:'The staircase effect is a spatial artifact that occurs when diagonal straight or curved edges that should be smooth take on a jagged appearance, looking somewhat like a set of stair steps. This is the effect that is being reduced by "anti-aliasing" filters.'}),"\n",(0,o.jsx)(t.h2,{id:"color-bleed",children:"Color Bleed"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/color-bleed.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/color-bleed.jpeg",alt:"Color Bleed",width:"624",height:"276",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:"Color bleeding, as its name suggests, occurs when the edges of one color in the image unintentionally bleeds or overlaps into another color. The cause of color bleeding is usually related to the compression algorithm's handling of chrominance information. Chrominance refers to the color information in an image or video, and it's usually compressed separately from the luminance (brightness) information. In some compression algorithms, the chrominance information may be compressed more aggressively than the luminance information, resulting in a loss of color accuracy and detail."}),"\n",(0,o.jsx)(t.p,{children:"\xa0\xa0"}),"\n",(0,o.jsx)(t.h2,{id:"ringing",children:"Ringing"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/ringing-artifact.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/ringing-artifact.jpeg",alt:"Ringing artifact on a star symbol",width:"684",height:"599",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:"Note the blue and pink fringes around the edges of the star above (as well as the stepping and other significant compression artifacts). Those fringes are the ringing effect. It is very similar to mosquito noise which will be talked about down below."}),"\n",(0,o.jsx)(t.h2,{id:"blocking",children:"Blocking"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/blocking_on_cat.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/blocking_on_cat.jpeg",alt:"Blocking artifacts on a cat",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:'To understand this artifact, we first need to know what DCT (Discrete Cosine Transform)-based compression is. It\'s a way of reducing the size of a digital image or video file by analyzing the data in small chunks (called "blocks") and then using mathematical formulas to transform that data into a more compact representation. This transformed data can then be stored or transmitted more efficiently.'}),"\n",(0,o.jsx)(t.p,{children:'However, this compression technique can sometimes lead to visible "distortions" in the compressed image or video. One of the most common types of distortion is the "blocking artifact," which occurs when the edges of the compressed blocks become visible, creating a grid-like pattern over the image or video.'}),"\n",(0,o.jsx)(t.p,{children:"In simpler terms, imagine if you take a picture and then try to compress it to make the file size smaller. The compression algorithm divides the picture into small blocks and tries to simplify the information in each block. But when there's not enough bitrate/data, the algorithm simplifies the information too much, resulting in visible blocks or a grid pattern on the picture. This is what we call the DCT blocking compression artifact."}),"\n",(0,o.jsx)(t.p,{children:"\xa0\xa0"}),"\n",(0,o.jsx)(t.h2,{id:"bandingcontouring",children:"Banding/Contouring"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/colorbanding_ex1.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/colorbanding_ex1.jpeg",alt:"Banding",width:"418",height:"303",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:"Banding or contouring is a specific form of posterization in which the color blocks form bands or stripes in the image. This occurs when the video is encoded with too coarse a quantization (Technique used in video compression that reduces the amount of data needed to store or transmit a video by rounding off certain values in the video's signal) configuration and a lack of available color gradient. As a result, the video's contents show a \"layered\" look, where instead of smooth gradients and transitions, the transitions from color to color are abrupt, causing strips of color to appear."}),"\n",(0,o.jsx)(t.p,{children:"\xa0\xa0"}),"\n",(0,o.jsx)(t.h2,{id:"mosquito-noise",children:"Mosquito Noise"}),"\n",(0,o.jsxs)("picture",{children:[(0,o.jsx)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/mosquito-noise.jxl",type:"image/jxl"}),(0,o.jsx)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/mosquito-noise.jpeg",alt:"Mosquito noise surrounding an iron fence",width:"505",height:"353",loading:"lazy"})]}),"\n",(0,o.jsx)(t.p,{children:"Mosquito noise appears as small, moving, and blocky artifacts around sharp edges or fine details in videos or images. They are mostly found in videos that are compressed using the DCT algorithm we talked about earlier, such as MPEG videos or JPEG images."})]})}function m(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>r,a:()=>a});var o=i(7294);const n={},s=o.createContext(n);function a(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8aacd032.91273c69.js b/assets/js/8aacd032.91273c69.js new file mode 100644 index 000000000..30721701d --- /dev/null +++ b/assets/js/8aacd032.91273c69.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7471],{2872:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var t=i(5893),n=i(1151);const r={label:"AV1",sidebar_position:6},s="AV1",d={id:"video/AV1",title:"AV1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/AV1.mdx",sourceDirName:"video",slug:"/video/AV1",permalink:"/docs/video/AV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AV1.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"AV1",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"VP9",permalink:"/docs/video/VP9"},next:{title:"AVS3",permalink:"/docs/video/AVS3"}},a={},c=[];function l(e){const o={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.h1,{id:"av1",children:"AV1"}),"\n",(0,t.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(o.p,{children:["AV1 is a royalty-free video compression format designed to succeed ",(0,t.jsx)(o.a,{href:"/docs/video/VP9",children:"VP9"}),". It presently competes with ",(0,t.jsx)(o.a,{href:"/docs/video/VP9",children:"VP9"}),", ",(0,t.jsx)(o.a,{href:"/docs/video/VVC",children:"VVC"}),", and ",(0,t.jsx)(o.a,{href:"/docs/video/HEVC",children:"HEVC"}),". AV1 is computationally more complex than VP9, but is fast to decode due to the mature and efficient dav1d AV1 decoder. AV1 hardware accelerated decoding is also available on a variety of different consumer hardware devices, all of which are enumerated ",(0,t.jsx)(o.a,{href:"https://en.wikipedia.org/wiki/AV1#Hardware",children:"on Wikipedia"}),". Standout entries include modern Intel, AMD, & Nvidia integrated & discrete GPUs, Google's Tensor SoC powering the Pixel line, Apple's A17 Pro in the iPhone 15 Pro series, and modern Mediatek & Qualcomm chips. YouTube is currently in the process of transitioning their videos to use AV1."]}),"\n",(0,t.jsxs)(o.p,{children:["There are a number of viable AV1 encoding solutions available today. The three best, most ubiquitous, and free implementations are ",(0,t.jsx)(o.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),", ",(0,t.jsx)(o.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", & ",(0,t.jsx)(o.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),"."]})]})}function u(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},1151:(e,o,i)=>{i.d(o,{Z:()=>d,a:()=>s});var t=i(7294);const n={},r=t.createContext(n);function s(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8bdabb45.49875ba8.js b/assets/js/8bdabb45.49875ba8.js new file mode 100644 index 000000000..2f72167b1 --- /dev/null +++ b/assets/js/8bdabb45.49875ba8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1353],{4458:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var o=n(5893),i=n(1151);const s={label:"AVM",sidebar_position:12},r="AVM",c={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!",source:"@site/docs/encoders/AVM.mdx",sourceDirName:"encoders",slug:"/encoders/AVM",permalink:"/docs/encoders/AVM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/AVM.mdx",tags:[],version:"current",sidebarPosition:12,frontMatter:{label:"AVM",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"VTM",permalink:"/docs/encoders/VTM"},next:{title:"HM",permalink:"/docs/encoders/HM"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"avm",children:"AVM"}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var o=n(7294);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8c5da4da.f184d37b.js b/assets/js/8c5da4da.f184d37b.js deleted file mode 100644 index 4674148e5..000000000 --- a/assets/js/8c5da4da.f184d37b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1923],{3905:(e,t,i)=>{i.d(t,{Zo:()=>p,kt:()=>f});var r=i(7294);function o(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function a(e){for(var t=1;t=0||(o[i]=e[i]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(o[i]=e[i])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),i=t;return e&&(i="function"==typeof e?e(t):a(a({},t),e)),i},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",y={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var i=e.components,o=e.mdxType,n=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(i),m=o,f=u["".concat(s,".").concat(m)]||u[m]||y[m]||n;return i?r.createElement(f,a(a({ref:t},p),{},{components:i})):r.createElement(f,a({ref:t},p))}));function f(e,t){var i=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=i.length,a=new Array(n);a[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,a[1]=l;for(var c=2;c{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>y,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var r=i(7462),o=(i(7294),i(3905));const n={title:"Privacy Policy",sidebar_label:"\ud83d\udd0f Privacy Policy",position:15},a="Privacy Policy",l={unversionedId:"privacy-policy",id:"privacy-policy",title:"Privacy Policy",description:"This site is hosted on GitHub Pages, & usage of this site is subject to GitHub's Privacy Policy. GitHub may store information about your visit in the form of log files.",source:"@site/docs/privacy-policy.md",sourceDirName:".",slug:"/privacy-policy",permalink:"/docs/privacy-policy",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/privacy-policy.md",tags:[],version:"current",frontMatter:{title:"Privacy Policy",sidebar_label:"\ud83d\udd0f Privacy Policy",position:15},sidebar:"tutorialSidebar",previous:{title:"\u2753 FAQ",permalink:"/docs/FAQ"},next:{title:"\ud83e\udd1d Terms of Use",permalink:"/docs/terms-of-use"}},s={},c=[],p={toc:c},u="wrapper";function y(e){let{components:t,...i}=e;return(0,o.kt)(u,(0,r.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"privacy-policy"},"Privacy Policy"),(0,o.kt)("p",null,"This site is hosted on GitHub Pages, & usage of this site is subject to ",(0,o.kt)("a",{parentName:"p",href:"https://docs.github.com/en/site-policy/privacy-policies/github-privacy-statement"},"GitHub's Privacy Policy"),". GitHub may store information about your visit in the form of log files."),(0,o.kt)("p",null,"Furthermore, this site uses a self-hosted instance of ",(0,o.kt)("a",{parentName:"p",href:"https://plausible.io"},"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."),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"We do not employ the use of cookies. The following information is collected:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Page URL"),(0,o.kt)("li",{parentName:"ul"},"HTTP Referer"),(0,o.kt)("li",{parentName:"ul"},"Browser & Browser Version"),(0,o.kt)("li",{parentName:"ul"},"Operating System type & version"),(0,o.kt)("li",{parentName:"ul"},"Device type"),(0,o.kt)("li",{parentName:"ul"},"Country, region, & city")),(0,o.kt)("p",null,"Given this information, we ensure:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Analytics data is not shared explicitly with advertising companies or any other companies in general. It is made available to everyone, for free, on our ",(0,o.kt)("a",{parentName:"li",href:"https://analytics.x266.mov/wiki.x266.mov/"},"analytics page")),(0,o.kt)("li",{parentName:"ul"},"Analytics data isn't explicitly sent to any third parties"),(0,o.kt)("li",{parentName:"ul"},"Analytics data is not monetized")),(0,o.kt)("p",null,"As a wiki dedicated to making multimedia codec knowledge more accessible, analytics information is made public via our ",(0,o.kt)("a",{parentName:"p",href:"https://analytics.x266.mov/wiki.x266.mov/"},"analytics page"),"."),(0,o.kt)("p",null,"You may opt out with various means of ad & tracker blocking. An example would be ",(0,o.kt)("a",{parentName:"p",href:"https://ublockorigin.com/"},"UBlock Origin"),", which blocks our analytics script."),(0,o.kt)("p",null,"If you have any questions, comments or concerns, you may reach out to site maintainer Gianni Rosato via ",(0,o.kt)("a",{parentName:"p",href:"mailto:grosatowork@proton.me"},"grosatowork@proton.me"),"."),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Last updated 12 September 2023")))}y.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8eb2df80.d60f3de5.js b/assets/js/8eb2df80.d60f3de5.js new file mode 100644 index 000000000..6c7516b93 --- /dev/null +++ b/assets/js/8eb2df80.d60f3de5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1730],{3574:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=t(5893),r=t(1151);t(4866),t(5162);const s={label:"rav1ator-cli",sidebar_position:4,templating:!0},a="rAV1ator CLI",o={id:"utilities/rav1ator-cli",title:"rAV1ator CLI",description:"rAV1ator CLI, or just rav1ator-cli, is a TUI tool that provides an interactive command line interface for encoding videos with Av1an using various different encoders including rav1e, aomenc, SVT-AV1, x265, and x264.",source:"@site/docs/utilities/rav1ator-cli.mdx",sourceDirName:"utilities",slug:"/utilities/rav1ator-cli",permalink:"/docs/utilities/rav1ator-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rav1ator-cli.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"rav1ator-cli",sidebar_position:4,templating:!0},sidebar:"tutorialSidebar",previous:{title:"YUView",permalink:"/docs/utilities/YUView"},next:{title:"NMKODER",permalink:"/docs/utilities/nmkoder"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Linux (Arch)",id:"linux-arch",level:3},{value:"macOS",id:"macos",level:3},{value:"Linux (Other)",id:"linux-other",level:3},{value:"Windows",id:"windows",level:3},{value:"Basic installtion",id:"basic-installtion",level:3},{value:"Optional: Cleanup of the Ubuntu Distribution",id:"optional-cleanup-of-the-ubuntu-distribution",level:3},{value:"After the Installation and Cleanup, How Do I Start Arch?",id:"after-the-installation-and-cleanup-how-do-i-start-arch",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3}];function h(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"rav1ator-cli",children:"rAV1ator CLI"}),"\n",(0,i.jsxs)(n.p,{children:["rAV1ator CLI, or just ",(0,i.jsx)(n.code,{children:"rav1ator-cli"}),", is a TUI tool that provides an interactive command line interface for encoding videos with Av1an using various different encoders including ",(0,i.jsx)(n.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),", and ",(0,i.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"rAV1ator CLI can:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check if it is installed & up to date on its own without a package manager"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Download AVX2-optimized encoder binaries compiled with ",(0,i.jsx)(n.code,{children:"-O3 -flto"})," in most cases & allow the user to install them with detailed instructions"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Encode with x264, x265, aomenc, SVT-AV1, or rav1e, set a speed preset, CRF/quality value, FFmpeg parameters, and encoder parameters"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Generate Av1an encoding commands with the user's chosen settings & run them to encode a provided input video to an MKV output"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Encode from scratch, or resume a previous rav1ator-cli encode"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Engage with rich interactivity featuring spinners, prompts, dropdowns, and the like"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Error check downloads by checking SHA256 hashes on the downloaded binaries for security & convenience"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Overall, it aims to provide an easy way to encode videos on the command line with helpful visual feedback. The interactive prompts help users pick encoding settings without needing deep encoding knowledge."}),"\n",(0,i.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo1.avif",alt:"rAV1ator-cli: Demo 1"}),"\n",(0,i.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo2.avif",alt:"rAV1ator-cli: Demo 2"}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.h3,{id:"linux-arch",children:"Linux (Arch)"}),"\n",(0,i.jsxs)(n.p,{children:["These instructions are for Arch Linux specifically. Other distros should be very similar, and packages that are Arch-specific will be labelled. If you're on Ubuntu, you should see the relevant section of the ",(0,i.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site."]}),"\n",(0,i.jsxs)(n.p,{children:["If you're on another distro and you want to be able to follow these instructions specifically, see the ",(0,i.jsx)(n.a,{href:"#linux-other",children:"Linux (Other)"})," section."]}),"\n",(0,i.jsxs)(n.ol,{start:"0",children:["\n",(0,i.jsx)(n.li,{children:"Update your system before doing anything. On Arch:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.code,{children:"yay"})," (Arch only) by running the following commands:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S --needed base-devel git\ngit clone https://aur.archlinux.org/yay.git\ncd yay && makepkg -si\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Next, you'll want to install all of rav1ator-cli's dependencies. You can do that by running:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"yay -Sy rust ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Install rav1ator-cli:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli\nsudo cp rav1ator-cli /usr/local/bin\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You're done! Run ",(0,i.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,i.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,i.jsx)(n.p,{children:"No macOS support is provided at this time. It is definitely technically feasible, and I may produce a separate tool in the future with proper macOS binaries, though this would be a burden to keep up considering I don't currently see any demand for a port."}),"\n",(0,i.jsx)(n.h3,{id:"linux-other",children:"Linux (Other)"}),"\n",(0,i.jsxs)(n.p,{children:["If you're on Ubuntu, you can see the relevant section of the ",(0,i.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site for more information about doing this ",(0,i.jsx)(n.em,{children:"without"})," a distrobox. However, a distrobox is valuable because you can use Arch's fast-paced package management on other distros. Distroboxes are generally easier than Docker for beginners, and use Docker or Podman behind the scenes anyway. This tutorial will focus on using Distrobox with Podman."]}),"\n",(0,i.jsxs)(n.ol,{start:"0",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Install Distrobox and Podman on your distro of choice. Please look up how to do this for your respective distro, and how to get everything set up properly."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you already use Podman, are re-creating a Distrobox, or you already have other Distroboxes running from long enough ago where your Arch image is outdated, you might want to run ",(0,i.jsx)(n.code,{children:"podman image rm docker.io/archlinux/archlinux:latest"}),". It won't hurt to run it anyway if you're not sure. ",(0,i.jsx)(n.strong,{children:"Do this every time you make a new Distrobox if you're experiencing issues with Distrobox creation"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Now, run ",(0,i.jsx)(n.code,{children:"distrobox-create --name rvcli-box --image archlinux:latest"}),". You do not need to name yours \"rvcli-box\", but that's what we're going to call the box in this tutorial."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"distrobox enter rvcli-box"})," to go inside. You are now using Arch Linux from within your existing distro!"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["First, run ",(0,i.jsx)(n.code,{children:"sudo pacman -Syu"})," to update your system."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Next, run ",(0,i.jsx)(n.code,{children:"sudo pacman -S --needed base-devel git && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Finally, ",(0,i.jsx)(n.code,{children:"yay -Sy rust ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2"})," to install the necessary dependencies."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Download rav1ator-cli: ",(0,i.jsx)(n.code,{children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Copy rav1ator-cli to your /usr/local/bin: ",(0,i.jsx)(n.code,{children:"sudo cp rav1ator-cli /usr/local/bin"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you'd like to exit the distrobox, just do ",(0,i.jsx)(n.code,{children:"Ctrl"})," + ",(0,i.jsx)(n.code,{children:"D"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You're done! Run ",(0,i.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,i.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,i.jsx)(n.admonition,{title:"Windows",type:"note",children:(0,i.jsxs)(n.p,{children:["The content in this entry was written by pat-e, or ",(0,i.jsx)(n.code,{children:"pate"})," on Discord. They have provided an ",(0,i.jsx)(n.a,{href:"https://www.pat-e.net/wsl/181796892.html",children:"in-depth tutorial"})," on setting up rav1ator-cli on Windows Server 2022 via WSL if you are interested, but this tutorial that they wrote focuses on Windows 11 via WSL. I thank them for their generous support of the project!"]})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:'Enable WSL2 on Windows 11 and Install "ArchWSL2"'})}),"\n",(0,i.jsx)(n.h3,{id:"basic-installtion",children:"Basic installtion"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Open the Terminal as Administrator:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/01_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"In the Command-Prompt, enter the following to install WSL and (temporary) Ubuntu:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl.exe --install\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/02_wsl_rv-cli.avifg",alt:""})}),"\n",(0,i.jsxs)(n.p,{children:['If the "Host Process for Windows Services" asks for allowing changes, approve it (Press "Yes"):',(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/03_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Once the installation of WSL (and Ubuntu as Default) is finished, restart your Computer:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"shutdown -r -f -t 1\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/04_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Once restarted and logged in, WSL will start with Ubuntu and ask for Username and password. Enter whatever you want as this distribution will be removed after the switch to ArchWSL2. Just exit after the Ubuntu is setup:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/05_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["From ",(0,i.jsx)(n.a,{href:"https://github.com/sileshn/ArchWSL2",children:"This GitHub link"}),", download the latest release of ArchWSL2 in the Releases section:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/06_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["On your SSD, create a folder where we will place the ArchWSL2 files. This folder ",(0,i.jsx)(n.strong,{children:"must be kept and never deleted"})," as this will contain the base files for this distribution. It is advised to use an SSD instead of an HDD. The storage must be local storage, not a network-share or a removable disk. In our example, we will create a folder located at C:\\Stuff\\ArchWSL2;",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/07_wsl_rv-cli.avif",alt:""})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/08_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Extract the downloaded ZIP of "ArchWSL2" into your newly created folder:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/09_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Once extracted, start the extracted "Arch.exe":'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/10_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'On first start, the program will create a virtual disk (VHDx). Once finished, press "Enter" to continue (it will close the window)'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/11_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:['Once the virtual hard disk is created, restart the "arch.exe" again. It will finish some steps and ask for creating a new user-account. ',(0,i.jsx)(n.strong,{children:"This account is completely separate from your Windows user."})," Please remember the username and password you use."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/12_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/13_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"11",children:["\n",(0,i.jsx)(n.li,{children:"The Window will close and reopen again. As fist step, update all packages. As your account you created earlier is in the sudo-group, you have to enter your password again as confirmation."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/14_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"12",children:["\n",(0,i.jsx)(n.li,{children:'Approve the installation of all the updates (Type "y"):'}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/15_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"13",children:["\n",(0,i.jsx)(n.li,{children:"Done... You can now use ArchWSL2."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"optional-cleanup-of-the-ubuntu-distribution",children:"Optional: Cleanup of the Ubuntu Distribution"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Open the terminal as Administrator, like we did earlier."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/16_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the current installed distributions:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --list\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/17_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'To remove "Ubuntu" (and therefor make Arch as default), enter the following command:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --unregister ubuntu\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/18_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'After the removal of Ubuntu, we can list the distributions again and verify that "Arch" is now the default:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/19_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"after-the-installation-and-cleanup-how-do-i-start-arch",children:"After the Installation and Cleanup, How Do I Start Arch?"}),"\n",(0,i.jsx)(n.p,{children:"For the start of Arch, there are 2 steps possible:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'You can just start "wsl" form the command prompt, terminal or "Windows Search":'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/20_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/21_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'As another option, you can create a Shortcut to the "arch.exe" in the Installation-Folder:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/22_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/23_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/24_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Hint"}),': When you open the "arch.exe", you will be placed into the directory where also the "arch.exe" is located. To change to your home directory, just enter the command below:']}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/25_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Hint"}),": WSL caps RAM usage at 50% of the total RAM available on your system."]}),"\n",(0,i.jsx)(n.p,{children:"When you start the VM, you will see that you only will only have 50% of your total memory available:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/26_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:"To allow more memory, you need to place a config-file in your profile-folder in Windows. See the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Open "notepad.exe" and enter the following:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",children:"[wsl2]\nmemory=12GB\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/27_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"The amount of memory should never be more than current memory. Set it to total memory minus 4GB to leave enough left over for Windows. In my example, Windows has 16GB of RAM available, so I select the memory to be 12GB."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When saving the file, enter the following as filename:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"%userprofile%"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/28_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When pressing enter, the directory will switch to your user-profile folder:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/29_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Select the "Save as type" to "All files (*.*)" and save as the following filename:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:".wslconfig"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/30_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.p,{children:["Make sure the file is saved as ",(0,i.jsx)(n.code,{children:".wslconfig"}),". Then exit notepad."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Exit any current running WSL / Arch (exit):"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/31_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Open the Terminal as Administrator and "shutdown" any running WSL:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --shutdown\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/32_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Restart WSL again and check the memory settings from within Arch by running the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"free -h\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/33_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you've made it this far, you should be more than ready to encode. We hope you enjoy rAV1ator CLI!"}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["If your encode features a grey screen flashing occaisonally in the output, create a lossless intermediary of your source with x264 ",(0,i.jsx)(n.code,{children:"-qp 0"}),". This happens because of VC-1 decoding errors, and is not something I can fix."]}),"\n",(0,i.jsxs)(n.li,{children:["If you have any more questions, please join the ",(0,i.jsx)(n.a,{href:"https://discord.gg/bbQD5MjDr3",children:"AV1 for Dummies Discord server"}),". There is a rAV1ator CLI channel over there, and I am always happy to talk!"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>a});t(7294);var i=t(6010);const r={tabItem:"tabItem_Ymn6"};var s=t(5893);function a(e){let{children:n,hidden:t,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,i.Z)(r.tabItem,a),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>y});var i=t(7294),r=t(6010),s=t(2466),a=t(6550),o=t(469),l=t(1980),c=t(7392),h=t(12);function u(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function d(e){const{values:n,children:t}=e;return(0,i.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:i,default:r}}=e;return{value:n,label:t,attributes:i,default:r}}))}(t);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const r=(0,a.k6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l._X)(s),(0,i.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})}),[s,r])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=d(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=t.find((e=>e.default))??t[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:s}))),[c,u]=p({queryString:t,groupId:r}),[x,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,s]=(0,h.Nk)(t);return[r,(0,i.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:r}),j=(()=>{const e=c??x;return m({value:e,tabValues:s})?e:null})();(0,o.Z)((()=>{j&&l(j)}),[j]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=t(2389);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(5893);function f(e){let{className:n,block:t,selectedValue:i,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.o5)(),h=e=>{const n=e.currentTarget,t=l.indexOf(n),r=o[t].value;r!==i&&(c(n),a(r))},u=e=>{let n=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:i===n?0:-1,"aria-selected":i===n,ref:e=>l.push(e),onKeyDown:u,onClick:h,...s,className:(0,r.Z)("tabs__item",j.tabItem,s?.className,{"tabs__item--active":i===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:r}=e;const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===r));return e?(0,i.cloneElement)(e,{className:"margin-top--md"}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function w(e){const n=x(e);return(0,v.jsxs)("div",{className:(0,r.Z)("tabs-container",j.tabList),children:[(0,v.jsx)(f,{...e,...n}),(0,v.jsx)(b,{...e,...n})]})}function y(e){const n=(0,g.Z)();return(0,v.jsx)(w,{...e,children:u(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>a});var i=t(7294);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9060e84a.6e933a33.js b/assets/js/9060e84a.6e933a33.js new file mode 100644 index 000000000..3fe5c0752 --- /dev/null +++ b/assets/js/9060e84a.6e933a33.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6885],{985:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var t=i(5893),s=i(1151);const o={label:"HM",sidebar_position:13},r="HM",c={id:"encoders/HM",title:"HM",description:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.",source:"@site/docs/encoders/HM.mdx",sourceDirName:"encoders",slug:"/encoders/HM",permalink:"/docs/encoders/HM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/HM.mdx",tags:[],version:"current",sidebarPosition:13,frontMatter:{label:"HM",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"AVM",permalink:"/docs/encoders/AVM"},next:{title:"JM",permalink:"/docs/encoders/JM"}},a={},d=[{value:"Building",id:"building",level:2},{value:"Usage",id:"usage",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"hm",children:"HM"}),"\n",(0,t.jsx)(n.admonition,{title:"Pending Review",type:"caution",children:(0,t.jsx)(n.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,t.jsxs)(n.p,{children:["HM is the original ",(0,t.jsx)(n.a,{href:"/docs/video/HEVC",children:"H.265"})," reference encoder, predating alternatives like ",(0,t.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),". In the modern day, it joins other MPEG reference encoders such as ",(0,t.jsx)(n.a,{href:"/docs/encoders/JM",children:"JM"})," & ",(0,t.jsx)(n.a,{href:"/docs/encoders/VTM",children:"VTM"})," in their reputations for being highly niche offerings that are used rarely due to their usage complexity & speed disadvantages. x264 is more efficient than JM."]}),"\n",(0,t.jsxs)(n.p,{children:["HM is capable of producing higher quality streams than highly tuned x265, even at excruciatingly slow speeds. This is only a theoretical advantage, though, as HM is incapable of placing keyframes automatically with scene detection & would need a chunking too reminiscent of ",(0,t.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," to do this. For videos containing few enough frames where keyframe placement isn't a concern, HM is better in practice than x265 at the expense of a massive dropoff in speed. HM doesn't have any threading capabilities & is much slower than even x265 placebo."]}),"\n",(0,t.jsx)(n.h2,{id:"building",children:"Building"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://vcgit.hhi.fraunhofer.de/jvet/HM\ncd HM/\nmkdir build && cd build\ncmake .. -DCMAKE_BUILD_TYPE=Release\nmake -j$(nproc)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The binary ",(0,t.jsx)(n.code,{children:"TAppEncoderStatic"})," or ",(0,t.jsx)(n.code,{children:"TAppEncoder"})," can be found within the cloned directories, & can be copied to ",(0,t.jsx)(n.code,{children:"/usr/local/bin"})," for encoding. Decoding & other functions of the reference codec implementation aren't covered in this entry."]}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsxs)(n.p,{children:["Here is a sample command: ",(0,t.jsx)(n.code,{children:"TAppEncoderStatic -i input.yuv -b out.265 -c ~/HM/cfg/encoder_randomaccess_main10.cfg -wdt 1280 -hgt 720 -fr 50 -f 500 -q 27 -xPS 0"})]}),"\n",(0,t.jsx)(n.p,{children:"Make sure only to use only YUV input when encoding with HM. Each parameter does the following:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-i input.yuv -b out.265"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Specifies a raw YUV input file & an output raw h265 bitstream. To mux into an MP4 container, it is recommended that you use ",(0,t.jsx)(n.a,{href:"/docs/utilities/mp4box",children:"mp4box"})," instead of muxing with ",(0,t.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-c [path/to/config]"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Specifies the desired path to your HM configuration file. This makes it easier to encode without having to manually specify a plethora of settings."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-wdt 1280 -hgt 720"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Sets the input & output width & height."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-fr 50 -f 500"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Sets the framerate (FPS) & the number of frames to encode. In this case, we are encoding 500 frames of a video that is to be played back at 50fps."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-q 27"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Sets a quality target for the encoder."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"-xPS 0"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Zero clue what this does. If someone has an idea, please contribute!"})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>c,a:()=>r});var t=i(7294);const s={},o=t.createContext(s);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/90aedb84.147adbcf.js b/assets/js/90aedb84.147adbcf.js new file mode 100644 index 000000000..42a300a80 --- /dev/null +++ b/assets/js/90aedb84.147adbcf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6827],{8567:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>h});var i=n(5893),o=n(1151);const s={sidebar_position:5},r="Psycho-visual",c={id:"introduction/psychovisual",title:"Psycho-visual",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/introduction/psychovisual.mdx",sourceDirName:"introduction",slug:"/introduction/psychovisual",permalink:"/docs/introduction/psychovisual",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/psychovisual.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Spotting Video Artifacts",permalink:"/docs/introduction/video-artifacts"},next:{title:"High Dynamic Range",permalink:"/docs/introduction/high-dynamic-range"}},a={},h=[{value:"In English",id:"in-english",level:2}];function l(e){const t={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"psycho-visual",children:"Psycho-visual"}),"\n",(0,i.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsx)(t.admonition,{title:"Pending Review",type:"danger",children:(0,i.jsx)(t.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,i.jsxs)(t.p,{children:['"',(0,i.jsx)(t.em,{children:"Traditionally, the encoder tends to favor blurred reconstructed blocks over blocks which have wrong motion. The human eye generally prefers the wrong motion over the blur. Psycho-visual options combat this. While technically less \u201ccorrect\u201d, which is why they are disabled for research purposes, they should be enabled for content intended for \u201chuman eyes\u201d."}),' "']}),"\n",(0,i.jsxs)(t.p,{children:["-- Kokomins' x265 ",(0,i.jsx)(t.a,{href:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac",children:"guide"})]}),"\n",(0,i.jsx)(t.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(t.h2,{id:"in-english",children:"In English"}),"\n",(0,i.jsx)(t.p,{children:'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.'}),"\n",(0,i.jsx)(t.p,{children:"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."})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var i=n(7294);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/915a111c.95754850.js b/assets/js/915a111c.95754850.js new file mode 100644 index 000000000..11a7efac8 --- /dev/null +++ b/assets/js/915a111c.95754850.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1360],{797:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var n=i(5893),o=i(1151);const r={title:"Dehalo",sidebar_position:6},s="Dehalo",a={id:"filtering/dehalo",title:"Dehalo",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/dehalo.mdx",sourceDirName:"filtering",slug:"/filtering/dehalo",permalink:"/docs/filtering/dehalo",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/dehalo.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Dehalo",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Detelecine / Inverse Telecine",permalink:"/docs/filtering/detelecine"},next:{title:"Aviator",permalink:"/docs/utilities/Aviator"}},c={},l=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"dehalo",children:"Dehalo"}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>s});var n=i(7294);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/91a1632f.579f792c.js b/assets/js/91a1632f.579f792c.js deleted file mode 100644 index d7c3167c9..000000000 --- a/assets/js/91a1632f.579f792c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6896],{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 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({}),c=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=c(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)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(r),b=o,m=p["".concat(s,".").concat(b)]||p[b]||d[b]||i;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));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]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:o,a[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const i={title:"WebVTT"},a="WebVTT",l={unversionedId:"subtitles/webvtt",id:"subtitles/webvtt",title:"WebVTT",description:"WebVTT, or Web Video Text Tracks, is the format for subtitles on the web. It is used with the HTML \\ element, or embedded into a webm container.",source:"@site/docs/subtitles/webvtt.md",sourceDirName:"subtitles",slug:"/subtitles/webvtt",permalink:"/docs/subtitles/webvtt",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/subtitles/webvtt.md",tags:[],version:"current",frontMatter:{title:"WebVTT"},sidebar:"tutorialSidebar",previous:{title:"SRT",permalink:"/docs/subtitles/SRT"},next:{title:"Intro",permalink:"/docs/filtering/intro"}},s={},c=[{value:"Structure",id:"structure",level:2},{value:"Cue",id:"cue",level:3},{value:"Example",id:"example",level:2}],u={toc:c},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:"webvtt"},"WebVTT"),(0,o.kt)("p",null,"WebVTT, or Web Video Text Tracks, is the format for subtitles on the web. It is used with the ",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track"},"HTML \\"," element"),", or embedded into a webm container."),(0,o.kt)("h2",{id:"structure"},"Structure"),(0,o.kt)("p",null,"WebVTT is a simple, text-based format, based on SRT. All files start with the string\n",(0,o.kt)("inlineCode",{parentName:"p"},"WEBVTT"),", optionally, some text, then two new lines. That's where the\ndata we're interested in starts."),(0,o.kt)("h3",{id:"cue"},"Cue"),(0,o.kt)("p",null,"A WebVTT file is basically a bunch of cues. They can have a line with\nan ID, then they have to have a line specifying from where to where\nthe cue should be displayed like this: ",(0,o.kt)("inlineCode",{parentName:"p"},"STARTTIME -> ENDTIME [optional\nsettings go here]"),", then all the text to be displayed goes after\nit. That text can have some HTML-like formatting in it. To learn about\nthem, see ",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Web/API/WebVTT_API#webvtt_cues"},"the documentation"),"."),(0,o.kt)("h2",{id:"example"},"Example"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"WEBVTT\n\n00:01.000 --\x3e 00:04.000\n- Never drink liquid nitrogen.\n\n00:05.000 --\x3e 00:09.000\n- It will perforate your stomach.\n- You could die.\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/92404733.962d60e5.js b/assets/js/92404733.962d60e5.js deleted file mode 100644 index aaecae8da..000000000 --- a/assets/js/92404733.962d60e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8971],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>d});var i=n(7294);function r(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 a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=i.createContext({}),m=function(e){var t=i.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},l=function(e){var t=m(e.components);return i.createElement(u.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),c=m(n),g=r,d=c["".concat(u,".").concat(g)]||c[g]||p[g]||o;return n?i.createElement(d,a(a({ref:t},l),{},{components:n})):i.createElement(d,a({ref:t},l))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=g;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[c]="string"==typeof e?e:r,a[1]=s;for(var m=2;m{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>m});var i=n(7462),r=(n(7294),n(3905));const o={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},a=void 0,s={permalink:"/blog/av1-encoding-for-dummies",source:"@site/blog/2023-09-03-av1-for-dummies.md",title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",date:"2023-09-03T00:00:00.000Z",formattedDate:"September 3, 2023",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:15.145,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},prevItem:{title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",permalink:"/blog/embedding-the-un-embeddable"},nextItem:{title:"Site Optimization by Reducing Image Load on the Web",permalink:"/blog/site-optimization"}},u={authorsImageUrls:[void 0,void 0]},m=[],l={toc:m},c="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,i.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"This guide will show you how to encode in AV1 the ",(0,r.kt)("em",{parentName:"p"},"right")," and ",(0,r.kt)("em",{parentName:"p"},"optimal")," way. Yes, you using standalone ",(0,r.kt)("inlineCode",{parentName:"p"},"libaom"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"libsvtav1"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"librav1e")," from FFmpeg or even piping ",(0,r.kt)("inlineCode",{parentName:"p"},"yuv4mpeg")," into ",(0,r.kt)("strong",{parentName:"p"},"mainline")," aomenc are all unoptimal."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.44ec4c5e.js b/assets/js/935f2afb.44ec4c5e.js deleted file mode 100644 index 00d3c87a5..000000000 --- a/assets/js/935f2afb.44ec4c5e.js +++ /dev/null @@ -1 +0,0 @@ -"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","unlisted":false},{"type":"link","label":"Terminology","href":"/docs/introduction/terminology","docId":"introduction/terminology","unlisted":false},{"type":"link","label":"Spotting Video Artifacts","href":"/docs/introduction/video-artifacts","docId":"introduction/video-artifacts","unlisted":false},{"type":"link","label":"Psycho-visual","href":"/docs/introduction/psychovisual","docId":"introduction/psychovisual","unlisted":false},{"type":"link","label":"High Dynamic Range","href":"/docs/introduction/high-dynamic-range","docId":"introduction/high-dynamic-range","unlisted":false}]},{"type":"category","label":"\ud83d\udd0a Audio","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AAC","href":"/docs/audio/AAC","docId":"audio/AAC","unlisted":false},{"type":"link","label":"Opus","href":"/docs/audio/Opus","docId":"audio/Opus","unlisted":false},{"type":"link","label":"Dolby Digital","href":"/docs/audio/Dolby","docId":"audio/Dolby","unlisted":false},{"type":"link","label":"MP3","href":"/docs/audio/MP3","docId":"audio/MP3","unlisted":false},{"type":"link","label":"Vorbis","href":"/docs/audio/Vorbis","docId":"audio/Vorbis","unlisted":false},{"type":"link","label":"Speex","href":"/docs/audio/Speex","docId":"audio/Speex","unlisted":false},{"type":"link","label":"FLAC","href":"/docs/audio/FLAC","docId":"audio/FLAC","unlisted":false},{"type":"link","label":"WavPack","href":"/docs/audio/WavPack","docId":"audio/WavPack","unlisted":false}]},{"type":"category","label":"\ud83d\udcf9\ufe0f Video","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"H.264","href":"/docs/video/AVC","docId":"video/AVC","unlisted":false},{"type":"link","label":"H.265","href":"/docs/video/HEVC","docId":"video/HEVC","unlisted":false},{"type":"link","label":"H.266","href":"/docs/video/VVC","docId":"video/VVC","unlisted":false},{"type":"link","label":"VP8","href":"/docs/video/VP8","docId":"video/VP8","unlisted":false},{"type":"link","label":"VP9","href":"/docs/video/VP9","docId":"video/VP9","unlisted":false},{"type":"link","label":"AV1","href":"/docs/video/AV1","docId":"video/AV1","unlisted":false},{"type":"link","label":"AVS3","href":"/docs/video/AVS3","docId":"video/AVS3","unlisted":false},{"type":"link","label":"VC-1","href":"/docs/video/VC-1","docId":"video/VC-1","unlisted":false},{"type":"link","label":"Theora","href":"/docs/video/Theora","docId":"video/Theora","unlisted":false},{"type":"link","label":"FFV1","href":"/docs/video/FFV1","docId":"video/FFV1","unlisted":false},{"type":"link","label":"UT Video Codec Suite","href":"/docs/video/utvideo","docId":"video/utvideo","unlisted":false},{"type":"link","label":"ProRes","href":"/docs/video/prores","docId":"video/prores","unlisted":false}]},{"type":"category","label":"\ud83d\udcbd Data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ZIP","href":"/docs/data/zip","docId":"data/zip","unlisted":false},{"type":"link","label":"gzip","href":"/docs/data/gzip","docId":"data/gzip","unlisted":false},{"type":"link","label":"bzip2","href":"/docs/data/bzip2","docId":"data/bzip2","unlisted":false},{"type":"link","label":"7-zip (7z)","href":"/docs/data/7z","docId":"data/7z","unlisted":false},{"type":"link","label":"XZ","href":"/docs/data/xz","docId":"data/xz","unlisted":false},{"type":"link","label":"Brotli","href":"/docs/data/brotli","docId":"data/brotli","unlisted":false},{"type":"link","label":"ZPAQ","href":"/docs/data/zpaq","docId":"data/zpaq","unlisted":false},{"type":"link","label":"Zstandard","href":"/docs/data/zstd","docId":"data/zstd","unlisted":false}]},{"type":"category","label":"\ud83c\udfde\ufe0f Images","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JPEG","href":"/docs/images/JPEG","docId":"images/JPEG","unlisted":false},{"type":"link","label":"PNG","href":"/docs/images/PNG","docId":"images/PNG","unlisted":false},{"type":"link","label":"GIF","href":"/docs/images/GIF","docId":"images/GIF","unlisted":false},{"type":"link","label":"HEIC","href":"/docs/images/HEIC","docId":"images/HEIC","unlisted":false},{"type":"link","label":"WebP","href":"/docs/images/WebP","docId":"images/WebP","unlisted":false},{"type":"link","label":"JPEG 2000","href":"/docs/images/JPEG2000","docId":"images/JPEG2000","unlisted":false},{"type":"link","label":"AVIF","href":"/docs/images/AVIF","docId":"images/AVIF","unlisted":false},{"type":"link","label":"JPEG-XL","href":"/docs/images/JXL","docId":"images/JXL","unlisted":false}]},{"type":"category","label":"\ud83d\udcbe Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"x264","href":"/docs/encoders/x264","docId":"encoders/x264","unlisted":false},{"type":"link","label":"x265","href":"/docs/encoders/x265","docId":"encoders/x265","unlisted":false},{"type":"link","label":"aomenc","href":"/docs/encoders/aomenc","docId":"encoders/aomenc","unlisted":false},{"type":"link","label":"vpxenc","href":"/docs/encoders/vpxenc","docId":"encoders/vpxenc","unlisted":false},{"type":"link","label":"SVT-AV1","href":"/docs/encoders/SVT-AV1","docId":"encoders/SVT-AV1","unlisted":false},{"type":"link","label":"rav1e","href":"/docs/encoders/rav1e","docId":"encoders/rav1e","unlisted":false},{"type":"link","label":"Aurora1 AV1","href":"/docs/encoders/Aurora1","docId":"encoders/Aurora1","unlisted":false},{"type":"link","label":"Kvazaar","href":"/docs/encoders/Kvazaar","docId":"encoders/Kvazaar","unlisted":false},{"type":"link","label":"SVT-HEVC","href":"/docs/encoders/SVT-HEVC","docId":"encoders/SVT-HEVC","unlisted":false},{"type":"link","label":"SVT-VP9","href":"/docs/encoders/SVT-VP9","docId":"encoders/SVT-VP9","unlisted":false},{"type":"link","label":"VVenC","href":"/docs/encoders/VVenC","docId":"encoders/VVenC","unlisted":false},{"type":"link","label":"uvg266","href":"/docs/encoders/uvg266","docId":"encoders/uvg266","unlisted":false},{"type":"link","label":"VTM","href":"/docs/encoders/VTM","docId":"encoders/VTM","unlisted":false},{"type":"link","label":"AVM","href":"/docs/encoders/AVM","docId":"encoders/AVM","unlisted":false},{"type":"link","label":"HM","href":"/docs/encoders/HM","docId":"encoders/HM","unlisted":false},{"type":"link","label":"JM","href":"/docs/encoders/JM","docId":"encoders/JM","unlisted":false}]},{"type":"category","label":"\ud83d\udcac Subtitles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"SRT","href":"/docs/subtitles/SRT","docId":"subtitles/SRT","unlisted":false},{"type":"link","label":"WebVTT","href":"/docs/subtitles/webvtt","docId":"subtitles/webvtt","unlisted":false}]},{"type":"category","label":"\ud83c\udf9e\ufe0f Filtering","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/filtering/intro","docId":"filtering/intro","unlisted":false},{"type":"link","label":"Deband","href":"/docs/filtering/deband","docId":"filtering/deband","unlisted":false},{"type":"link","label":"Vapoursynth","href":"/docs/filtering/vapoursynth","docId":"filtering/vapoursynth","unlisted":false},{"type":"link","label":"Deinterlace","href":"/docs/filtering/deinterlace","docId":"filtering/deinterlace","unlisted":false},{"type":"link","label":"Denoise","href":"/docs/filtering/denoise","docId":"filtering/denoise","unlisted":false},{"type":"link","label":"Detelecine / Inverse Telecine","href":"/docs/filtering/detelecine","docId":"filtering/detelecine","unlisted":false},{"type":"link","label":"Dehalo","href":"/docs/filtering/dehalo","docId":"filtering/dehalo","unlisted":false}]},{"type":"category","label":"\ud83d\udee0\ufe0f Utilities","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aviator","href":"/docs/utilities/Aviator","docId":"utilities/Aviator","unlisted":false},{"type":"link","label":"Av1an","href":"/docs/utilities/av1an","docId":"utilities/av1an","unlisted":false},{"type":"link","label":"MKVToolNix","href":"/docs/utilities/MKVToolNix","docId":"utilities/MKVToolNix","unlisted":false},{"type":"link","label":"rAV1ator","href":"/docs/utilities/rAV1ator","docId":"utilities/rAV1ator","unlisted":false},{"type":"link","label":"FFMetrics","href":"/docs/utilities/FFMetrics","docId":"utilities/FFMetrics","unlisted":false},{"type":"link","label":"YUView","href":"/docs/utilities/YUView","docId":"utilities/YUView","unlisted":false},{"type":"link","label":"rAV1ator CLI","href":"/docs/utilities/rav1ator-cli","docId":"utilities/rav1ator-cli","unlisted":false},{"type":"link","label":"NMKODER","href":"/docs/utilities/nmkoder","docId":"utilities/nmkoder","unlisted":false},{"type":"link","label":"dovi_tool","href":"/docs/utilities/dovi_tool","docId":"utilities/dovi_tool","unlisted":false},{"type":"link","label":"mp4box","href":"/docs/utilities/mp4box","docId":"utilities/mp4box","unlisted":false},{"type":"link","label":"hdr10plus_tool","href":"/docs/utilities/hdr10plus_tool","docId":"utilities/hdr10plus_tool","unlisted":false},{"type":"link","label":"eac3to","href":"/docs/utilities/eac3to","docId":"utilities/eac3to","unlisted":false},{"type":"link","label":"FFmpeg","href":"/docs/utilities/ffmpeg","docId":"utilities/ffmpeg","unlisted":false}]},{"type":"category","label":"\ud83d\udc41\ufe0f Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PSNR","href":"/docs/metrics/PSNR","docId":"metrics/PSNR","unlisted":false},{"type":"link","label":"SSIM","href":"/docs/metrics/SSIM","docId":"metrics/SSIM","unlisted":false},{"type":"link","label":"SSIMULACRA2","href":"/docs/metrics/SSIMULACRA2","docId":"metrics/SSIMULACRA2","unlisted":false},{"type":"link","label":"VMAF","href":"/docs/metrics/VMAF","docId":"metrics/VMAF","unlisted":false},{"type":"link","label":"Butteraugli","href":"/docs/metrics/butteraugli","docId":"metrics/butteraugli","unlisted":false}]},{"type":"link","label":"\u25b6\ufe0f Video Players","href":"/docs/video-players","docId":"video-players","unlisted":false},{"type":"link","label":"\ud83d\uddc3\ufe0f Resources","href":"/docs/resources","docId":"resources","unlisted":false},{"type":"link","label":"\u2712\ufe0f Contribution Guide","href":"/docs/contribution-guide","docId":"contribution-guide","unlisted":false},{"type":"link","label":"\u2753 FAQ","href":"/docs/FAQ","docId":"FAQ","unlisted":false},{"type":"link","label":"\ud83d\udd0f Privacy Policy","href":"/docs/privacy-policy","docId":"privacy-policy","unlisted":false},{"type":"link","label":"\ud83e\udd1d Terms of Use","href":"/docs/terms-of-use","docId":"terms-of-use","unlisted":false}]},"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":"{a.d(t,{Z:()=>f});var s=a(7294),n=a(6010),r=a(179),i=a(7524),l=a(9960),o=a(5999),c=a(6550),m=a(8596);function d(e){const{pathname:t}=(0,c.TH)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,m.Mg)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var h=a(5893);function g(e){let{sidebar:t}=e;const a=d(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,n.Z)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,h.jsx)("div",{className:(0,n.Z)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,n.Z)(u.sidebarItemList,"clean-list"),children:a.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(l.Z,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var p=a(3102);function x(e){let{sidebar:t}=e;const a=d(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:a.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(l.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function j(e){return(0,h.jsx)(p.Zo,{component:x,props:e})}function b(e){let{sidebar:t}=e;const a=(0,i.i)();return t?.items.length?"mobile"===a?(0,h.jsx)(j,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function f(e){const{sidebar:t,toc:a,children:s,...i}=e,l=t&&t.items.length>0;return(0,h.jsx)(r.Z,{...i,children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsxs)("div",{className:"row",children:[(0,h.jsx)(b,{sidebar:t}),(0,h.jsx)("main",{className:(0,n.Z)("col",{"col--7":l,"col--9 col--offset-1":!l}),itemScope:!0,itemType:"https://schema.org/Blog",children:s}),a&&(0,h.jsx)("div",{className:"col col--2",children:a})]})})})}},390:(e,t,a)=>{a.d(t,{Z:()=>y});a(7294);var s=a(6010),n=a(9460),r=a(4996),i=a(5893);function l(e){let{children:t,className:a}=e;const{frontMatter:s,assets:l,metadata:{description:o}}=(0,n.C)(),{withBaseUrl:c}=(0,r.C)(),m=l.image??s.image,d=s.keywords??[];return(0,i.jsxs)("article",{className:a,itemProp:"blogPost",itemScope:!0,itemType:"https://schema.org/BlogPosting",children:[o&&(0,i.jsx)("meta",{itemProp:"description",content:o}),m&&(0,i.jsx)("link",{itemProp:"image",href:c(m,{absolute:!0})}),d.length>0&&(0,i.jsx)("meta",{itemProp:"keywords",content:d.join(",")}),t]})}var o=a(9960);const c={title:"title_f1Hy"};function m(e){let{className:t}=e;const{metadata:a,isBlogPostPage:r}=(0,n.C)(),{permalink:l,title:m}=a,d=r?"h1":"h2";return(0,i.jsx)(d,{className:(0,s.Z)(c.title,t),itemProp:"headline",children:r?m:(0,i.jsx)(o.Z,{itemProp:"url",to:l,children:m})})}var d=a(5999),u=a(8824);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,u.c)();return t=>{const a=Math.ceil(t);return e(a,(0,d.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,i.jsx)(i.Fragment,{children:a(t)})}function p(e){let{date:t,formattedDate:a}=e;return(0,i.jsx)("time",{dateTime:t,itemProp:"datePublished",children:a})}function x(){return(0,i.jsx)(i.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:a}=(0,n.C)(),{date:r,formattedDate:l,readingTime:o}=a;return(0,i.jsxs)("div",{className:(0,s.Z)(h.container,"margin-vert--md",t),children:[(0,i.jsx)(p,{date:r,formattedDate:l}),void 0!==o&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(x,{}),(0,i.jsx)(g,{readingTime:o})]})]})}function b(e){return e.href?(0,i.jsx)(o.Z,{...e}):(0,i.jsx)(i.Fragment,{children:e.children})}function f(e){let{author:t,className:a}=e;const{name:n,title:r,url:l,imageURL:o,email:c}=t,m=l||c&&`mailto:${c}`||void 0;return(0,i.jsxs)("div",{className:(0,s.Z)("avatar margin-bottom--sm",a),children:[o&&(0,i.jsx)(b,{href:m,className:"avatar__photo-link",children:(0,i.jsx)("img",{className:"avatar__photo",src:o,alt:n,itemProp:"image"})}),n&&(0,i.jsxs)("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person",children:[(0,i.jsx)("div",{className:"avatar__name",children:(0,i.jsx)(b,{href:m,itemProp:"url",children:(0,i.jsx)("span",{itemProp:"name",children:n})})}),r&&(0,i.jsx)("small",{className:"avatar__subtitle",itemProp:"description",children:r})]})]})}const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function _(e){let{className:t}=e;const{metadata:{authors:a},assets:r}=(0,n.C)();if(0===a.length)return null;const l=a.every((e=>{let{name:t}=e;return!t}));return(0,i.jsx)("div",{className:(0,s.Z)("margin-top--md margin-bottom--sm",l?v.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,i.jsx)("div",{className:(0,s.Z)(!l&&"col col--6",l?v.imageOnlyAuthorCol:v.authorCol),children:(0,i.jsx)(f,{author:{...e,imageURL:r.authorsImageUrls[t]??e.imageURL}})},t)))})}function N(){return(0,i.jsxs)("header",{children:[(0,i.jsx)(m,{}),(0,i.jsx)(j,{}),(0,i.jsx)(_,{})]})}var P=a(8780),Z=a(2459);function k(e){let{children:t,className:a}=e;const{isBlogPostPage:r}=(0,n.C)();return(0,i.jsx)("div",{id:r?P.blogPostContainerID:void 0,className:(0,s.Z)("markdown",a),itemProp:"articleBody",children:(0,i.jsx)(Z.Z,{children:t})})}var w=a(4881),C=a(1526);function T(){return(0,i.jsx)("b",{children:(0,i.jsx)(d.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function I(e){const{blogPostTitle:t,...a}=e;return(0,i.jsx)(o.Z,{"aria-label":(0,d.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,i.jsx)(T,{})})}const F={blogPostFooterDetailsFull:"blogPostFooterDetailsFull_mRVl"};function L(){const{metadata:e,isBlogPostPage:t}=(0,n.C)(),{tags:a,title:r,editUrl:l,hasTruncateMarker:o}=e,c=!t&&o,m=a.length>0;return m||c||l?(0,i.jsxs)("footer",{className:(0,s.Z)("row docusaurus-mt-lg",t&&F.blogPostFooterDetailsFull),children:[m&&(0,i.jsx)("div",{className:(0,s.Z)("col",{"col--9":c}),children:(0,i.jsx)(C.Z,{tags:a})}),t&&l&&(0,i.jsx)("div",{className:"col margin-top--sm",children:(0,i.jsx)(w.Z,{editUrl:l})}),c&&(0,i.jsx)("div",{className:(0,s.Z)("col text--right",{"col--3":m}),children:(0,i.jsx)(I,{blogPostTitle:r,to:e.permalink})})]}):null}function y(e){let{children:t,className:a}=e;const r=function(){const{isBlogPostPage:e}=(0,n.C)();return e?void 0:"margin-bottom--xl"}();return(0,i.jsxs)(l,{className:(0,s.Z)(r,a),children:[(0,i.jsx)(N,{}),(0,i.jsx)(k,{children:t}),(0,i.jsx)(L,{})]})}},4881:(e,t,a)=>{a.d(t,{Z:()=>m});a(7294);var s=a(5999),n=a(5281),r=a(9960),i=a(6010);const l={iconEdit:"iconEdit_Z9Sw"};var o=a(5893);function c(e){let{className:t,...a}=e;return(0,o.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,i.Z)(l.iconEdit,t),"aria-hidden":"true",...a,children:(0,o.jsx)("g",{children:(0,o.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function m(e){let{editUrl:t}=e;return(0,o.jsxs)(r.Z,{to:t,className:n.k.common.editThisPage,children:[(0,o.jsx)(c,{}),(0,o.jsx)(s.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}},2244:(e,t,a)=>{a.d(t,{Z:()=>i});a(7294);var s=a(6010),n=a(9960),r=a(5893);function i(e){const{permalink:t,title:a,subLabel:i,isNext:l}=e;return(0,r.jsxs)(n.Z,{className:(0,s.Z)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[i&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:i}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},3008:(e,t,a)=>{a.d(t,{Z:()=>l});a(7294);var s=a(6010),n=a(9960);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var i=a(5893);function l(e){let{permalink:t,label:a,count:l}=e;return(0,i.jsxs)(n.Z,{href:t,className:(0,s.Z)(r.tag,l?r.tagWithCount:r.tagRegular),children:[a,l&&(0,i.jsx)("span",{children:l})]})}},1526:(e,t,a)=>{a.d(t,{Z:()=>o});a(7294);var s=a(6010),n=a(5999),r=a(3008);const i={tags:"tags_jXut",tag:"tag_QGVx"};var l=a(5893);function o(e){let{tags:t}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(n.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,s.Z)(i.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:a}=e;return(0,l.jsx)("li",{className:i.tag,children:(0,l.jsx)(r.Z,{label:t,permalink:a})},a)}))})]})}},9460:(e,t,a)=>{a.d(t,{C:()=>o,n:()=>l});var s=a(7294),n=a(902),r=a(5893);const i=s.createContext(null);function l(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const l=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,r.jsx)(i.Provider,{value:l,children:t})}function o(){const e=(0,s.useContext)(i);if(null===e)throw new n.i6("BlogPostProvider");return e}},8824:(e,t,a)=>{a.d(t,{c:()=>c});var s=a(7294),n=a(2263);const r=["zero","one","two","few","many","other"];function i(e){return r.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:i(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:i(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const s=e.split("|");if(1===s.length)return s[0];s.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const n=a.select(t),r=a.pluralForms.indexOf(n);return s[Math.min(r,s.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/96daa04a.7fa0a7cf.js b/assets/js/96daa04a.7fa0a7cf.js deleted file mode 100644 index d6ea48ccb..000000000 --- a/assets/js/96daa04a.7fa0a7cf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8685],{3905:(e,t,i)=>{i.d(t,{Zo:()=>d,kt:()=>p});var o=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,o)}return i}function r(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var l=o.createContext({}),c=function(e){var t=o.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):r(r({},t),e)),i},d=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(i),h=a,p=u["".concat(l,".").concat(h)]||u[h]||m[h]||n;return i?o.createElement(p,r(r({ref:t},d),{},{components:i})):o.createElement(p,r({ref:t},d))}));function p(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.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[u]="string"==typeof e?e:a,r[1]=s;for(var c=2;c{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var o=i(7462),a=(i(7294),i(3905));const n={title:"Prologue",sidebar_position:1},r="Prologue",s={unversionedId:"introduction/prologue",id:"introduction/prologue",title:"Prologue",description:"Multimedia compression as a whole has revolutionized our ability to communicate on the Web & beyond. It has enabled rich experiences across many breakthrough platforms that wouldn't have been feasible otherwise, and it has allowed us to communicate information, expression, and human connection in novel ways. It is the unsung hero of the modern Web. Despite this, it is often difficult to uncover information about codec technology that is accurate, informed, and battle-tested by passionate individuals who care about the proliferation of knowledge. This wiki aims to demystify the realm of multimedia compression while connecting codec enthusiasts to create a sink of knowledge for the benefit of everyone.",source:"@site/docs/introduction/prologue.md",sourceDirName:"introduction",slug:"/introduction/prologue",permalink:"/docs/introduction/prologue",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/prologue.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Prologue",sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Terminology",permalink:"/docs/introduction/terminology"}},l={},c=[{value:"What This Isn't",id:"what-this-isnt",level:3},{value:"What is a Codec",id:"what-is-a-codec",level:3},{value:"What You Need",id:"what-you-need",level:3}],d={toc:c},u="wrapper";function m(e){let{components:t,...i}=e;return(0,a.kt)(u,(0,o.Z)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"prologue"},"Prologue"),(0,a.kt)("p",null,"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."),(0,a.kt)("h3",{id:"what-this-isnt"},"What This Isn't"),(0,a.kt)("p",null,"The Codec Wiki is ",(0,a.kt)("strong",{parentName:"p"},"not a highly accurate source for understanding the mathematics, research, adoption/patent politics, or specifications of specific coder/decoder implementations"),". Sources like Wikipedia cover these details with great accuracy & reliability. What we ",(0,a.kt)("em",{parentName:"p"},"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."),(0,a.kt)("h3",{id:"what-is-a-codec"},"What is a Codec"),(0,a.kt)("p",null,"A codec, shortened from coder/decoder, is a system that handles digital media or data according to a specification. Usually, this means it compresses and decompresses digital media. Codecs are used to encode media for storage and transmission - among other things - and then decode that media for playback, editing, etc. Multimedia codecs compress by either ",(0,a.kt)("a",{parentName:"p",href:"/docs/introduction/psychovisual"},"discarding less salient data")," using ",(0,a.kt)("a",{parentName:"p",href:"/docs/introduction/video-artifacts"},"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:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Video compression: Video codecs like ",(0,a.kt)("a",{parentName:"li",href:"/docs/video/AVC"},"H.264"),", ",(0,a.kt)("a",{parentName:"li",href:"/docs/video/VP9"},"VP9")," & ",(0,a.kt)("a",{parentName:"li",href:"/docs/video/AV1"},"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."),(0,a.kt)("li",{parentName:"ul"},"Audio compression: Audio codecs like ",(0,a.kt)("a",{parentName:"li",href:"/docs/audio/MP3"},"MP3"),", ",(0,a.kt)("a",{parentName:"li",href:"/docs/audio/AAC"},"AAC"),", and ",(0,a.kt)("a",{parentName:"li",href:"/docs/audio/Opus"},"Opus")," compress audio files like songs & podcasts. This allows them to be easily distributed & stored. "),(0,a.kt)("li",{parentName:"ul"},"Image Compression: Image codecs, whether tried and true like ",(0,a.kt)("a",{parentName:"li",href:"/docs/images/JPEG"},"JPEG")," or brand new like ",(0,a.kt)("a",{parentName:"li",href:"/docs/images/JXL"},"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."),(0,a.kt)("li",{parentName:"ul"},"Data Compression: General compression algorithms like ",(0,a.kt)("a",{parentName:"li",href:"/docs/data/zip"},"ZIP")," & ",(0,a.kt)("a",{parentName:"li",href:"/docs/data/zstd"},"zstd")," are designed to compress ",(0,a.kt)("em",{parentName:"li"},"any")," kind of data, not just multimedia specific data. This includes web assets, executables, text archives, and even entire filesystems.")),(0,a.kt)("p",null,"In summary, ",(0,a.kt)("strong",{parentName:"p"},"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."),(0,a.kt)("h3",{id:"what-you-need"},"What You Need"),(0,a.kt)("p",null,"A rather informal list of requirements follows."),(0,a.kt)("p",null,"You will benefit greatly from:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Patience."),(0,a.kt)("li",{parentName:"ul"},"A willingness to learn, engage in curiousity, & follow instructions"),(0,a.kt)("li",{parentName:"ul"},"Basic to intermediate computer proficiency.")),(0,a.kt)("p",null,"If you're only here to learn the tools, it will be very beneficial to have:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Higher-end CPU hardware, which will decrease wait times for some larger encoding workloads discussed here."),(0,a.kt)("li",{parentName:"ul"},"A level of comfort with CLI utilities, or enough motivation to engage with them in the absence of background knowledge."),(0,a.kt)("li",{parentName:"ul"},"A device running an Arch-based Linux distribution, excluding Manjaro")),(0,a.kt)("admonition",{title:"Why Arch?",type:"info"},(0,a.kt)("p",{parentName:"admonition"},"Most encoding tools are readily available in the package manager, & it is a bleeding edge Linux distribution which ensures your utilities are always kept up to date. For filtering, all Vapoursynth plugins are already available in the Arch User Repository (AUR) which makes it extremely easy to install and version control with an AUR helper ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Jguer/yay"},"like ",(0,a.kt)("inlineCode",{parentName:"a"},"yay")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/96f54850.bb67fd56.js b/assets/js/96f54850.bb67fd56.js deleted file mode 100644 index 6699cc7ec..000000000 --- a/assets/js/96f54850.bb67fd56.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3681],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,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 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},d=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={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,d=c(e,["components","mdxType","originalType","parentName"]),p=l(r),f=o,m=p["".concat(s,".").concat(f)]||p[f]||u[f]||i;return r?n.createElement(m,a(a({ref:t},d),{},{components:r})):n.createElement(m,a({ref:t},d))}));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 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:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const i={label:"VVC / H.266",sidebar_position:3},a="H.266",c={unversionedId:"video/VVC",id:"video/VVC",title:"H.266",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VVC.md",sourceDirName:"video",slug:"/video/VVC",permalink:"/docs/video/VVC",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VVC.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"VVC / H.266",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"H.265",permalink:"/docs/video/HEVC"},next:{title:"VP8",permalink:"/docs/video/VP8"}},s={},l=[],d={toc:l},p="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"h266"},"H.266"),(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,"H.266, or VVC (Versatile Video Coding), is a codec standardized in 2020 by the Joint Video Experts Team (JVET). It succeeds ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/HEVC"},"H.265"),", and claims to be 40% more efficient. In practice, it is currently about as efficient as ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"AV1")," when using the ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/VVenC"},"VVenC")," encoder, although it is inherently a more complex format which means it will be more difficult to decode. It is encumbered by royalties."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/998d107e.486ec820.js b/assets/js/998d107e.486ec820.js new file mode 100644 index 000000000..ce526bc5f --- /dev/null +++ b/assets/js/998d107e.486ec820.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[373],{6488:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var i=o(5893),n=o(1151);const s={label:"FFV1",sidebar_position:12},r="FFV1",c={id:"video/FFV1",title:"FFV1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/FFV1.mdx",sourceDirName:"video",slug:"/video/FFV1",permalink:"/docs/video/FFV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/FFV1.mdx",tags:[],version:"current",sidebarPosition:12,frontMatter:{label:"FFV1",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Theora",permalink:"/docs/video/Theora"},next:{title:"UT Video Codec Suite",permalink:"/docs/video/utvideo"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"ffv1",children:"FFV1"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(t.p,{children:["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 ",(0,i.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," project."]})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>c,a:()=>r});var i=o(7294);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99c26446.e28ab833.js b/assets/js/99c26446.e28ab833.js new file mode 100644 index 000000000..8c308eaf6 --- /dev/null +++ b/assets/js/99c26446.e28ab833.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5265],{7644:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=i(5893),o=i(1151);const r={label:"Butteraugli",sidebar_position:1},s="Butteraugli",a={id:"metrics/butteraugli",title:"Butteraugli",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/butteraugli.mdx",sourceDirName:"metrics",slug:"/metrics/butteraugli",permalink:"/docs/metrics/butteraugli",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/butteraugli.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"Butteraugli",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"VMAF",permalink:"/docs/metrics/VMAF"},next:{title:"\u25b6\ufe0f Video Players",permalink:"/docs/video-players"}},u={},c=[];function l(t){const e={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"butteraugli",children:"Butteraugli"}),"\n",(0,n.jsx)(e.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(e.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(e.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function d(t={}){const{wrapper:e}={...(0,o.a)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(l,{...t})}):l(t)}},1151:(t,e,i)=>{i.d(e,{Z:()=>a,a:()=>s});var n=i(7294);const o={},r=n.createContext(o);function s(t){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:s(t.components),n.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/9b0d9acc.2625e206.js b/assets/js/9b0d9acc.2625e206.js deleted file mode 100644 index 81261cb31..000000000 --- a/assets/js/9b0d9acc.2625e206.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3677],{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 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},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},l="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,u=c(e,["components","mdxType","originalType","parentName"]),l=p(r),d=o,f=l["".concat(s,".").concat(d)]||l[d]||m[d]||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]=d;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 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:"PSNR",sidebar_position:1},a="PSNR",c={unversionedId:"metrics/PSNR",id:"metrics/PSNR",title:"PSNR",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/PSNR.md",sourceDirName:"metrics",slug:"/metrics/PSNR",permalink:"/docs/metrics/PSNR",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/PSNR.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"PSNR",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"FFmpeg",permalink:"/docs/utilities/ffmpeg"},next:{title:"SSIM",permalink:"/docs/metrics/SSIM"}},s={},p=[],u={toc:p},l="wrapper";function m(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:"psnr"},"PSNR"),(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!")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9b4bf0ad.9733d295.js b/assets/js/9b4bf0ad.9733d295.js deleted file mode 100644 index 39ae2e890..000000000 --- a/assets/js/9b4bf0ad.9733d295.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[537],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});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 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)}},f=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=s(r),f=i,m=p["".concat(l,".").concat(f)]||p[f]||d[f]||o;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[p]="string"==typeof e?e:i,a[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var n=r(7462),i=(r(7294),r(3905));const o={title:"Deinterlace",sidebar_position:3},a="Deinterlace",c={unversionedId:"filtering/deinterlace",id:"filtering/deinterlace",title:"Deinterlace",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/deinterlace.md",sourceDirName:"filtering",slug:"/filtering/deinterlace",permalink:"/docs/filtering/deinterlace",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/deinterlace.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Deinterlace",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Vapoursynth",permalink:"/docs/filtering/vapoursynth"},next:{title:"Denoise",permalink:"/docs/filtering/denoise"}},l={},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...r}=e;return(0,i.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"deinterlace"},"Deinterlace"),(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!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9b6fb453.b34e50bc.js b/assets/js/9b6fb453.b34e50bc.js new file mode 100644 index 000000000..88d7c1cc0 --- /dev/null +++ b/assets/js/9b6fb453.b34e50bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[130],{4469:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/9c171e5c.3eafdde1.js b/assets/js/9c171e5c.3eafdde1.js new file mode 100644 index 000000000..38b960cc2 --- /dev/null +++ b/assets/js/9c171e5c.3eafdde1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7142],{7766:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var i=n(5893),o=n(1151);const s={label:"SSIM",sidebar_position:1},r="SSIM",c={id:"metrics/SSIM",title:"SSIM",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/SSIM.mdx",sourceDirName:"metrics",slug:"/metrics/SSIM",permalink:"/docs/metrics/SSIM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIM.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"SSIM",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"PSNR",permalink:"/docs/metrics/PSNR"},next:{title:"SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"ssim",children:"SSIM"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var i=n(7294);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9cae5962.0306bf0e.js b/assets/js/9cae5962.0306bf0e.js new file mode 100644 index 000000000..51d385e1c --- /dev/null +++ b/assets/js/9cae5962.0306bf0e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1557],{5190:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>d});var n=i(5893),o=i(1151);const t={label:"JPEG-XL",sidebar_position:7},a="JPEG-XL",l={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.mdx",sourceDirName:"images",slug:"/images/JXL",permalink:"/docs/images/JXL",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JXL.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"JPEG-XL",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AVIF",permalink:"/docs/images/AVIF"},next:{title:"x264",permalink:"/docs/encoders/x264"}},r={},d=[{value:"Usage",id:"usage",level:2},{value:"Decoding",id:"decoding",level:3},{value:"Encoding",id:"encoding",level:3},{value:"Distance and quality",id:"distance-and-quality",level:4},{value:"Effort",id:"effort",level:4},{value:"Performance Checklist",id:"performance-checklist",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h1,{id:"jpeg-xl",children:"JPEG-XL"}),"\n",(0,n.jsx)(s.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(s.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(s.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(s.p,{children:["JPEG-XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional ",(0,n.jsx)(s.a,{href:"/docs/images/JPEG",children:"JPEG"})," format, while still maintaining image quality. JPEG-XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG."]}),"\n",(0,n.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsxs)(s.p,{children:["While it has support by many image viewers, editors, and other software, such as GIMP, Krita, Safari, ImageMagick, and many more, the most complete set of tools for encoding, manipulating, and decoding ",(0,n.jsx)(s.code,{children:".jxl"})," files is libjxl, the reference library for the format."]}),"\n",(0,n.jsx)(s.h3,{id:"decoding",children:"Decoding"}),"\n",(0,n.jsxs)(s.p,{children:["Decoding a ",(0,n.jsx)(s.code,{children:".jxl"})," image is straightforward with libjxl's decoder, ",(0,n.jsx)(s.code,{children:"djxl"}),":"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"djxl example.jxl example.png\n"})}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"djxl"})," can decode to pixels via pipes, png, apng for animated jxl, jpg, ppm, and pfm."]}),"\n",(0,n.jsxs)(s.p,{children:["By default, if the ",(0,n.jsx)(s.code,{children:".jxl"})," file was encoded with lossless jpeg recompression, ",(0,n.jsx)(s.code,{children:"djxl"})," will rebuild the exact jpeg file that was originally compressed. To avoid this, and create a new jpeg file:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"djxl -j example.jxl example.jpg\n"})}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsxs)(s.strong,{children:["Keep in mind this is now a lossy process as ",(0,n.jsx)(s.code,{children:"djxl"})," will decode to pixels, then encode a new ",(0,n.jsx)(s.code,{children:".jpg"})," with those pixels."]})}),"\n",(0,n.jsx)(s.h3,{id:"encoding",children:"Encoding"}),"\n",(0,n.jsxs)(s.p,{children:["libjxl's encoder ",(0,n.jsx)(s.code,{children:"cjxl"})," has more options to play around with. It takes a few primary arguments, distance (",(0,n.jsx)(s.code,{children:"-d"}),"), quality (",(0,n.jsx)(s.code,{children:"-q"}),"), and effort (",(0,n.jsx)(s.code,{children:"-e"}),")."]}),"\n",(0,n.jsx)(s.h4,{id:"distance-and-quality",children:"Distance and quality"}),"\n",(0,n.jsxs)(s.p,{children:["Distance and quality are two ways of specifying ",(0,n.jsx)(s.em,{children:"how much loss"})," you are willing to tolerate, and as such, they are mutually exclusive, as they pull the same levers under the hood."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Distance is designed to map to how 'close' one must be to the source to notice any loss. It is represented as a scale between 0.0 & 25.0. 0.0 is ",(0,n.jsx)(s.strong,{children:"mathematically lossless"}),", every pixel will have the exact same value as the source. 1.0 is designed to be ",(0,n.jsx)(s.strong,{children:"visually lossless"}),", look the same at a normal viewing distance, and higher values have more loss."]}),"\n",(0,n.jsxs)(s.li,{children:["Quality is designed to roughly map to ",(0,n.jsx)(s.a,{href:"/docs/images/JPEG",children:"JPEG"}),"'s quality argument. A range 0-100, where 100 is ",(0,n.jsx)(s.strong,{children:"mathematically lossless"}),", 90 is intended to be ",(0,n.jsx)(s.strong,{children:"visually lossless"}),", and 0 is almost unrecognizable as the original image."]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"effort",children:"Effort"}),"\n",(0,n.jsxs)(s.p,{children:["Effort is similar to ",(0,n.jsx)(s.code,{children:"cpu-used"})," in video encoding. It specifies the amount of effort the encoder will make in order to get the smallest file size it can. It takes the form of a range 1-9, where higher numbers will spend more resources to get diminishing returns in terms of smaller size, while lower values do the opposite, leaving file size on the table for faster encoding."]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cjxl -e 9 -d 0.3 example.png example.jxl\n"})}),"\n",(0,n.jsx)(s.p,{children:"Encoding with effort 9 and distance 0.3"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cjxl example.jpg example.jxl\n"})}),"\n",(0,n.jsx)(s.p,{children:"This, by default uses lossless JPEG compression."}),"\n",(0,n.jsx)(s.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(s.p,{children:["Lossless? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Lossy? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(s.em,{children:"Up to 32 BPC"})]}),"\n",(0,n.jsxs)(s.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Animation? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Transparency? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Progressive Decode? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Royalty Free? ",(0,n.jsx)(s.em,{children:"Yes"})]})]})}function h(e={}){const{wrapper:s}={...(0,o.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,s,i)=>{i.d(s,{Z:()=>l,a:()=>a});var n=i(7294);const o={},t=n.createContext(o);function a(e){const s=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.1229cf67.js b/assets/js/9e4087bc.1229cf67.js deleted file mode 100644 index d3f1d9d26..000000000 --- a/assets/js/9e4087bc.1229cf67.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3608],{3169:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(7294),l=a(9960),n=a(5999),c=a(1944),i=a(7961);function m(e){let{year:t,posts:a}=e;return r.createElement(r.Fragment,null,r.createElement("h3",null,t),r.createElement("ul",null,a.map((e=>r.createElement("li",{key:e.metadata.date},r.createElement(l.Z,{to:e.metadata.permalink},e.metadata.formattedDate," - ",e.metadata.title))))))}function s(e){let{years:t}=e;return r.createElement("section",{className:"margin-vert--lg"},r.createElement("div",{className:"container"},r.createElement("div",{className:"row"},t.map(((e,t)=>r.createElement("div",{key:t,className:"col col--4 margin-vert--lg"},r.createElement(m,e)))))))}function o(e){let{archive:t}=e;const a=(0,n.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),l=(0,n.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),m=function(e){const t=e.reduceRight(((e,t)=>{const a=t.metadata.date.split("-")[0],r=e.get(a)??[];return e.set(a,[t,...r])}),new Map);return Array.from(t,(e=>{let[t,a]=e;return{year:t,posts:a}}))}(t.blogPosts);return r.createElement(r.Fragment,null,r.createElement(c.d,{title:a,description:l}),r.createElement(i.Z,null,r.createElement("header",{className:"hero hero--primary"},r.createElement("div",{className:"container"},r.createElement("h1",{className:"hero__title"},a),r.createElement("p",{className:"hero__subtitle"},l))),r.createElement("main",null,m.length>0&&r.createElement(s,{years:m}))))}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.3da44326.js b/assets/js/9e4087bc.3da44326.js new file mode 100644 index 000000000..89938ce11 --- /dev/null +++ b/assets/js/9e4087bc.3da44326.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3608],{3169:(e,r,s)=>{s.r(r),s.d(r,{default:()=>o});s(7294);var t=s(9960),a=s(5999),i=s(1944),c=s(179),n=s(7955),l=s(5893);function d(e){let{year:r,posts:s}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.Z,{as:"h3",id:r,children:r}),(0,l.jsx)("ul",{children:s.map((e=>(0,l.jsx)("li",{children:(0,l.jsxs)(t.Z,{to:e.metadata.permalink,children:[e.metadata.formattedDate," - ",e.metadata.title]})},e.metadata.date)))})]})}function h(e){let{years:r}=e;return(0,l.jsx)("section",{className:"margin-vert--lg",children:(0,l.jsx)("div",{className:"container",children:(0,l.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,l.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,l.jsx)(d,{...e})},r)))})})})}function o(e){let{archive:r}=e;const s=(0,a.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),t=(0,a.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),d=function(e){const r=e.reduce(((e,r)=>{const s=r.metadata.date.split("-")[0],t=e.get(s)??[];return e.set(s,[r,...t])}),new Map);return Array.from(r,(e=>{let[r,s]=e;return{year:r,posts:s}}))}(r.blogPosts);return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.d,{title:s,description:t}),(0,l.jsxs)(c.Z,{children:[(0,l.jsx)("header",{className:"hero hero--primary",children:(0,l.jsxs)("div",{className:"container",children:[(0,l.jsx)(n.Z,{as:"h1",className:"hero__title",children:s}),(0,l.jsx)("p",{className:"hero__subtitle",children:t})]})}),(0,l.jsx)("main",{children:d.length>0&&(0,l.jsx)(h,{years:d})})]})]})}}}]); \ No newline at end of file diff --git a/assets/js/9efd8a4a.b8f3c6e2.js b/assets/js/9efd8a4a.b8f3c6e2.js new file mode 100644 index 000000000..254d7e817 --- /dev/null +++ b/assets/js/9efd8a4a.b8f3c6e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[638],{9792:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>d,toc:()=>l});var i=s(5893),t=s(1151);const o={label:"WebP",sidebar_position:4},r="WebP",d={id:"images/WebP",title:"WebP",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/WebP.mdx",sourceDirName:"images",slug:"/images/WebP",permalink:"/docs/images/WebP",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/WebP.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"WebP",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"HEIC",permalink:"/docs/images/HEIC"},next:{title:"JPEG 2000",permalink:"/docs/images/JPEG2000"}},c={},l=[{value:"Encoding",id:"encoding",level:2},{value:"Using libwebp",id:"using-libwebp",level:3},{value:"Performance Checklist",id:"performance-checklist",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"webp",children:"WebP"}),"\n",(0,i.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(n.p,{children:['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,i.jsx)(n.a,{href:"/docs/video/VP8",children:"VP8"})," video codec, and a novel lossless mode added in 2011."]}),"\n",(0,i.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,i.jsx)(n.h3,{id:"using-libwebp",children:"Using libwebp"}),"\n",(0,i.jsxs)(n.p,{children:["libwebp supports WebP, JPEG, PNG, PNM (PGM, PPM, PAM), TIFF as input formats, and a quality (",(0,i.jsx)(n.code,{children:"-q"}),") value between 0 (lowest quality, smallest file) and 100 (highest quality, largest file). Should you need the lossless mode, you need to instead use a ",(0,i.jsx)(n.code,{children:"-z"})," argument, with values representing the effort used between 0 (fastest encode, largest file) and 9 (slowest encode, smallest file)."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cwebp example.png -q 75 -o example.webp\n"})}),"\n",(0,i.jsx)(n.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,i.jsxs)(n.p,{children:["Lossless? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Lossy? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Supported Bit Depth:\n",(0,i.jsx)(n.em,{children:"8 BPC"})]}),"\n",(0,i.jsxs)(n.p,{children:["HDR/Wide Gamut? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Animation? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Transparency? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Progressive Decode? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Royalty Free? ",(0,i.jsx)(n.em,{children:"Yes"})]})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>d,a:()=>r});var i=s(7294);const t={},o=i.createContext(t);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9f640ee8.34652200.js b/assets/js/9f640ee8.34652200.js new file mode 100644 index 000000000..e934acf0c --- /dev/null +++ b/assets/js/9f640ee8.34652200.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5152],{9169:(e,r,o)=>{o.r(r),o.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var t=o(5893),n=o(1151);const s={label:"Aurora1 AV1",sidebar_position:6},a="Aurora1 AV1",i={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.',source:"@site/docs/encoders/Aurora1.mdx",sourceDirName:"encoders",slug:"/encoders/Aurora1",permalink:"/docs/encoders/Aurora1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/Aurora1.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"Aurora1 AV1",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"rav1e",permalink:"/docs/encoders/rav1e"},next:{title:"Kvazaar",permalink:"/docs/encoders/Kvazaar"}},c={},d=[];function u(e){const r={a:"a",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.h1,{id:"aurora1-av1",children:"Aurora1 AV1"}),"\n",(0,t.jsxs)(r.p,{children:["Aurora1 AV1 is a proprietary software AV1 encoder developed by ",(0,t.jsx)(r.a,{href:"https://www.visionular.com/en",children:"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.']})]})}function p(e={}){const{wrapper:r}={...(0,n.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},1151:(e,r,o)=>{o.d(r,{Z:()=>i,a:()=>a});var t=o(7294);const n={},s=t.createContext(n);function a(e){const r=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(s.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9f709603.521024ba.js b/assets/js/9f709603.521024ba.js new file mode 100644 index 000000000..b6cc45da1 --- /dev/null +++ b/assets/js/9f709603.521024ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6865],{4345:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=n(5893),o=n(1151);const r={title:"Deband",sidebar_position:2},s="Deband",a={id:"filtering/deband",title:"Deband",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/deband.mdx",sourceDirName:"filtering",slug:"/filtering/deband",permalink:"/docs/filtering/deband",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/deband.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Deband",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Intro",permalink:"/docs/filtering/intro"},next:{title:"Vapoursynth",permalink:"/docs/filtering/vapoursynth"}},d={},c=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"deband",children:"Deband"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>s});var i=n(7294);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a5eab855.fcb29101.js b/assets/js/a5eab855.fcb29101.js deleted file mode 100644 index a30ff6e83..000000000 --- a/assets/js/a5eab855.fcb29101.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8833],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>b});var i=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 i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function a(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),u=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=u(e.components);return i.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},f=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),p=u(r),f=n,b=p["".concat(s,".").concat(f)]||p[f]||d[f]||o;return r?i.createElement(b,a(a({ref:t},l),{},{components:r})):i.createElement(b,a({ref:t},l))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,a=new Array(o);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:n,a[1]=c;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var i=r(7462),n=(r(7294),r(3905));const o={label:"YUView",sidebar_position:4},a="YUView",c={unversionedId:"utilities/YUView",id:"utilities/YUView",title:"YUView",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/YUView.md",sourceDirName:"utilities",slug:"/utilities/YUView",permalink:"/docs/utilities/YUView",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/YUView.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"YUView",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"FFMetrics",permalink:"/docs/utilities/FFMetrics"},next:{title:"rAV1ator CLI",permalink:"/docs/utilities/rav1ator-cli"}},s={},u=[],l={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,i.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"yuview"},"YUView"),(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!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.02dbe3c0.js b/assets/js/a6aa9e1f.02dbe3c0.js deleted file mode 100644 index 587f0f16e..000000000 --- a/assets/js/a6aa9e1f.02dbe3c0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3089],{46:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var n=a(7294),l=a(6010),r=a(2263),i=a(1944),o=a(5281),s=a(9058),c=a(9703),m=a(197),g=a(9985);function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,r.Z)(),{blogDescription:l,blogTitle:o,permalink:s}=t,c="/"===s?a:o;return n.createElement(n.Fragment,null,n.createElement(i.d,{title:c,description:l}),n.createElement(m.Z,{tag:"blog_posts_list"}))}function d(e){const{metadata:t,items:a,sidebar:l}=e;return n.createElement(s.Z,{sidebar:l},n.createElement(g.Z,{items:a}),n.createElement(c.Z,{metadata:t}))}function u(e){return n.createElement(i.FG,{className:(0,l.Z)(o.k.wrapper.blogPages,o.k.page.blogListPage)},n.createElement(p,e),n.createElement(d,e))}},9703:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),l=a(5999),r=a(2244);function i(e){const{metadata:t}=e,{previousPage:a,nextPage:i}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),i&&n.createElement(r.Z,{permalink:i,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),l=a(9460),r=a(390);function i(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.3e0a8ada.js b/assets/js/a6aa9e1f.3e0a8ada.js new file mode 100644 index 000000000..35005c51b --- /dev/null +++ b/assets/js/a6aa9e1f.3e0a8ada.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3089],{46:(e,t,a)=>{a.r(t),a.d(t,{default:()=>h});a(7294);var i=a(6010),n=a(2263),s=a(1944),r=a(5281),l=a(1460),o=a(9703),d=a(197),g=a(9985),c=a(5893);function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,n.Z)(),{blogDescription:i,blogTitle:r,permalink:l}=t,o="/"===l?a:r;return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.d,{title:o,description:i}),(0,c.jsx)(d.Z,{tag:"blog_posts_list"})]})}function m(e){const{metadata:t,items:a,sidebar:i}=e;return(0,c.jsxs)(l.Z,{sidebar:i,children:[(0,c.jsx)(g.Z,{items:a}),(0,c.jsx)(o.Z,{metadata:t})]})}function h(e){return(0,c.jsxs)(s.FG,{className:(0,i.Z)(r.k.wrapper.blogPages,r.k.page.blogListPage),children:[(0,c.jsx)(p,{...e}),(0,c.jsx)(m,{...e})]})}},9703:(e,t,a)=>{a.d(t,{Z:()=>r});a(7294);var i=a(5999),n=a(2244),s=a(5893);function r(e){const{metadata:t}=e,{previousPage:a,nextPage:r}=t;return(0,s.jsxs)("nav",{className:"pagination-nav","aria-label":(0,i.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,s.jsx)(n.Z,{permalink:a,title:(0,s.jsx)(i.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),r&&(0,s.jsx)(n.Z,{permalink:r,title:(0,s.jsx)(i.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},9985:(e,t,a)=>{a.d(t,{Z:()=>r});a(7294);var i=a(9460),n=a(390),s=a(5893);function r(e){let{items:t,component:a=n.Z}=e;return(0,s.jsx)(s.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,s.jsx)(i.n,{content:t,children:(0,s.jsx)(a,{children:(0,s.jsx)(t,{})})},t.metadata.permalink)}))})}}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.6e67fc2d.js b/assets/js/a7bd4aaa.6e67fc2d.js new file mode 100644 index 000000000..50b7175d2 --- /dev/null +++ b/assets/js/a7bd4aaa.6e67fc2d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8518],{8564:(n,e,s)=>{s.r(e),s.d(e,{default:()=>l});s(7294);var r=s(1944),o=s(3320),i=s(4477),c=s(8790),t=s(197),u=s(5893);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(t.Z,{version:e.version,tag:(0,o.os)(e.pluginId,e.version)}),(0,u.jsx)(r.d,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function d(n){const{version:e,route:s}=n;return(0,u.jsx)(r.FG,{className:e.className,children:(0,u.jsx)(i.q,{version:e,children:(0,c.H)(s.routes)})})}function l(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...n}),(0,u.jsx)(d,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a8f610c9.e3fc64e8.js b/assets/js/a8f610c9.e3fc64e8.js new file mode 100644 index 000000000..697650fc6 --- /dev/null +++ b/assets/js/a8f610c9.e3fc64e8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7599],{859:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var i=o(5893),n=o(1151);const s={label:"brotli",sidebar_position:6},a="Brotli",r={id:"data/brotli",title:"Brotli",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/brotli.mdx",sourceDirName:"data",slug:"/data/brotli",permalink:"/docs/data/brotli",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/brotli.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"brotli",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"XZ",permalink:"/docs/data/xz"},next:{title:"ZPAQ",permalink:"/docs/data/zpaq"}},l={},c=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"brotli",children:"Brotli"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(t.p,{children:["Brotli was released by Google in late 2013, & it is commonly used on the Web for content delivery. It is a core part of the ",(0,i.jsx)(t.code,{children:".woff2"})," Web Open Font Format, allowing web fonts to be smaller when sent to users as part of a website. It is not very common to pass around ",(0,i.jsx)(t.code,{children:".tar.br"})," Brotli archives like you would with ",(0,i.jsx)(t.a,{href:"/docs/data/gzip",children:"gzip"})," or ",(0,i.jsx)(t.a,{href:"/docs/data/xz",children:"xz"}),", so it is perfectly acceptable that such files aren't really compatible anywhere. Brotli is almost universally compatible across the Web, supported by as much as 96% of the World Wide Web's users."]}),"\n",(0,i.jsx)(t.p,{children:"Brotli is based on LZ77 & Huffman coding, much like ZIP. It also uses context modeling to allow the use of multiple Huffman trees for the same alphabet in the same block; this essentially means that based on the context of the data being compressed, it can be compressed more efficiently especially if it contains multiple different kinds of data."}),"\n",(0,i.jsxs)(t.p,{children:["Brotli was co-authored & partially developed by Jyrki Alakuijala, who also worked on ",(0,i.jsx)(t.a,{href:"/docs/images/JXL",children:"JPEG-XL"})," & the efficient ",(0,i.jsx)(t.a,{href:"/docs/images/JPEG",children:"JPEG"})," encoder jpegli. JPEG-XL's metadata information is usually Brotli-compressed."]})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>r,a:()=>a});var i=o(7294);const n={},s=i.createContext(n);function a(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.d5d31623.js b/assets/js/a94703ab.d5d31623.js new file mode 100644 index 000000000..0581dba93 --- /dev/null +++ b/assets/js/a94703ab.d5d31623.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4368],{2674:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(7294),o=n(6010),i=n(1944),s=n(5281),l=n(3438),c=n(1116),r=n(5999),d=n(2466),u=n(5936);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(5893);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.Ct)();return(0,d.RF)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,r.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.Z)("clean-btn",s.k.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(1442),x=n(6550),f=n(7524),j=n(6668),k=n(1327);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const v={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,r.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,r.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.Z)("button button--secondary button--outline",v.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:v.collapseSidebarButtonIcon})})}var C=n(9689),S=n(902);const I=Symbol("EmptyContext"),N=a.createContext(I);function T(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(N.Provider,{value:i,children:t})}var B=n(6043),Z=n(8596),A=n(9960),L=n(2389);function y(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,r.I)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,r.I)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),type:"button",className:"clean-btn menu__caret",onClick:a})}function w(e){let{item:t,onItemClick:n,activePath:i,level:c,index:r,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.L)(),k=function(e){const t=(0,L.Z)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.LM)(e):void 0),[e,t])}(t),_=(0,l._F)(t,i),v=(0,Z.Mg)(x,i),{collapsed:g,setCollapsed:C}=(0,B.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:T,setExpandedItem:w}=function(){const e=(0,a.useContext)(N);if(e===I)throw new S.i6("DocSidebarItemsExpandedStateProvider");return e}(),E=function(e){void 0===e&&(e=!g),w(e?null:r),C(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,S.D9)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:E}),(0,a.useEffect)((()=>{h&&null!=T&&T!==r&&f&&C(!0)}),[h,T,r,C,f]),(0,b.jsxs)("li",{className:(0,o.Z)(s.k.docs.docSidebarItemCategory,s.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v}),children:[(0,b.jsx)(A.Z,{className:(0,o.Z)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?E(!1):(e.preventDefault(),E())}:()=>{n?.(t)},"aria-current":v?"page":void 0,"aria-expanded":h?!g:void 0,href:h?k??"#":k,...d,children:m}),x&&h&&(0,b.jsx)(y,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),E()}})]}),(0,b.jsx)(B.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(V,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:c+1})})]})}var E=n(3919),H=n(9471);const M={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:a,level:i,index:c,...r}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l._F)(t,a),x=(0,E.Z)(d);return(0,b.jsx)("li",{className:(0,o.Z)(s.k.docs.docSidebarItemLink,s.k.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(A.Z,{className:(0,o.Z)("menu__link",!x&&M.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...r,children:[u,!x&&(0,b.jsx)(H.Z,{})]})},u)}const W={menuHtmlItem:"menuHtmlItem_M9Kj"};function F(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:c}=t;return(0,b.jsx)("li",{className:(0,o.Z)(s.k.docs.docSidebarItemLink,s.k.docs.docSidebarItemLinkLevel(n),l&&[W.menuHtmlItem,"menu__list-item"],c),dangerouslySetInnerHTML:{__html:i}},a)}function P(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(w,{item:t,...n});case"html":return(0,b.jsx)(F,{item:t,...n});default:return(0,b.jsx)(R,{item:t,...n})}}function D(e){let{items:t,...n}=e;const a=(0,l.f)(t,n.activePath);return(0,b.jsx)(T,{children:a.map(((e,t)=>(0,b.jsx)(P,{item:e,index:t,...n},t)))})}const V=(0,a.memo)(D),U={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function K(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,C.nT)(),[t,n]=(0,a.useState)(e);return(0,d.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,r.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.Z)("menu thin-scrollbar",U.menu,l&&U.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.Z)(s.k.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:n,activePath:t,level:1})})})}const Y="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",G="sidebarHidden_VK0M",O="sidebarLogo_isFc";function q(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.L)();return(0,b.jsxs)("div",{className:(0,o.Z)(Y,s&&z,i&&G),children:[s&&(0,b.jsx)(k.Z,{tabIndex:-1,className:O}),(0,b.jsx)(K,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const J=a.memo(q);var Q=n(3102),X=n(3163);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,X.e)();return(0,b.jsx)("ul",{className:(0,o.Z)(s.k.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(Q.Zo,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.i)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(J,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,r.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,r.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,c.V)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.TH)(),[c,r]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{c&&r(!1),!c&&(0,p.n)()&&r(!0),i((e=>!e))}),[i,c]);return(0,b.jsx)("aside",{className:(0,o.Z)(s.k.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&r(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.Z)(ie.sidebarViewport,c&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:c}),c&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const ce={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function re(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,c.V)();return(0,b.jsx)("main",{className:(0,o.Z)(ce.docMainContainer,(t||!a)&&ce.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.Z)("container padding-top--md padding-bottom--lg",ce.docItemWrapper,t&&ce.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,c.V)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(re,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(5658);function be(e){const t=(0,l.SN)(e);if(!t)return(0,b.jsx)(me.Z,{});const{docElement:n,sidebarName:a,sidebarItems:r}=t;return(0,b.jsx)(i.FG,{className:(0,o.Z)(s.k.page.docsDocPage),children:(0,b.jsx)(c.b,{name:a,items:r,children:(0,b.jsx)(ue,{children:n})})})}},5658:(e,t,n)=>{n.d(t,{Z:()=>l});n(7294);var a=n(6010),o=n(5999),i=n(7955),s=n(5893);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.Z)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.Z,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/abb705c2.e0f08909.js b/assets/js/abb705c2.e0f08909.js deleted file mode 100644 index 91352acab..000000000 --- a/assets/js/abb705c2.e0f08909.js +++ /dev/null @@ -1 +0,0 @@ -"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/ad895e75.76b62aea.js b/assets/js/ad895e75.76b62aea.js deleted file mode 100644 index 981a8a01d..000000000 --- a/assets/js/ad895e75.76b62aea.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4288],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var i=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 i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function a(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=i.createContext({}),c=function(e){var t=i.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(r),h=n,m=d["".concat(l,".").concat(h)]||d[h]||p[h]||o;return r?i.createElement(m,a(a({ref:t},u),{},{components:r})):i.createElement(m,a({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,a=new Array(o);a[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:n,a[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var i=r(7462),n=(r(7294),r(3905));const o={title:"FAQ",sidebar_label:"\u2753 FAQ",position:14},a="FAQ",s={unversionedId:"FAQ",id:"FAQ",title:"FAQ",description:"Why are you doing this?",source:"@site/docs/FAQ.md",sourceDirName:".",slug:"/FAQ",permalink:"/docs/FAQ",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/FAQ.md",tags:[],version:"current",frontMatter:{title:"FAQ",sidebar_label:"\u2753 FAQ",position:14},sidebar:"tutorialSidebar",previous:{title:"\u2712\ufe0f Contribution Guide",permalink:"/docs/contribution-guide"},next:{title:"\ud83d\udd0f Privacy Policy",permalink:"/docs/privacy-policy"}},l={},c=[{value:"Why are you doing this?",id:"why-are-you-doing-this",level:2},{value:"But alternatives exist. Why not contribute there?",id:"but-alternatives-exist-why-not-contribute-there",level:3},{value:"How do I get started as a contributor?",id:"how-do-i-get-started-as-a-contributor",level:3},{value:"Why "Codec Wiki"?",id:"why-codec-wiki",level:3}],u={toc:c},d="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"faq"},"FAQ"),(0,n.kt)("h2",{id:"why-are-you-doing-this"},"Why are you doing this?"),(0,n.kt)("p",null,"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."),(0,n.kt)("h3",{id:"but-alternatives-exist-why-not-contribute-there"},"But alternatives exist. Why not contribute there?"),(0,n.kt)("p",null,"While this is true, this is easier said than done."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Multimedia Wiki is not as active as it used to be, & a new effort makes sense to carry past efforts forward.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("a",{parentName:"p",href:"https://guide.encode.moe/"},"guide.encode.moe")," is stagnant and mostly focused on fansub, docs & personal experiences that are scattered around the Internet.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"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."))),(0,n.kt)("h3",{id:"how-do-i-get-started-as-a-contributor"},"How do I get started as a contributor?"),(0,n.kt)("p",null,"See our Contribution Guide page in the sidebar."),(0,n.kt)("h3",{id:"why-codec-wiki"},'Why "Codec Wiki"?'),(0,n.kt)("p",null,'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.'))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/aea4c9a8.d344e793.js b/assets/js/aea4c9a8.d344e793.js deleted file mode 100644 index 574a50b47..000000000 --- a/assets/js/aea4c9a8.d344e793.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6031],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=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 o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),p=s(n),f=i,m=p["".concat(l,".").concat(f)]||p[f]||d[f]||o;return n?r.createElement(m,c(c({ref:t},u),{},{components:n})):r.createElement(m,c({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,c=new Array(o);c[0]=f;var a={};for(var l in t)hasOwnProperty.call(t,l)&&(a[l]=t[l]);a.originalType=e,a[p]="string"==typeof e?e:i,c[1]=a;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>s});var r=n(7462),i=(n(7294),n(3905));const o={title:"Detelecine / Inverse Telecine",sidebar_position:4},c="Detelecine / Inverse Telecine",a={unversionedId:"filtering/detelecine",id:"filtering/detelecine",title:"Detelecine / Inverse Telecine",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/detelecine.md",sourceDirName:"filtering",slug:"/filtering/detelecine",permalink:"/docs/filtering/detelecine",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/detelecine.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Detelecine / Inverse Telecine",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Denoise",permalink:"/docs/filtering/denoise"},next:{title:"Dehalo",permalink:"/docs/filtering/dehalo"}},l={},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"detelecine--inverse-telecine"},"Detelecine / Inverse Telecine"),(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!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/afe5e22f.b387c6f1.js b/assets/js/afe5e22f.b387c6f1.js new file mode 100644 index 000000000..0603c14d0 --- /dev/null +++ b/assets/js/afe5e22f.b387c6f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4380],{9114:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var i=t(5893),o=t(1151);const s={title:"x265",sidebar_position:2},r="x265",c={id:"encoders/x265",title:"x265",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/x265.mdx",sourceDirName:"encoders",slug:"/encoders/x265",permalink:"/docs/encoders/x265",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x265.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"x265",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"x264",permalink:"/docs/encoders/x264"},next:{title:"aomenc",permalink:"/docs/encoders/aomenc"}},l={},d=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"x265",children:"x265"}),"\n",(0,i.jsx)(n.admonition,{title:"Under Maintenance",type:"note",children:(0,i.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsx)(n.p,{children:"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."}),"\n",(0,i.jsx)(n.p,{children:"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."}),"\n",(0,i.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,i.jsxs)(n.p,{children:["x265 is available in FFmpeg via ",(0,i.jsx)(n.code,{children:"libx265"}),", to check if you have it, run ",(0,i.jsx)(n.code,{children:"ffmpeg -h encoder=libx265"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Pre-built binary (Recommended):"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"http://msystem.waw.pl/x265/",children:"http://msystem.waw.pl/x265/"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>r});var i=t(7294);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b0535000.da4124f2.js b/assets/js/b0535000.da4124f2.js new file mode 100644 index 000000000..35496d32a --- /dev/null +++ b/assets/js/b0535000.da4124f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1491],{5282:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>n,metadata:()=>r,toc:()=>m});var a=i(5893),o=i(1151);const n={title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},s=void 0,r={permalink:"/blog/site-optimization",source:"@site/blog/2023-07-21-site-optimization.mdx",title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"image",permalink:"/blog/tags/image"},{label:"web",permalink:"/blog/tags/web"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:9.255,hasTruncateMarker:!0,authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg",imageURL:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg",imageURL:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},c={authorsImageUrls:[void 0,void 0]},m=[];function g(e){const t={p:"p",...(0,o.a)(),...e.components};return(0,a.jsx)(t.p,{children:"A big part of understanding any multimedia codec technology is knowing the application for such technology."})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(g,{...e})}):g(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>r,a:()=>s});var a=i(7294);const o={},n=a.createContext(o);function s(e){const t=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b0d95fb7.acb71d07.js b/assets/js/b0d95fb7.acb71d07.js deleted file mode 100644 index 449010b7d..000000000 --- a/assets/js/b0d95fb7.acb71d07.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7671],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var o=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 o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=o.createContext({}),u=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=u(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(n),m=i,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||r;return n?o.createElement(h,a(a({ref:t},c),{},{components:n})):o.createElement(h,a({ref:t},c))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,a=new Array(r);a[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:i,a[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>u});var o=n(7462),i=(n(7294),n(3905));const r={title:"Contribution Guide",sidebar_label:"\u2712\ufe0f Contribution Guide",sidebar_position:13},a="Contribution Guide",l={unversionedId:"contribution-guide",id:"contribution-guide",title:"Contribution Guide",description:"Codec Wiki - community-maintained wiki for all things encoding.",source:"@site/docs/contribution-guide.md",sourceDirName:".",slug:"/contribution-guide",permalink:"/docs/contribution-guide",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/contribution-guide.md",tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"Contribution Guide",sidebar_label:"\u2712\ufe0f Contribution Guide",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"\ud83d\uddc3\ufe0f Resources",permalink:"/docs/resources"},next:{title:"\u2753 FAQ",permalink:"/docs/FAQ"}},s={},u=[{value:"Before You Contribute",id:"before-you-contribute",level:2},{value:"Connect With Us",id:"connect-with-us",level:3},{value:"Clone & Push Instructions",id:"clone--push-instructions",level:2},{value:"Website",id:"website",level:2},{value:"Installation",id:"installation",level:3},{value:"Local Development",id:"local-development",level:3},{value:"Build",id:"build",level:3},{value:"Deployment",id:"deployment",level:3}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,o.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"contribution-guide"},"Contribution Guide"),(0,i.kt)("p",null,"Codec Wiki - community-maintained wiki for all things encoding."),(0,i.kt)("h2",{id:"before-you-contribute"},"Before You Contribute"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"By contributing to the Codec Wiki, you are communicating that you have read & agreed to our Terms & Conditions, Privacy Policy, & Code of Conduct."),(0,i.kt)("li",{parentName:"ol"},"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.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Our current priority is filling out the existing pages with content. Please assist in doing this, if possible, before considering adding new pages.")),(0,i.kt)("p",null,"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:"),(0,i.kt)("admonition",{title:"Pending Review",type:"caution"},(0,i.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,i.kt)("p",null,"If you're aware your entry is too short or incomplete, please add the following message to the top of your entry:"),(0,i.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,i.kt)("p",null,"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:"),(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)("h3",{id:"connect-with-us"},"Connect With Us"),(0,i.kt)("p",null,'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:'),(0,i.kt)("iframe",{src:"https://discord.com/widget?id=1163724583472472138&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"}),(0,i.kt)("p",null,"Alternatively, we have a (soon to be) bridged Revolt server linked ",(0,i.kt)("a",{parentName:"p",href:"https://rvlt.gg/eSERRhSG"},"right here"),". Revolt is an open-source Discord alternative, which you can read more about on ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/revoltchat/legal/blob/master/About.md#communication-is-critical"},"this page"),"."),(0,i.kt)("h2",{id:"clone--push-instructions"},"Clone & Push Instructions"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Make sure to clone from & edit the")," ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," ",(0,i.kt)("strong",{parentName:"p"},"branch only, & push your final changes to the")," ",(0,i.kt)("inlineCode",{parentName:"p"},"deployment")," ",(0,i.kt)("strong",{parentName:"p"},"branch according to the instructions below. Also be sure to use node 18 LTS, as later versions tend to be troublesome.")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"don't forget to add unimportant files to the .gitignore before making any commits")),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Clone from the ",(0,i.kt)("inlineCode",{parentName:"li"},"main")," branch to start to make a contribution:")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"% git clone git@github.com:av1-community-contributors/av1-wiki.github.io.git -b main\n")),(0,i.kt)("ol",{start:2},(0,i.kt)("li",{parentName:"ol"},"Test your changes locally before making a commit:")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"% yarn\n% npx docusaurus start\n")),(0,i.kt)("ol",{start:3},(0,i.kt)("li",{parentName:"ol"},"Push changes to ",(0,i.kt)("inlineCode",{parentName:"li"},"main")," branch:")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'% git add .\n% git commit -m "Commit Message"\n% git push -u origin main\n')),(0,i.kt)("ol",{start:4},(0,i.kt)("li",{parentName:"ol"},"Deploy to ",(0,i.kt)("inlineCode",{parentName:"li"},"deployment")," branch to make live on site:")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"% GIT_USER= DEPLOYMENT_BRANCH=deployment yarn deploy\n")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Docusaurus Info")),(0,i.kt)("h2",{id:"website"},"Website"),(0,i.kt)("p",null,"This website is built using ",(0,i.kt)("a",{parentName:"p",href:"https://docusaurus.io/"},"Docusaurus 2"),", a modern static website generator."),(0,i.kt)("h3",{id:"installation"},"Installation"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ yarn\n")),(0,i.kt)("h3",{id:"local-development"},"Local Development"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ yarn start\n")),(0,i.kt)("p",null,"This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server."),(0,i.kt)("h3",{id:"build"},"Build"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ yarn build\n")),(0,i.kt)("p",null,"This command generates static content into the ",(0,i.kt)("inlineCode",{parentName:"p"},"build")," directory and can be served using any static contents hosting service."),(0,i.kt)("h3",{id:"deployment"},"Deployment"),(0,i.kt)("p",null,"See the initial instructions at the top."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b2f554cd.6b262794.js b/assets/js/b2f554cd.6b262794.js new file mode 100644 index 000000000..d4cf3f193 --- /dev/null +++ b/assets/js/b2f554cd.6b262794.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1477],{10:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"embedding-the-un-embeddable","metadata":{"permalink":"/blog/embedding-the-un-embeddable","source":"@site/blog/2023-10-29-embedding-the-un-embeddable.mdx","title":"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others","description":"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.","date":"2023-10-29T00:00:00.000Z","formattedDate":"October 29, 2023","tags":[{"label":"video","permalink":"/blog/tags/video"},{"label":"discord","permalink":"/blog/tags/discord"}],"readingTime":8.92,"hasTruncateMarker":true,"authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"}],"frontMatter":{"title":"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others","description":"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.","slug":"embedding-the-un-embeddable","authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"}],"tags":["video","discord"],"image":"/img/discord-embed-blog-image.webp","hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies"}},"content":"![Feature image](/img/discord-embed-blog-image.webp)\\n**A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film \\"Cosmos Laundromat\\"**\\n\\n\\n## A Scenario\\n\\nWhile chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it.\\n\\n\x3c!--truncate--\x3e\\n\\nIt loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don\'t know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations.\\n\\n![stolen.shoes](/img/stolenshoes-puss.webp)\\n\\nThe truth is, there are *multiple* site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:\\n\\n- https://stolen.shoes\\n- https://discord.nfp.is\\n- https://embeds.video\\n- https://x266.mov/discord-embed\\n- https://autocompressor.net/av1\\n\\nThe big question is, **how do they work?** Let\'s get to dissecting.\\n\\n## But First, a Quick Disclosure\\n\\nThe Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately.\\n\\n## How it Works\\n\\nThe entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park).\\n\\nThe technology\'s inner working can be divided into two distinct parts. First, let\'s see how it works on the website\'s end.\\n\\n### The Website\'s End\\nIf you view each website\'s source, you will find this specific line in each one but they may have a different order:\\n\\n```html\\n\\n\\n\\n\\n\\n```\\n\\nThese are the `head` parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site\'s icon, etc. They are usually found in between the `` and `` tags. Here\'s an example of a static HTML site serving one specific video:\\n```html\\n\\n\\n\\n \\n \\n some embed site\\n \\n \\n \\n \\n \\n\\n\\n

Hi

\\n

Just your friendly neighborhood video embed site

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

Hi

\\n

Just your friendly neighborhood video embed site

\\n \\n\\n```\\n\\n< br />\\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms).\\n\\n### Discord\'s End\\n\\nTraditionally, Discord\'s media embedder will impose it\'s own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link \\"tricks\\" Discord by showing a \\"false face\\" first.\\n\\n\\n\\n## Strengths & Limitations\\n\\nAfter a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites\' creators, the current strengths & limitations of this exploit are enumerated below.\\n\\n#### Strengths\\n\\n- You can embed non-web compatible codecs such as [HEVC](https://wiki.x266.mov/docs/video/HEVC) in [MP4/MOV](https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v), but the user must be using a compatible browser. [Thorium](https://thorium.rocks) or Safari version 13 or greater will work for HEVC playback.\\n- There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you\'re uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them.\\n\\n#### Limitations\\n\\n- You can only use [hotlinks](https://simple.wikipedia.org/wiki/Hotlinking), which means direct linking to the video itself ending in the appropriate file extension such as `.mp4`. Cloud services like Google Drive or OneDrive will not work for storage.\\n- You cannot use Discord\'s CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord\'s proxy blocking embeds over 50 MiB, but **only discord.nfp.is can do this**, as it **proxies cdn.discordapp.com** itself.\\n- You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord.\\n\\n\\n\\n## Differences between Sites\\n\\nAs mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality.\\n\\nHere are the sites, each with one noteworthy special benefit:\\n\\n- https://stolen.shoes - Recognition, as it is the OG.\\n- https://discord.nfp.is - You can use Discord CDN as video source.\\n- https://embeds.video - Immediately input video source into the URL (`https://embeds.video/https://example.com/v/video.mp4`)\\n- https://x266.mov/discord-embed - Attractive domain, simple layout.\\n- https://autocompressor.net/av1 - Lots of info dump, pretty advanced features.\\n\\nThat concludes the technical overview! Next, let\'s cover the history of this exploit.\\n\\n## The Lore\\n\\n### Dwayne\\n\\nIn around April of 2022, a Reddit user going by the name of u/CreativeGamer03 [posted a video on r/discordapp](https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh) of a link where a GIF of Dwayne \\"The Rock\\" Johnson plays caption with \\"Is this a GIF or is it a video?\\" When played, a low-quality music video of Rick Astley\'s \\"Never Gonna Give You Up\\" plays.\\n\\nThe link used is now unfortunately [removed](https://archuser.de/the-rock).\\n\\n### Discovery\\nOn 23rd June 2022, a Discord user *Clybius* on the AV1 Community server asked people for [VP9](https://wiki.x266.mov/docs/video/VP9) or [H.264](https://wiki.x266.mov/docs/video/AVC) videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked.\\n\\nHe tried shortly afterward with [AV1](https://wiki.x266.mov/docs/video/AV1). Eureka, it also worked:\\n\\n![AV1](/img/clybius-av1.webp)\\n\\nClybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll.\\n\\n![Dwayne](/img/clybius-dwayne.webp)\\n\\n### The Experiments & Interactive Site\\n\\nAfter the discovery of AV1 embedding, experimentation brought about the discovery that *any* video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you\'re interested in learning about containers, please see the [Containers](https://wiki.x266.mov/docs/introduction/terminology#container) section on the [Terminology](https://wiki.x266.mov/docs/introduction/terminology) page.\\n\\nThis applies to HEVC, ProRes, [xHE-AAC](https://wiki.x266.mov/docs/audio/AAC#xhe-aac), and other bizarre codecs that are rarely seen on the Web.\\n\\nWhile experimentating, Clybius converted one their idle domains `stolen.shoes` into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding.\\n\\n### Virality\\n\\nIt\'s not long before people outside of the AV1 Community discovered `stolen.shoes`, and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time.\\n\\n- The first instance featured the DreamWorks sequel of \\"Puss in Boots (2011)\\", \\"Puss in Boots: The Last Wish (2022)\\". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used `stolen.shoes`.\\n\\n![puss](/img/stolenshoes-puss.webp)\\n\\n- The second instance was when highly-anticipated animated film \\"The Super Mario Bros. Movie (2023)\\" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used `stolen.shoes` as the embed site.\\n\\n![mario](/img/stolenshoes-mario.webp)\\n\\n- The third instance is very recent as of the day this was posted. A streaming-service sourced \\"Five Nights at Freddy\'s (2023)\\" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining [hundreds of upvotes within the r/discordapp subreddit](https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/). The copy seems to be a compressed 720p encode. This example used `discord.nfp.is`.\\n\\n![fnaf](/img/discordnfpis-fnaf.webp)\\n\\nNote the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I\'ve noticed, featuring more illicit copyrighted content distribution: \\n- Top Gun Maverick (2022)\\n- The SpongeBob trilogy (2005/2015/2020)\\n- Spider-Man: Across the Spider-Verse (2023)\\n\\n\\n## Closing\\n\\nThe ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies.\\n\\nWhile this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms.\\n\\nIt is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let\'s instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord\'s sensibilities while allowing some creative flexibility on the platform.\\n\\nThank you for reading this blog post, I hope you learned something!"},{"id":"av1-encoding-for-dummies","metadata":{"permalink":"/blog/av1-encoding-for-dummies","source":"@site/blog/2023-09-03-av1-for-dummies.md","title":"AV1 Encoding for Dummies","description":"This guide will show you how to encode in AV1 the *right* and *optimal* way.","date":"2023-09-03T00:00:00.000Z","formattedDate":"September 3, 2023","tags":[{"label":"video","permalink":"/blog/tags/video"},{"label":"compression","permalink":"/blog/tags/compression"}],"readingTime":15.145,"hasTruncateMarker":true,"authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"},{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"}],"frontMatter":{"title":"AV1 Encoding for Dummies","description":"This guide will show you how to encode in AV1 the *right* and *optimal* way.","slug":"av1-encoding-for-dummies","authors":[{"name":"Simulping","title":"Maintainer / Encoder","url":"https://github.com/Simulping","image_url":"https://avatars.githubusercontent.com/u/12994794?v=4","imageURL":"https://avatars.githubusercontent.com/u/12994794?v=4"},{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"}],"tags":["video","compression"],"image":"/img/compare-guide.webp","hide_table_of_contents":false},"prevItem":{"title":"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others","permalink":"/blog/embedding-the-un-embeddable"},"nextItem":{"title":"Site Optimization by Reducing Image Load on the Web","permalink":"/blog/site-optimization"}},"content":"This guide will show you how to encode in AV1 the *right* and *optimal* way. Yes, you using standalone ``libaom``, ``libsvtav1``, and ``librav1e`` from FFmpeg or even piping ``yuv4mpeg`` into **mainline** aomenc are all unoptimal.\\n\\n\x3c!--truncate--\x3e\\n\\n\\n![Compare](/img/compare-guide.webp)\\n\\nIn this guide, we\'ll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1), unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is **RAM consumption**, encoding 2160p (4K) with [aomenc](https://wiki.x266.mov/docs/encoders/aomenc) with 4 workers could take upwards of **16GB** of RAM! So do keep this in mind.\\n\\n## Installing the Tools\\n\\n### Microsoft Windows\\n\\n**The GUI Way:**\\n1. Install [NMKODER](https://github.com/n00mkrad/nmkoder) which is a GUI front-end to av1an with all dependencies installed.\\n2. You\'re done, you can skip to the encoding part\\n\\n:::warning Almost abandonware\\nSince Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal.\\n:::\\n\\n**The Automated Way:**\\n\\nThere is now a batch script for automating the install process, which can be found [here](https://github.com/Hishiro64/av1an-win-script). The instructions are in the README file.\\n\\n:::caution\\nThe script will download outdated version encoders and tools such as `aom-av1-psy` and MKVToolNix v76.0, if you are fine with these you can proceed.\\n:::\\n\\n**The Manual Way:**\\n1. Install **Python 3.10.x, this will change so consult from the** [Vapoursynth website](http://www.vapoursynth.com/doc/installation.html) **if you\'re reading this from the future** from [here](https://www.python.org/downloads/windows/) and select \\"Windows Installer 64-bit\\". Upon installation check the tick for adding Python to PATH like so\\n![Python PATH](/img/python-path.webp))\\n\\n2. Download and install Vapoursynth from [here](https://github.com/vapoursynth/vapoursynth/releases) and select \\"VapourSynth64-RXX.exe\\"\\n3. Open the terminal and type ``vsrepo.py install lsmas ffms2`` to install some plugins for Av1an to work.\\n4. Download MKVToolNix from [here](https://mkvtoolnix.download/downloads.html#windows), select \\"mkvtoolnix-64bit-XX.X.X-setup.exe\\", and install **(Also available on winget!)**\\n5. Download Av1an from [here](https://github.com/master-of-zen/Av1an/releases) (SELECT LATEST AND CLICK THE \\"ASSETS\\" DROPDOWN)\\n6. Download **shared libraries** FFmpeg from [gyan.dev](https://www.gyan.dev/ffmpeg/builds)\\n7. Download a pre-built fork of Aomenc ([aom-av1-lavish](https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging)) which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows [here](https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28) *(Current as of Sept 6, 2023)*\\n:::info\\nIf you opt to compile aomenc yourself, you can view the instructions on how to do that [here](https://wiki.x266.mov/docs/encoders/aomenc/#installation).\\n:::\\n8. Move Av1an, FFmpeg **(Including the FFmpeg DLLs)**, and aomenc to somewhere preferable, eg ``C:\\\\Encoding``.\\n9. Add the folder **AND MKVTOOLNIX INSTALLATION FOLDER** to the [Windows PATH environment](https://www.maketecheasier.com/what-is-the-windows-path/).\\n\\n\\n### macOS\\n*written by gb82 (Gianni Rosato)*\\n\\nmacOS is very similar to Linux, although there aren\'t any GUI tools for AV1 encoding that I can comfortably recommend.\\n\\n**Homebrew + Macports for Av1an + rav1e:**\\n*Note that some commands may have to be run with `sudo`, which I won\'t explicitly include for security reasons.*\\n\\nInstalling the Homebrew package manager is a well documented process at this point:\\n```bash\\n/bin/bash -c \\"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\\"\\n```\\n\\nAs is installing MacPorts. Install the relevent `.pkg` for your macOS version from the MacPorts Project website:\\n[www.macports.org/install.php](https://www.macports.org/install.php)\\n\\nNow, you can run the following commands:\\n```bash\\nbrew update && brew upgrade\\nbrew install rav1e aom mkvtoolnix ffmpeg\\n# Usually you must run MacPorts commands for package installations as root\\nport upgrade outdated\\nport install av1an\\n```\\n\\nThis is the easiest way to get everything set up & working to produce AV1 video with `rav1e` or mainline `aomenc` & Av1an. You can check that things are installed by running the following commands & parsing their output:\\n```bash\\n% av1an --version\\nav1an 0.4.1-unstable (rev e10880d) (Release)\\n\\n* Compiler\\n rustc 1.70.0 (LLVM 16.0)\\n\\n* Target Triple\\n aarch64-apple-darwin\\n\\n* Date Info\\n Commit Date: 2023-06-25\\n\\n* VapourSynth Plugins\\n systems.innocent.lsmas : Not found\\n com.vapoursynth.ffms2 : Not found\\n```\\n```bash\\n% rav1e --version | grep \\"release\\" -C 1 \\nrav1e 0.6.6 () (release)\\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\\n```\\n```bash\\n% aomenc --help | grep \\"AOMedia\\" -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice `systems.innocent.lsmas : Not found` in the Av1an output. This means you won\'t be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through `-m hybrid`. This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:\\n\\n```bash\\nav1an -i \\"input\\" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v \\" --tiles 8 -s 4 --quantizer 80 --no-scene-detection\\" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o \\"output.mkv\\"\\n```\\n\\n**Building From Source**\\n\\nIf you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn\'t covered by the more basic installation, you\'ll have to compile from source. Things are very similar to Linux, with a few oddities:\\n\\n- macOS sometimes doesn\'t have a `/usr/local/bin` by default. You can fix this by doing `mkdir /usr/local/bin`.\\n- Homebrew installs *everything* in its own directory structure. If you\'re building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from `/opt/homebrew/lib` to `/usr/local/lib`. Finding them is a matter of `ls | grep \\"keyword\\"` & copying what looks reasonable to be associated with the tool you\'re using.\\n- Building most things from source will have instructions for \\\\*nix which work for both macOS & Linux. Even if it says Linux, there\'s a good chance it\'ll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won\'t be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example.\\n```bash\\nbrew install git rust nasm\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\"-C target-cpu=native\\" cargo build --release\\ncd .. && cd target/release\\ncp av1an /usr/local/bin\\n```\\n\\n**More Difficult: Building aom-av1-lavish from Source**\\n\\nIf you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:\\n```bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish\\n```\\nNow, you need to make some manual changes to the source code until Clybius merges [this commit](https://github.com/Clybius/aom-av1-lavish/pull/1/files).\\n- Add the line `#include \\"aq_variance.h\\"` at line 19 in `av1/encoder/encodeframe_utils.c`\\n- Comment out line 2546 in `av1/encoder/speed_features.c`. This line is `const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };` & becomes `// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };`.\\n\\nNow you can continue to build according to the Linux instructions below. Obviously you\'ll need cmake, which you can install with homebrew along with any other tools you may need. While still in the `aom-av1-lavish` directory:\\n```bash\\nmkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\"-flto -O3 -march=native\\" -DCMAKE_C_FLAGS=\\"-flto -O3 -march=native -pipe -fno-plt\\" -DCMAKE_LD_FLAGS=\\"-flto -O3 -march=native\\"\\nmake -j$(nproc)\\n# This may need to be run as root:\\nmake install\\n```\\n\\nNow you can run `aomenc --help | grep \\"AOMedia\\" -C 3` to see if lavish installed. If you\'re getting the same output as above, you may need to copy the `aomenc` executable to `/opt/local/bin`, `/usr/local/bin`, & `/opt/homebrew/bin` if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:\\n```bash\\n% aomenc --help | grep AOMedia -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice how it says `AOMedia Project AV1 Encoder Psy` instead of `AOMedia Project AV1 Encoder`. You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below.\\n\\n### Linux\\n\\n:::info\\nYet again, try using Arch. It\'s way easier.\\n:::\\n\\n#### The Easy Ways\\n\\n- Install [Aviator](https://github.com/gianni-rosato/aviator) ([SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1) + [FFmpeg](https://wiki.x266.mov/docs/utilities/FFmpeg)) or [rAV1ator](https://giannirosato.com/blog/post/aviator-1/) basically same thing but [Av1an](https://wiki.x266.mov/docs/utilities/av1an.md) + [rav1e](https://wiki.x266.mov/docs/encoders/rav1e). Both are only available as [Flatpaks](https://beta.flathub.org/apps/net.natesales.Aviator). Keep in mind Aviator ships with **SVT-AV1** and rAV1ator with **rav1e** instead of aomenc/AOM-AV1, which I will not be covering here.\\n- Install [rav1ator-cli](https://wiki.x266.mov/docs/utilities/rav1ator-cli), a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See [this page](https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation) for more info.\\n\\n#### The Compiling Route\\n\\n##### Ubuntu\\n\\nThe guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via `rustup` first, as apt version of Rust is severely outdated, then you can continue.\\n\\nInstall dependencies:\\n```bash\\nsudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\\n```\\n\\nInstall l-smash:\\n```bash\\ngit clone https://github.com/l-smash/l-smash.git\\ncd l-smash\\n./configure --enable-shared --extra-cflags=\\"-march=native\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall zimg:\\n```bash\\ngit clone --recursive https://github.com/sekrit-twc/zimg.git\\ncd zimg\\n./autogen.sh\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall ImageMagick:\\n```bash\\ngit clone https://github.com/ImageMagick/ImageMagick\\ncd ImageMagick\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall Vapoursynth R63:\\n```bash\\nwget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\\nunzip R63.zip\\ncd vapoursynth-R63\\n./autogen.sh\\n./configure CFLAGS=\\"-march=native\\" CXXFLAGS=\\"-march=native\\" --libdir=/usr/lib\\nmake -j$(nproc)\\nsudo make install\\nsudo mkdir /usr/lib/vapoursynth\\nsudo ldconfig\\n```\\nThe plugin directory will be located in `/usr/lib/vapoursynth`.\\n\\n\\nInstall L-SMASH-Works Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args=\\"-march=native\\" -Dcpp_args=\\"-march=native\\"\\nninja -j$(nproc)\\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\\n```\\n\\n:::caution\\nL-SMASH-Works doesn\'t work on **aarch64**, it is recommended to use other plugins instead.\\n:::\\n\\nInstall FFMS2 Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/FFMS/ffms2\\ncd ffms2\\n./autogen.sh\\n./configure CFLAGS=\\"-O3 -march=native\\" CXXFLAGS=\\"-O3 -march=native\\"\\nmake -j$(nproc)\\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\\n```\\n\\nInstall Av1an:\\n```bash\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\"-C target-cpu=native\\" cargo build --release\\nsudo cp target/release/av1an /usr/local/bin\\n```\\n\\nWhen there\'s no errors, proceed to compiling `aom-av1-lavish`.\\n\\n##### Arch\\n\\nInstall dependencies:\\n```bash\\nsudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\\n```\\n\\nyou\'re done, proceed.\\n\\n#### Compiling aom-av1-lavish\\n``` bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\"-flto -O3 -march=native\\" -DCMAKE_C_FLAGS=\\"-flto -O3 -march=native -pipe -fno-plt\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\n## Encoding\\n\\nThe moment you\'ve all been waiting for, let\'s just get into it. Here\'s an example *recommended* parameter as of now (09/03/23) [MM/DD/YY]:\\n```bash\\nav1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a \\" -an \\" -f \\" -an \\" -v \\" --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 \\" -o \\"output.mkv\\"\\n```\\n\\n:::info Parameter Meta\\nIt is strongly recommended to join the [AV1 Discord server](https://discord.gg/vpREHAvYvh) to get the latest updates on what to use and which to set, as it\'s the only easily reachable place for everything AV1 & encoding tips in general.\\n:::\\nNow let\'s dissect it one-by-one\\n\\n**Av1an parameters:**\\n\\n- ``-i`` Input.\\n\\n- ``-x 300`` Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability.\\n\\n- ``-w 4`` Specifies the amount of \\"workers\\" or amount of encoders working on the video.\\n\\n- ``--verbose`` Sets logging to verbose.\\n\\n- ``--resume`` Resumes the encode even when you haven\'t encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There\'s no delete confirmation feature.. yet) if you \\"resumed\\" without the parameter in place.\\n\\n- ``-e aom`` Specifies we\'re using aomenc encoder which should be the default option.\\n\\n- ``-c mkvmerge`` Specifies we\'re using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method.\\n\\n- ``-m lsmash`` Specifies we\'re using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0).\\n\\n- ``-f \\" -an \\"`` ``-f`` Stands for ffmpeg parameters, ``-an`` is to remove all audio since its better to encode and merge it separately. To crop use ``-f \\" -an -vf crop=1920:800 \\"`` for example to crop the video to 1920x800.\\n\\n- ``-v \\" \\"`` Is where you put the encoder\'s parameters in.\\n\\n- ``-a \\" -an \\"`` FFmpeg audio encoding options, we\'re removing it cause we can always add it later. But if you want to, you can also encode directly. Here\'s an example for encoding to Opus using libopus assuming stereo: `-a \\" -c:a libopus -b:a 128k \\"`.\\n\\n- ``--photon-noise=10`` AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films.\\n\\n- ``--set-thread-affinity=2`` Pins the thread to the encoder, aligns with ``--threads=2`` in the encoder parameter so set them accordingly.\\n\\n\\n**aomenc parameters:**\\n- ``--bit-depth=10`` We\'re using 10bit because it makes the video smaller and reduces [banding](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring).\\n\\n- ``--cpu-used=4`` This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don\'t go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish).\\n\\n- ``--end-usage=q --cq-level=24`` This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24.\\n\\n- `--threads=2` Sets the amount of threads the encoder can use, aligns with `--set-thread-affinity` in Av1an.\\n\\n- ``--tile-columns=0 --tile-rows=0`` This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):\\n\\n \\n \\"Tiling\\"\\n \\n\\n:::note Tile usage\\nDo NOT use tiles for 1080p and below, use 1 ``tile-columns`` at 1440p (2K), 2 ``tile-columns`` and 1 ``tile-rows`` for 2160p (4K)\\n:::\\n\\n- ``--lag-in-frames=64`` Knockoff of x264/x265 [Group of Pictures](https://en.wikipedia.org/wiki/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.\\n \\n- ``--aq-mode`` adaptive quantization mode, 0 is better most of the time\\n\\n- ``--tune-content=psy --tune=ssim`` As the name suggests they are tunes that affect the video output, for the better, and for the worst\\n\\n:::info Tunes to use\\nSet ``tune-content`` to ``animation`` if you\'re encoding above ``cq-level=30`` A.K.A lower quality, despite it\'s name\\nSet ``tune-content`` to ``psy`` for everything else, **do not use if you encode above ``cq-level=30``**\\nFor ``tune``, this is a bit tricky. For now, the meta seems to be ``ssim``, but back then it was ``lavish`` which is considered THE best tune because it\'s based on [butteraugli](https://github.com/google/butteraugli). Now it\'s fallen behind because its more blurry than ``ssim``, and before that it was ``butteraugli``, and then ``ipq_vmaf_psy``, and finally just ``ipq``. \\nIf you use any of the VMAF tunes, **you need to specify ``--vmaf-model-path=`` to where you put it**.\\n:::\\n\\n- ``--enable-keyframe-filtering=1`` We\'re setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can\'t input it.\\n\\n- ``--sb-size=dynamic`` Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it.\\n\\n- ``--deltaq-mode`` set to 0 because its just better.\\n\\n- ``--arnr-strength=1`` Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you\'re doing live action content. Using maximum at higher bitrates would just result in a blurry mess.\\n\\n- ``--disable-kf --enable-fwd-kf=0`` We\'re disabling keyframes cause **Av1an already did scene detection, so we wont have to.**. And it speeds things up.\\n\\n- ``--kf-max-dist=9999`` Maximum keyframe interval, we\'re setting it at the highest possible value since av1an\'s scene detection keyframe interval is already 240 by default\\n\\n- ``--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost.\\n\\n- ``--enable-dnl-denoising=0`` Disables the encoder\'s built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well.\\n\\n\\n:::info Concatenation Error on Linux\\nRun ``ulimit -n 200000``, resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ``mkvmerge @../options.json``\\n:::\\n\\n\\n## Merging Everything\\n\\nOnce you\'re done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don\'t want Matroska files? That\'s fine, you can use FFmpeg or MP4Box to output into `mp4`, just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental.\\n\\n\\n## Tips & Tricks\\n\\n- `--denoise-noise-level=10` Alternative to `photon-noise`, slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don\'t attempt to use it at high values (>12) since it creates noticeable grain patterns.\\n\\n- `--arnr-maxframes` to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates.\\n\\n- `--butteraugli-resize-factor=2` if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and `--butteraugli-intensity-target=250` to match the content light level.\\n\\n\\n## Final Thoughts\\n\\nEncoding has always been about experimentation for the best, there is really no \\"One size fits all\\" for encoding content, as they differ from scene complexity, how it\'s captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!\\n\\n> **Guide originally hosted on https://rentry.co/AV1, rewrite and migration by Simulping.**"},{"id":"site-optimization","metadata":{"permalink":"/blog/site-optimization","source":"@site/blog/2023-07-21-site-optimization.md","title":"Site Optimization by Reducing Image Load on the Web","description":"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.","date":"2023-07-21T00:00:00.000Z","formattedDate":"July 21, 2023","tags":[{"label":"image","permalink":"/blog/tags/image"},{"label":"web","permalink":"/blog/tags/web"},{"label":"compression","permalink":"/blog/tags/compression"}],"readingTime":9.255,"hasTruncateMarker":true,"authors":[{"name":"RootAtKali","title":"Autocompressor Founder / CEO","image_url":"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg","imageURL":"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"}],"frontMatter":{"title":"Site Optimization by Reducing Image Load on the Web","description":"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.","slug":"site-optimization","authors":[{"name":"RootAtKali","title":"Autocompressor Founder / CEO","image_url":"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg","imageURL":"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{"name":"Gianni Rosato","title":"Maintainer","url":"https://github.com/gianni-rosato","image_url":"https://avatars.githubusercontent.com/u/35711760?v=4","imageURL":"https://avatars.githubusercontent.com/u/35711760?v=4"}],"tags":["image","web","compression"],"image":"/img/_DSC8466-smaller.jpg","hide_table_of_contents":false},"prevItem":{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies"}},"content":"A big part of understanding any multimedia codec technology is knowing the application for such technology.\\n\\n\x3c!--truncate--\x3e\\n\\n\\nFor images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website\'s traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.\\n\\n:::caution\\nThese instructions are for *photographic* images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.\\n:::\\n\\n:::warning\\nMany images won\'t load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn\'t represent an actual common website experience. If you\'re curious anyway, the following browsers can display the contents of this page perfectly:\\n- [Thorium](https://thorium.rocks/) | *Linux, [macOS](https://github.com/Alex313031/Thorium-Special/releases), [Windows](https://github.com/Alex313031/thorium/releases/), [Android](https://github.com/Alex313031/Thorium-Special/releases)*\\n- [Waterfox](https://www.waterfox.net/) | *[Linux](https://flathub.org/apps/net.waterfox.waterfox), [macOS](https://www.waterfox.net/download/), [Windows](https://www.waterfox.net/download/)*\\n- [Mercury](https://thorium.rocks/mercury) | *[Linux](https://github.com/Alex313031/Mercury/releases), [Windows](https://github.com/Alex313031/Mercury/releases)*\\n:::\\n\\n## Fire & Forget\\n\\nFirst, we\'ll illustrate what *not* to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn\'t generally usable for a website regardless of the codec you\'re using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won\'t be covering those here. Here\'s an example of a bloated image:\\n\\n*exported straight from Darktable at JPEG q90, with no scaling*\\n\\n![bloated_jpeg](/img/_DSC8466.jpg)\\n\\n**2.2 MB**\\n\\n## Massive Improvement\\n\\nThe easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image\'s size on a site is to inspect the image element\'s width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we\'re overfilling the element\'s size for no reason & the image is being scaled down anyway.\\n\\n![box-size-mac](/img/box-size-mac.avif)\\n*Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we\'re probably going to want to double the horizontal resolution here.*\\n\\nThe width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with `cjpegli`, looks like this:\\n\\n![smaller_jpeg](/img/_DSC8466-smaller.jpg)\\n\\nObviously, there\'s lost fidelity compared to the original, but considering this is *so much smaller*, it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of `cjpegli`, although that is secondary to the resize. If it doesn\'t look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size.\\n\\n2.2 MB -> **233 kB**\\n\\n### Lazy Loading\\n\\nA bonus tip is to add the `loading=\\"lazy\\"` attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn\'t save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:\\n\\n```html\\n\\n \\"alt\\n \\n```\\n\\n## New Codecs\\n\\nIf you desire further improvement, it may be time to consider using a newer codec like [AVIF](/docs/images/AVIF) or [JPEG-XL](/docs/images/JXL). These options will compress far more effectively than JPEG, with the only trade-off being browser support. We\'re not going to consider [WebP](/docs/images/WebP) or [HEIC](/docs/images/HEIC), since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we\'re just considering *lossy* compression for *photographic* images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now.\\n\\n### Fallbacks\\n\\nAVIF sees widespread support, but JPEG-XL isn\'t quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn\'t remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:\\n\\n```html\\n\\n \\n \\n \\n \\"alt\\n \\n```\\n\\nHere is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you\'re really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most.\\n\\n### Compression Efficacy\\n\\nLet\'s look at how our image examples compare to the original with our new codec selection. We\'ll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with `cjpegli` (which scores ~`83.01` with the [SSIMULACRA2](/docs/metrics/SSIMULACRA2) visual fidelity metric).\\n\\n![smaller_jxl](/img/_DSC8466-smaller.jxl)\\n\\n**137.0 kB** *JPEG-XL image, encoded with `cjxl lossless.png out.jxl -d 1.49 -e 9`. Score: ~`83.04`* *3.06s user time*\\n\\n![smaller_avif](/img/_DSC8466-smaller.avif)\\n\\n**124.8 kB** *AVIF image, encoded with `avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif`. Score: ~`83.03`* *7.54s user time*\\n\\nJXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I\'ll chalk that up to a decoding inconsistency between how the `ssimulacra2` program decodes JPEG & JXL. Either way, the scores are fairly close.\\n\\n![smaller_jxl_jpeg-recomp](/img/_DSC8466-smaller-recomp.jxl)\\n\\n**189.4 kB** *JPEG-XL image from JPEG, encoded with `cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11`. Score: ~`84.92` (???)* *0.67s user time*\\n\\nThe final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with `cjpegli` encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG\'s normal YCbCr which isn\'t perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine).\\n\\n![smaller_jpeg_xyb](/img/_DSC8466-smaller-xyb.jpg)\\n\\n**208.3 kB** *XYB JPEG, encoded with `cjpegli lossless.png out.jpg --xyb -d 1.155`. Score: ~`83.04`* *0.10s user time*\\n\\nIn this particular instance, AVIF seems to be the overall winner. This isn\'t always the case due to JXL\'s superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn\'t fast to encode.\\n\\n## Responsive Images\\n\\nDisplaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that\'s too small for the viewport leaves fidelity to be desired. Luckily, we have the [Responsive Image Linter](https://ausi.github.io/respimagelint/) that can help us figure out which image sizes we should be using.\\n\\n![responsive_image_linter](/img/responsive_image_linter.avif)\\n\\nIn our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here\'s how we\'d write that in HTML:\\n\\n```html\\n\\n\u2003\u2003\\n\u2003\u2003\\n\u2003\u2003\\"alt\\n\\n```\\n\\nIt is worth noting that this example above & the example below aren\'t perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:\\n\\n- `srcset` = the images available to your browser to serve, & their respective widths\\n- `sizes` = the conditions given to the browser explaining under what conditions should it serve which image\\n- `(min-width: XXXpx) YYYpx` = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels \\\\* display scaling.\\n- `calc(100vw - 24px)` = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let\'s say we have `(min-width: 997px) calc(75vw - 257px)`. This means given the viewport is at least 997px wide, calculate 0.75 \\\\* the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified.\\n\\n\\n\u2003\u2003\\n\u2003\u2003\\n\u2003\u2003\\"alt\\n\\n\\nThat\'s all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their [Reduce Your Page\'s Image Load](https://autocompressor.net/blog/reduce-image-load) blog post when writing this entry. I have [confirmed](https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI) with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0."}]}')}}]); \ No newline at end of file diff --git a/assets/js/b31956d8.b4e4f370.js b/assets/js/b31956d8.b4e4f370.js deleted file mode 100644 index cb6e376a1..000000000 --- a/assets/js/b31956d8.b4e4f370.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3599],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var r=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 r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=a,h=u["".concat(s,".").concat(m)]||u[m]||c[m]||o;return n?r.createElement(h,i(i({ref:t},d),{},{components:n})):r.createElement(h,i({ref:t},d))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const o={title:"x264",sidebar_position:1},i="x264",l={unversionedId:"encoders/x264",id:"encoders/x264",title:"x264",description:"x264 is a software library and command line application for encoding H.264 / AVC developed by VideoLAN, the people behind the ever-popular VLC Media Player and released under GNU GPL. It is written in C and Assembly with almost two decades worth of development and threading optimizations which makes it the fastest software video encoder available, which also happens to be extremely popular.",source:"@site/docs/encoders/x264.md",sourceDirName:"encoders",slug:"/encoders/x264",permalink:"/docs/encoders/x264",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x264.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"x264",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"JPEG-XL",permalink:"/docs/images/JXL"},next:{title:"x265",permalink:"/docs/encoders/x265"}},s={},p=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Recommendations",id:"recommendations",level:2},{value:"Lowering presets",id:"lowering-presets",level:3},{value:"Increase threads",id:"increase-threads",level:3},{value:"Open GOP",id:"open-gop",level:3},{value:"AQ Mode 3",id:"aq-mode-3",level:3},{value:"Increasing reference frames",id:"increasing-reference-frames",level:3},{value:"Tips and tricks",id:"tips-and-tricks",level:2}],d={toc:p},u="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"x264"},"x264"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"x264 has great fine detail retention which makes it perfect for high fidelity content."),(0,a.kt)("h2",{id:"ffmpeg"},"FFmpeg"),(0,a.kt)("p",null,"x264 is available in FFmpeg via ",(0,a.kt)("inlineCode",{parentName:"p"},"libx264"),", to check if you have it, run ",(0,a.kt)("inlineCode",{parentName:"p"},"ffmpeg -h encoder=libx264"),". You can input non-FFmpeg standard x264 parameters via ",(0,a.kt)("inlineCode",{parentName:"p"},"-x264-params"),"."),(0,a.kt)("h2",{id:"installation"},"Installation"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Pre-built binary ","[Recommended]",":")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://code.videolan.org/videolan/x264"},"https://code.videolan.org/videolan/x264"))),(0,a.kt)("p",null,"Choose your operating system there, or you can try using your package manager."),(0,a.kt)("h2",{id:"usage"},"Usage"),(0,a.kt)("p",null,"x264 has been praised for its simple, easy-to-use, and no fuss settings. Here are some examples:"),(0,a.kt)("p",null,"Simple Y4M input with CRF 20 and raw ",(0,a.kt)("inlineCode",{parentName:"p"},"264")," bitstream output:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"x264 --crf 20 -o output.264 input.y4m\n")),(0,a.kt)("p",null,"Preset slow, CRF 20, Y4M input:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"x264 --preset slow --crf 20 -o output.264 input.y4m\n")),(0,a.kt)("p",null,"FFmpeg piping:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.264\n")),(0,a.kt)("p",null,"FFmpeg piping with MKV output:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.mkv\n")),(0,a.kt)("admonition",{title:"Output Containers",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"x264 can output ",(0,a.kt)("inlineCode",{parentName:"p"},"264"),", MKV, FLV (Flash Video), and MP4 (If compiled with GPAC or L-SMASH support).")),(0,a.kt)("admonition",{type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"x264 will use Haali Matroska Muxer for MKV outputs, which has seeking issues. It is recommended to remux back using FFmpeg or mkvmerge/MKVToolNix.")),(0,a.kt)("h2",{id:"recommendations"},"Recommendations"),(0,a.kt)("p",null,'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.'),(0,a.kt)("h3",{id:"lowering-presets"},"Lowering presets"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"--preset veryslow")),(0,a.kt)("p",null,"The most obvious option, set the preset to the slowest bearable option. You can use ",(0,a.kt)("inlineCode",{parentName:"p"},"placebo")," if you have a beefy CPU."),(0,a.kt)("h3",{id:"increase-threads"},"Increase threads"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"--threads X")),(0,a.kt)("p",null,"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."),(0,a.kt)("h3",{id:"open-gop"},"Open GOP"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"--open-gop")),(0,a.kt)("p",null,"Enables Open GOP (Group of Pictures), where each GOP can ",(0,a.kt)("a",{parentName:"p",href:"https://ottverse.com/closed-gop-open-gop-idr/"},"reference one another"),", thus improving compression with little speed loss. For unknown reasons it is disabled by default in x264."),(0,a.kt)("h3",{id:"aq-mode-3"},"AQ Mode 3"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"--aq-mode 3")),(0,a.kt)("p",null,"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."),(0,a.kt)("h3",{id:"increasing-reference-frames"},"Increasing reference frames"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"--bframes 8 --ref 12")),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"tips-and-tricks"},"Tips and tricks"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"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 ",(0,a.kt)("inlineCode",{parentName:"li"},"--qp 0"),", using slower presets will decrease the size even further.")),(0,a.kt)("admonition",{title:"Why not CRF 0?",type:"info"},(0,a.kt)("p",{parentName:"admonition"},"Because CRF automatically adjusts the ",(0,a.kt)("strong",{parentName:"p"},"quantization parameters")," to achieve the desired quality. QP in the other hand, which stands for ",(0,a.kt)("strong",{parentName:"p"},"Quantization Parameter"),", you get full control over the quality you'll get. In this case, all-intra or lossless.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b4030b4d.ccd0c2c1.js b/assets/js/b4030b4d.ccd0c2c1.js new file mode 100644 index 000000000..3884a3c57 --- /dev/null +++ b/assets/js/b4030b4d.ccd0c2c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6766],{7606:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>n,default:()=>c,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=t(5893),a=t(1151);const s={label:"Aviator",sidebar_position:1},n="Aviator",r={id:"utilities/Aviator",title:"Aviator",description:"Aviator is a GUI application designed for encoding AV1 video & Opus audio with SVT-AV1, libopus, & ffmpeg on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through smart defaults implemented via its SVT-AV1 encoder.",source:"@site/docs/utilities/Aviator.mdx",sourceDirName:"utilities",slug:"/utilities/Aviator",permalink:"/docs/utilities/Aviator",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Aviator.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"Aviator",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Dehalo",permalink:"/docs/filtering/dehalo"},next:{title:"Av1an",permalink:"/docs/utilities/av1an"}},l={},d=[{value:"Installation",id:"installation",level:2},{value:"Aviator's Defaults",id:"aviators-defaults",level:2},{value:"Perceptual Optimization",id:"perceptual-optimization",level:3},{value:"Video",id:"video",level:3},{value:"Audio",id:"audio",level:3},{value:"Output",id:"output",level:3},{value:"Credits",id:"credits",level:2}];function u(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h1,{id:"aviator",children:"Aviator"}),"\n",(0,o.jsxs)(i.p,{children:["Aviator is a GUI application designed for encoding ",(0,o.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," video & Opus audio with ",(0,o.jsx)(i.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,o.jsx)(i.a,{href:"/docs/audio/Opus",children:"libopus"}),", & ",(0,o.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"ffmpeg"})," on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through smart defaults implemented via its SVT-AV1 encoder."]}),"\n",(0,o.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_splash2.avif",alt:"Aviator Splash"}),"\n",(0,o.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(i.p,{children:["Aviator is available on Flathub as a Flatpak. You can learn how to set up Flatpak on your distro of choice ",(0,o.jsx)(i.a,{href:"https://flatpak.org/setup/",children:"here"}),"."]}),"\n",(0,o.jsx)("a",{href:"https://flathub.org/apps/details/net.natesales.Aviator",children:(0,o.jsx)("img",{width:"200",alt:"Download on Flathub",src:"https://flathub.org/assets/badges/flathub-badge-en.png"})}),"\n",(0,o.jsx)(i.p,{children:"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."}),"\n",(0,o.jsx)(i.h2,{id:"aviators-defaults",children:"Aviator's Defaults"}),"\n",(0,o.jsx)(i.p,{children:"Hovering over most user configurable options in Aviator will produce a helpful tooltip that you can look at to make things more clear."}),"\n",(0,o.jsx)(i.h3,{id:"perceptual-optimization",children:"Perceptual Optimization"}),"\n",(0,o.jsxs)(i.p,{children:["Aviator doesn't use mainline SVT-AV1, but rather uses ",(0,o.jsx)(i.a,{href:"https://github.com/BlueSwordM/SVT-AV1",children:"a fork"})," maintained for perceptual quality. It includes several unique changes, including a custom ",(0,o.jsx)(i.a,{href:"/docs/metrics/SSIM",children:"SSIM"})," ",(0,o.jsx)(i.a,{href:"/docs/introduction/psychovisual",children:"RDO"})," tune that isn't included in mainline SVT-AV1."]}),"\n",(0,o.jsx)(i.p,{children:"Aviator's default FFmpeg command uses the following SVT-AV1 parameters:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",children:"-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\n"})}),"\n",(0,o.jsx)(i.h3,{id:"video",children:"Video"}),"\n",(0,o.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_video.webp",alt:"Aviator Video Settings",loading:"lazy"}),"\n",(0,o.jsxs)(i.p,{children:["By default, output resolution will match your source's resolution. Manually changing one resolution value will automatically calculate the other based on the video's aspect ratio. Aviator's SVT-AV1 speed preset is set to 6 by default, with a CRF (Constant Rate Factor) level of 32. You can set CRF from 0 to 63 using the slider, with larger numerical values indicating smaller filesize at the expense of visual quality. You can look at the detailed specifications behind each speed preset ",(0,o.jsx)(i.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#what-presets-do",children:"here"}),". Speed 6 offers a good balance between speed & compression efficiency at any CRF level."]}),"\n",(0,o.jsx)(i.p,{children:"Setting values that don't correspond with the source video's aspect ratio means the output will either stretch or crop based on if the \"crop\" option is checked."}),"\n",(0,o.jsx)(i.p,{children:"The Grain Synth slider allows you to add artificial grain to your video to mimic its natural grain. This option applies the artificial grain at decode time as a filter, which makes it easier to encode grainy videos at high fidelity. The Denoise switch removes noise from the video before applying artificial grain."}),"\n",(0,o.jsx)(i.h3,{id:"audio",children:"Audio"}),"\n",(0,o.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_audio.webp",alt:"Aviator Audio Settings",loading:"lazy"}),"\n",(0,o.jsx)(i.p,{children:"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."}),"\n",(0,o.jsx)(i.p,{children:'The "Copy Audio" switch disables WebM output due to potential compatibility hiccups & overrides every option on the Audio page to keep the source audio untouched. This option, when enabled, ensures the source audio isn\'t reencoded.'}),"\n",(0,o.jsx)(i.p,{children:"The Volume slider allows you to increase or decrease the output's volume. It is measured in decibels, and negative values decrease the volume. The Normalize switch allows you to normalize the audio's perceived loudness."}),"\n",(0,o.jsx)(i.h3,{id:"output",children:"Output"}),"\n",(0,o.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_output.webp",alt:"Aviator Output UI",loading:"lazy"}),"\n",(0,o.jsxs)(i.p,{children:["The container your video is stored in is associated with the file extension. Aviator offers two options for video output: the ",(0,o.jsx)(i.a,{href:"/docs/introduction/terminology#mkv--mka--mks--mk3d",children:"Matroska"})," video container & the ",(0,o.jsx)(i.a,{href:"/docs/introduction/terminology#webm",children:"WebM"})," container. The open-source Matroska container (.MKV) is used by default in Aviator & is a universal multimedia container with broad video & audio support. WebM is designed for web compatibility. Aviator won't copy subtitles to WebM outputs because WebM is only officially compatible with ",(0,o.jsx)(i.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," subtitles. Both containers work out of the box with Aviator's AV1 video & Opus audio, but WebM output will be disabled if the Copy Audio switch is enabled because then we lose this format compliance assurance."]}),"\n",(0,o.jsx)(i.h2,{id:"credits",children:"Credits"}),"\n",(0,o.jsxs)(i.p,{children:["Actively developed by ",(0,o.jsx)(i.a,{href:"https://github.com/gianni-rosato/",children:"Gianni Rosato"}),"."]})]})}function c(e={}){const{wrapper:i}={...(0,a.a)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>r,a:()=>n});var o=t(7294);const a={},s=o.createContext(a);function n(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:n(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b41a2a88.225c37b6.js b/assets/js/b41a2a88.225c37b6.js deleted file mode 100644 index 29b36b8da..000000000 --- a/assets/js/b41a2a88.225c37b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2759],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),d=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},l="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),l=d(n),f=o,m=l["".concat(s,".").concat(f)]||l[f]||u[f]||i;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.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[l]="string"==typeof e?e:o,a[1]=c;for(var d=2;d{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=n(7462),o=(n(7294),n(3905));const i={label:"AVC / H.264",sidebar_position:1},a="H.264",c={unversionedId:"video/AVC",id:"video/AVC",title:"H.264",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/AVC.md",sourceDirName:"video",slug:"/video/AVC",permalink:"/docs/video/AVC",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AVC.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"AVC / H.264",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"WavPack",permalink:"/docs/audio/WavPack"},next:{title:"H.265",permalink:"/docs/video/HEVC"}},s={},d=[],p={toc:d},l="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(l,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"h264"},"H.264"),(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,"H.264, also known as AVC (Advanced Video Coding), is a video compression standard that has played a significant role in multimedia codec technology. H.264 revolutionized video encoding by offering vastly more efficient compression than predecessors, and has been the nearly universal defacto video compression standard since. Its history is marked by continuous refinement and widespread adoption, especially as it pertains to the highly optimized ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/x264"},"x264")," video encoder. Despite being over a decade old, H.264 remains relevant today. Newer codecs like ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/HEVC"},"H.265"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/VP9"},"VP9"),", and ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"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."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b4470a6f.85539aa9.js b/assets/js/b4470a6f.85539aa9.js deleted file mode 100644 index 858104fdb..000000000 --- a/assets/js/b4470a6f.85539aa9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9596],{3905:(e,t,i)=>{i.d(t,{Zo:()=>m,kt:()=>u});var a=i(7294);function o(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function s(e){for(var t=1;t=0||(o[i]=e[i]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(o[i]=e[i])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):s(s({},t),e)),i},m=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var i=e.components,o=e.mdxType,n=e.originalType,l=e.parentName,m=r(e,["components","mdxType","originalType","parentName"]),c=p(i),g=o,u=c["".concat(l,".").concat(g)]||c[g]||h[g]||n;return i?a.createElement(u,s(s({ref:t},m),{},{components:i})):a.createElement(u,s({ref:t},m))}));function u(e,t){var i=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=i.length,s=new Array(n);s[0]=g;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r[c]="string"==typeof e?e:o,s[1]=r;for(var p=2;p{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>n,metadata:()=>r,toc:()=>p});var a=i(7462),o=(i(7294),i(3905));const n={title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},s=void 0,r={permalink:"/blog/site-optimization",source:"@site/blog/2023-07-21-site-optimization.md",title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"image",permalink:"/blog/tags/image"},{label:"web",permalink:"/blog/tags/web"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:9.255,hasTruncateMarker:!0,authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg",imageURL:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"Site Optimization by Reducing Image Load on the Web",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"RootAtKali",title:"Autocompressor Founder / CEO",image_url:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg",imageURL:"https://cdn.discordapp.com/avatars/456553041902960660/e57850912e0cd8dd62cb20439e0b36ea.jpg"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},prevItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},l={authorsImageUrls:[void 0,void 0]},p=[{value:"Fire & Forget",id:"fire--forget",level:2},{value:"Massive Improvement",id:"massive-improvement",level:2},{value:"Lazy Loading",id:"lazy-loading",level:3},{value:"New Codecs",id:"new-codecs",level:2},{value:"Fallbacks",id:"fallbacks",level:3},{value:"Compression Efficacy",id:"compression-efficacy",level:3},{value:"Responsive Images",id:"responsive-images",level:2}],m={toc:p},c="wrapper";function h(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"A big part of understanding any multimedia codec technology is knowing the application for such technology."),(0,o.kt)("p",null,"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."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"These instructions are for ",(0,o.kt)("em",{parentName:"p"},"photographic")," images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.")),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"Many images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:"),(0,o.kt)("ul",{parentName:"admonition"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://thorium.rocks/"},"Thorium")," | ",(0,o.kt)("em",{parentName:"li"},"Linux, ",(0,o.kt)("a",{parentName:"em",href:"https://github.com/Alex313031/Thorium-Special/releases"},"macOS"),", ",(0,o.kt)("a",{parentName:"em",href:"https://github.com/Alex313031/thorium/releases/"},"Windows"),", ",(0,o.kt)("a",{parentName:"em",href:"https://github.com/Alex313031/Thorium-Special/releases"},"Android"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://www.waterfox.net/"},"Waterfox")," | ",(0,o.kt)("em",{parentName:"li"},(0,o.kt)("a",{parentName:"em",href:"https://flathub.org/apps/net.waterfox.waterfox"},"Linux"),", ",(0,o.kt)("a",{parentName:"em",href:"https://www.waterfox.net/download/"},"macOS"),", ",(0,o.kt)("a",{parentName:"em",href:"https://www.waterfox.net/download/"},"Windows"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://thorium.rocks/mercury"},"Mercury")," | ",(0,o.kt)("em",{parentName:"li"},(0,o.kt)("a",{parentName:"em",href:"https://github.com/Alex313031/Mercury/releases"},"Linux"),", ",(0,o.kt)("a",{parentName:"em",href:"https://github.com/Alex313031/Mercury/releases"},"Windows"))))),(0,o.kt)("h2",{id:"fire--forget"},"Fire & Forget"),(0,o.kt)("p",null,"First, we'll illustrate what ",(0,o.kt)("em",{parentName:"p"},"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:"),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"exported straight from Darktable at JPEG q90, with no scaling")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"bloated_jpeg",src:i(6039).Z,width:"5470",height:"3656"})),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"2.2 MB")),(0,o.kt)("h2",{id:"massive-improvement"},"Massive Improvement"),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"box-size-mac",src:i(6440).Z}),"\n",(0,o.kt)("em",{parentName:"p"},"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.")),(0,o.kt)("p",null,"The width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with ",(0,o.kt)("inlineCode",{parentName:"p"},"cjpegli"),", looks like this:"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"smaller_jpeg",src:i(2918).Z,width:"1699",height:"1136"})),(0,o.kt)("p",null,"Obviously, there's lost fidelity compared to the original, but considering this is ",(0,o.kt)("em",{parentName:"p"},"so much smaller"),", it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of ",(0,o.kt)("inlineCode",{parentName:"p"},"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."),(0,o.kt)("p",null,"2.2 MB -> ",(0,o.kt)("strong",{parentName:"p"},"233 kB")),(0,o.kt)("h3",{id:"lazy-loading"},"Lazy Loading"),(0,o.kt)("p",null,"A bonus tip is to add the ",(0,o.kt)("inlineCode",{parentName:"p"},'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:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-html"},'\n alt text\n \n')),(0,o.kt)("h2",{id:"new-codecs"},"New Codecs"),(0,o.kt)("p",null,"If you desire further improvement, it may be time to consider using a newer codec like ",(0,o.kt)("a",{parentName:"p",href:"/docs/images/AVIF"},"AVIF")," or ",(0,o.kt)("a",{parentName:"p",href:"/docs/images/JXL"},"JPEG-XL"),". These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider ",(0,o.kt)("a",{parentName:"p",href:"/docs/images/WebP"},"WebP")," or ",(0,o.kt)("a",{parentName:"p",href:"/docs/images/HEIC"},"HEIC"),", since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering ",(0,o.kt)("em",{parentName:"p"},"lossy")," compression for ",(0,o.kt)("em",{parentName:"p"},"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."),(0,o.kt)("h3",{id:"fallbacks"},"Fallbacks"),(0,o.kt)("p",null,"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:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-html"},'\n \n \n \n alt text\n \n')),(0,o.kt)("p",null,"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."),(0,o.kt)("h3",{id:"compression-efficacy"},"Compression Efficacy"),(0,o.kt)("p",null,"Let's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with ",(0,o.kt)("inlineCode",{parentName:"p"},"cjpegli")," (which scores ~",(0,o.kt)("inlineCode",{parentName:"p"},"83.01")," with the ",(0,o.kt)("a",{parentName:"p",href:"/docs/metrics/SSIMULACRA2"},"SSIMULACRA2")," visual fidelity metric)."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"smaller_jxl",src:i(8559).Z})),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"137.0 kB")," ",(0,o.kt)("em",{parentName:"p"},"JPEG-XL image, encoded with ",(0,o.kt)("inlineCode",{parentName:"em"},"cjxl lossless.png out.jxl -d 1.49 -e 9"),". Score: ~",(0,o.kt)("inlineCode",{parentName:"em"},"83.04"))," ",(0,o.kt)("em",{parentName:"p"},"3.06s user time")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"smaller_avif",src:i(9593).Z})),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"124.8 kB")," ",(0,o.kt)("em",{parentName:"p"},"AVIF image, encoded with ",(0,o.kt)("inlineCode",{parentName:"em"},"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif"),". Score: ~",(0,o.kt)("inlineCode",{parentName:"em"},"83.03"))," ",(0,o.kt)("em",{parentName:"p"},"7.54s user time")),(0,o.kt)("p",null,"JXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the ",(0,o.kt)("inlineCode",{parentName:"p"},"ssimulacra2")," program decodes JPEG & JXL. Either way, the scores are fairly close."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"smaller_jxl_jpeg-recomp",src:i(8657).Z})),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"189.4 kB")," ",(0,o.kt)("em",{parentName:"p"},"JPEG-XL image from JPEG, encoded with ",(0,o.kt)("inlineCode",{parentName:"em"},"cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11"),". Score: ~",(0,o.kt)("inlineCode",{parentName:"em"},"84.92")," (???)")," ",(0,o.kt)("em",{parentName:"p"},"0.67s user time")),(0,o.kt)("p",null,"The final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with ",(0,o.kt)("inlineCode",{parentName:"p"},"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)."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"smaller_jpeg_xyb",src:i(4837).Z,width:"1699",height:"1136"})),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"208.3 kB")," ",(0,o.kt)("em",{parentName:"p"},"XYB JPEG, encoded with ",(0,o.kt)("inlineCode",{parentName:"em"},"cjpegli lossless.png out.jpg --xyb -d 1.155"),". Score: ~",(0,o.kt)("inlineCode",{parentName:"em"},"83.04"))," ",(0,o.kt)("em",{parentName:"p"},"0.10s user time")),(0,o.kt)("p",null,"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."),(0,o.kt)("h2",{id:"responsive-images"},"Responsive Images"),(0,o.kt)("p",null,"Displaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the ",(0,o.kt)("a",{parentName:"p",href:"https://ausi.github.io/respimagelint/"},"Responsive Image Linter")," that can help us figure out which image sizes we should be using."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"responsive_image_linter",src:i(1778).Z})),(0,o.kt)("p",null,"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:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-html"},'\n\u2003\u2003\n\u2003\u2003\n\u2003\u2003alt text\n\n')),(0,o.kt)("p",null,"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:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"srcset")," = the images available to your browser to serve, & their respective widths"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"sizes")," = the conditions given to the browser explaining under what conditions should it serve which image"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"(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."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"calc(100vw - 24px)")," = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have ",(0,o.kt)("inlineCode",{parentName:"li"},"(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.")),(0,o.kt)("picture",null,"\u2003\u2003",(0,o.kt)("source",{type:"image/jxl",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jxl 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jxl 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jxl 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jxl 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jxl 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),"\u2003\u2003",(0,o.kt)("source",{type:"image/avif",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.avif 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.avif 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.avif 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.avif 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.avif 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),"\u2003\u2003",(0,o.kt)("img",{loading:"lazy",width:"1699",height:"1136",alt:"alt text",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jpg 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jpg 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jpg 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jpg 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jpg 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)",src:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/_DSC8466-smaller.jpg"})),(0,o.kt)("p",null,"That's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their ",(0,o.kt)("a",{parentName:"p",href:"https://autocompressor.net/blog/reduce-image-load"},"Reduce Your Page's Image Load")," blog post when writing this entry. I have ",(0,o.kt)("a",{parentName:"p",href:"https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI"},"confirmed")," with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0."))}h.isMDXComponent=!0},8657:(e,t,i)=>{i.d(t,{Z:()=>a});const a=i.p+"assets/images/_DSC8466-smaller-recomp-f3af6d54a8c1c62cda0c2d3ba048e1fc.jxl"},4837:(e,t,i)=>{i.d(t,{Z:()=>a});const a=i.p+"assets/images/_DSC8466-smaller-xyb-0372077e225cf7b460ec9238bb2a65f9.jpg"},9593:(e,t,i)=>{i.d(t,{Z:()=>a});const a=i.p+"assets/images/_DSC8466-smaller-452ed8f5a33da727be398450e7e580a3.avif"},2918:(e,t,i)=>{i.d(t,{Z:()=>a});const a=i.p+"assets/images/_DSC8466-smaller-48eaf650a417558ea976bf40eee82f67.jpg"},8559:(e,t,i)=>{i.d(t,{Z:()=>a});const a=i.p+"assets/images/_DSC8466-smaller-492a0639fb771671738062a57b2015a2.jxl"},6039:(e,t,i)=>{i.d(t,{Z:()=>a});const a=i.p+"assets/images/_DSC8466-d51a7e87bed86d101412ba728ebc6be2.jpg"},6440:(e,t,i)=>{i.d(t,{Z:()=>a});const a=i.p+"assets/images/box-size-mac-f49e702b0cb4a531f65283ad604d4b4c.avif"},1778:(e,t,i)=>{i.d(t,{Z:()=>a});const a=i.p+"assets/images/responsive_image_linter-178eb56c12557c53a2b129dd75925fe9.avif"}}]); \ No newline at end of file diff --git a/assets/js/b4bbde8e.1d4f31e3.js b/assets/js/b4bbde8e.1d4f31e3.js new file mode 100644 index 000000000..10cf1d947 --- /dev/null +++ b/assets/js/b4bbde8e.1d4f31e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6037],{6823:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var n=o(5893),t=o(1151);const r={label:"AAC",sidebar_position:1},a="AAC",s={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:",source:"@site/docs/audio/AAC.mdx",sourceDirName:"audio",slug:"/audio/AAC",permalink:"/docs/audio/AAC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/AAC.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"AAC",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"High Dynamic Range",permalink:"/docs/introduction/high-dynamic-range"},next:{title:"Opus",permalink:"/docs/audio/Opus"}},c={},l=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"AAC-LC",id:"aac-lc",level:3},{value:"AAC-LD & AAC-ELD",id:"aac-ld--aac-eld",level:3},{value:"HE-AAC",id:"he-aac",level:3},{value:"HE-AACv2",id:"he-aacv2",level:3},{value:"xHE-AAC",id:"xhe-aac",level:3},{value:"Encoders",id:"encoders",level:2},{value:"Fraunhofer FDK AAC",id:"fraunhofer-fdk-aac",level:3},{value:"Core Audio",id:"core-audio",level:3},{value:"FFmpeg AAC",id:"ffmpeg-aac",level:3},{value:"FAAC",id:"faac",level:3},{value:"Nero AAC",id:"nero-aac",level:3},{value:"Exhale",id:"exhale",level:3},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"aac",children:"AAC"}),"\n",(0,n.jsx)(i.p,{children:"AAC, or Advanced Audio Coding, is an umbrella for a number of different codecs. When people refer to AAC, they are often referring to the commonly used AAC-LC profile developed as part of the original AAC standard in 1997 (although there is a distinction between this version of AAC-LC, called MPEG-2 AAC, & MPEG-4 AAC which is newer). However, there are a number of other variants that have been created over time. These include:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"AAC-LC (low-complexity AAC)"}),"\n",(0,n.jsx)(i.li,{children:"AAC-LD (low delay AAC)"}),"\n",(0,n.jsx)(i.li,{children:"AAC-ELD (enhanced low delay AAC)"}),"\n",(0,n.jsx)(i.li,{children:"HE-AAC (high efficiency AAC, uses Spectral Band Replication)"}),"\n",(0,n.jsx)(i.li,{children:"HE-AACv2 (high efficiency AAC v2, uses Spectral Band Replication + Parametric Stereo)"}),"\n",(0,n.jsx)(i.li,{children:"xHE-AAC (extended high efficiency AAC (kinda), uses USAC (Unified Speech & Audio Coding))"}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"AAC is even used as a Bluetooth audio codec for encoding audio streams & sending them to a Bluetooth audio device. Encoding & even decoding some of the above formats can prove to be difficult, so it is worth exploring each codec individually."}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsx)(i.p,{children:"Let's explore each codec individually."}),"\n",(0,n.jsx)(i.h3,{id:"aac-lc",children:"AAC-LC"}),"\n",(0,n.jsx)(i.p,{children:'While AAC-LC was introduced alongside two higher complexity profiles (AAC Main & AAC-SSR), AAC-LC has seen much more widespread adoption through various distribution mediums for video (often paired with AVC video) & audio alike. AAC-LC is ubiquitous within the Apple ecosystem & was (& still is) used on YouTube before their switch to primarily using Opus. Encoding AAC-LC can be done with relative ease, accessible through nearly every encoder in the "Encoders" section.'}),"\n",(0,n.jsx)(i.h3,{id:"aac-ld--aac-eld",children:"AAC-LD & AAC-ELD"}),"\n",(0,n.jsx)(i.p,{children:"AAC-LD & AAC-ELD are both designed to transmit audio in instances where latency is very important. Both are far more efficient than previous low-latency audio coding offerings. Over AAC-LD, AAC-ELD offers better audio quality through Spectral Band Replication, lower latency, & a greater quality range with a lower bitrate minimum & higher maximum."}),"\n",(0,n.jsx)(i.h3,{id:"he-aac",children:"HE-AAC"}),"\n",(0,n.jsx)(i.p,{children:"High Efficiency AAC introduces Spectral Band Replication (SBR) to the AAC specification for the purpose of higher quality audio at lower bitrates. SBR is an encoding technique that allows the decoder to reconstruct higher frequencies from an audio signal given lower frequencies & data that informs the decoder about information in the higher frequencies, allowing them to be effectively restored from this helper data. In short, lower frequencies are encoded with extra detail incorporated to allow the reconstruction of higher frequency information in an audio signal. This feature alone allows HE-AAC to be much more efficient than AAC-LC at lower bitrates; the gap closes substantially at higher bitrates, however."}),"\n",(0,n.jsx)(i.h3,{id:"he-aacv2",children:"HE-AACv2"}),"\n",(0,n.jsx)(i.p,{children:"High Efficiency AAC v2 introduces Parametric Stereo (PS), which further increases audio quality with an emphasis on lower bitrates. PS uses a mono signal downmixed from a multichannel stereo input alongside information about the spatial properties of the stereo input to allow the decoder to reconstruct a left & right channel using salient spatial data from the mono signal. HE-AACv2 combine PS with SBR for greater efficiency gains over HE-AAC & AAC-LC, although again the gap closes at higher bitrates."}),"\n",(0,n.jsx)(i.h3,{id:"xhe-aac",children:"xHE-AAC"}),"\n",(0,n.jsxs)(i.p,{children:["Extended High Efficiency AAC is actually slightly different from xHE-AAC. While Extended High Efficiency AAC specifically includes all of HE-AACv2's coding techniques as well as compression techniques from the USAC specification, the Extended High Efficiency AAC profile was designed in such a manner that building an encoder for the format would allow it to be perfectly backwards compatible with past variations of AAC. xHE-AAC is a codec that combines the Extended High Efficiency AAC profile with further USAC coding techniques, specifically within the ",(0,n.jsx)(i.em,{children:"MPEG-D DRC Loudness Control Profile"}),". For all intents and purposes, when someone refers to \"USAC audio,\" they probably mean xHE-AAC. xHE-AAC further extends performance at lower bitrates compared to past variants of AAC. USAC's specialty & purpose was to create an audio codec that didn't compromise music performance for speech & vice versa, but rather automatically tuned its coding technique selection to perform the best on any given source."]}),"\n",(0,n.jsx)(i.p,{children:"xHE-AAC is not widely supported. On a Mac, playback is only possible through QuickTime Player & other utilities which use CoreAudio for decoding. Windows 11 & Android support xHE-AAC natively, but Windows 10 & Linux will not allow you to play it back without some grief. The most effective way currently is to use an AAC plugin with foobar2000, although this plugin is 32-bit only, so you'll need 32-bit foobar2000. This works on Linux under WINE."}),"\n",(0,n.jsx)(i.h2,{id:"encoders",children:"Encoders"}),"\n",(0,n.jsx)(i.p,{children:"There are a number of ways to encode each format, which I'll outline below."}),"\n",(0,n.jsx)(i.h3,{id:"fraunhofer-fdk-aac",children:"Fraunhofer FDK AAC"}),"\n",(0,n.jsxs)(i.p,{children:["Fraunhofer FDK AAC is a high quality, open-source AAC encoder by ",(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Fraunhofer_Society",children:"Fraunhofer IIS"}),". It was introduced with the release of Android 4.1 and has since been forked to a ",(0,n.jsx)(i.a,{href:"https://github.com/mstorsjo/fdk-aac",children:"seperate repository"}),". Issues regarding the legality of its distribution have arisen since the Free Software Foundation declared the license incompatible with the GPL. The license does not grant the user rights to the patented technologies used in the source code, and therefore restricts its use. However, this topic is still debated as Debian does not consider FDK AAC free software while Red Hat does."]}),"\n",(0,n.jsx)(i.p,{children:"Another similar tool, FhG-AAC, performs similarly to FDK-AAC but with greater precision as it performs floating point operations. It can be used through the proprietary Windows media player Winamp."}),"\n",(0,n.jsxs)(i.p,{children:["FDK-AAC can encode the following formats:\n",(0,n.jsx)(i.code,{children:"AAC-LC AAC-LD AAC-ELD HE-AAC HE-AACv2"})]}),"\n",(0,n.jsx)(i.h3,{id:"core-audio",children:"Core Audio"}),"\n",(0,n.jsxs)(i.p,{children:["Apple's proprietary Core Audio Toolbox encoder is a popular, high-quality choice for encoding AAC. This encoder can be used in macOS via Apple's own ",(0,n.jsx)(i.code,{children:"afconvert"})," utility, or in FFmpeg by specifying ",(0,n.jsx)(i.code,{children:"aac_at"})," as the audio encoder. Windows users can also take advantage of Core Audio by using the free ",(0,n.jsx)(i.a,{href:"https://github.com/nu774/qaac",children:"qaac"})," command-line utility, but users will need to either have ",(0,n.jsx)(i.a,{href:"https://support.apple.com/en-ca/HT210384",children:"iTunes"})," installed, or extract the libraries from said installer, using the ",(0,n.jsx)(i.a,{href:"https://github.com/nu774/makeportable",children:"makeportable"})," script."]}),"\n",(0,n.jsxs)(i.p,{children:["Core Audio can encode the following formats: ",(0,n.jsx)(i.code,{children:"AAC-LC, HE-AAC, HE-AACv2"}),"*"]}),"\n",(0,n.jsxs)(i.p,{children:["*",(0,n.jsx)(i.code,{children:"HE-AACv2"})," encoding is only supported on macOS."]}),"\n",(0,n.jsx)(i.h3,{id:"ffmpeg-aac",children:"FFmpeg AAC"}),"\n",(0,n.jsx)(i.p,{children:"FFmpeg's native AAC encoder is known for being completely free & open source, licensed under the GNU General Public License (or LGPL, depending on how FFmpeg is configured). If you want a completely FOSS solution for encoding AAC, FFmpeg AAC is one of the only places you'll find this. It is not known for being particularly feature rich or high quality & doesn't support the entire profile of the AAC variants it can encode, but it gets the job done in most scenarios."}),"\n",(0,n.jsxs)(i.p,{children:["FFmpeg's AAC encoder can be called with a simple ",(0,n.jsx)(i.code,{children:"-c:a aac"})," parameter, but there are more granular options available. By default, the profile is ",(0,n.jsx)(i.code,{children:"aac_low"})," which encodes MPEG-4 AAC-LC. The ",(0,n.jsx)(i.code,{children:"mpeg2_aac_low"})," profile encodes simpler, lower-quality MPEG-2 AAC from 1997, while ",(0,n.jsx)(i.code,{children:"aac_main"})," encodes the more obscure main AAC profile from the 1997 MPEG-2 specification. Finally, ",(0,n.jsx)(i.code,{children:"aac-ltp"})," encodes AAC long-term prediction introduced in MPEG-4."]}),"\n",(0,n.jsxs)(i.p,{children:["Using FFmpeg AAC, we can encode the following formats:\n",(0,n.jsx)(i.code,{children:"AAC-LC"})]}),"\n",(0,n.jsx)(i.h3,{id:"faac",children:"FAAC"}),"\n",(0,n.jsxs)(i.p,{children:["FAAC is an old AAC encoder, name meaning Freeware Advanced Audio Coder. It is one of the lower quality options, & isn't recommended for general use. It only supports ",(0,n.jsx)(i.code,{children:"AAC-LC"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:"nero-aac",children:"Nero AAC"}),"\n",(0,n.jsx)(i.p,{children:"The discontinued Nero AAC audio coder had its last release in 2010. The developer of FAAC worked on Nero AAC, & the Nero AAC encoder & decoder are proprietary. Nero AAC was known to produce decent quality output while it was maintained, although development has since stalled."}),"\n",(0,n.jsxs)(i.p,{children:["Nero AAC can encode the following formats:\n",(0,n.jsx)(i.code,{children:"AAC-LC, HE-AAC, HE-AACv2"})]}),"\n",(0,n.jsx)(i.h3,{id:"exhale",children:"Exhale"}),"\n",(0,n.jsx)(i.p,{children:"Exhale is the only encoder on this list capable of encoding xHE-AAC audio. While it does not excel at this task compared to proprietary competition, there isn't really a straightforward way to encode xHE-AAC outside of using exhale on most platforms right now. Given that fact, it is the only xHE-AAC encoder many can consider using due to the lack of real competition. It can encode Extended HE-AAC audio with or without eSBR, although encoding using eSBR produces higher quality results."}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"exhale"})," can encode the following formats:\n",(0,n.jsx)(i.code,{children:"xHE-AAC"})]}),"\n",(0,n.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(i.p,{children:"Alternatives to AAC include Opus, Vorbis, MP3, & FLAC, among others."}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Vorbis & MP3 are considered to be worse, although Vorbis has its moments & is entirely royalty-free unlike AAC."}),"\n",(0,n.jsx)(i.li,{children:"FLAC is a lossless audio codec with an entirely different use case. It is important to reinforce that lossy audio codecs are not replacements for lossless, as good as they might get."}),"\n",(0,n.jsxs)(i.li,{children:["Opus is competitive with HE-AACv2 & xHE-AAC moreso than the older, worse variants, & is widely supported as well as royalty free. The open source reference encoder ",(0,n.jsx)(i.code,{children:"opusenc"})," is an excellent implementation of the format & the tooling is much easier to use compared to AAC's frankly nightmarish assortment of various options with numerous individual downsides. xHE-AAC is generally better than Opus, especially at lower bitrates, which is a fact that merits consideration."]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},1151:(e,i,o)=>{o.d(i,{Z:()=>s,a:()=>a});var n=o(7294);const t={},r=n.createContext(t);function a(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b59b8cf7.3cc432a8.js b/assets/js/b59b8cf7.3cc432a8.js new file mode 100644 index 000000000..100922b6d --- /dev/null +++ b/assets/js/b59b8cf7.3cc432a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3562],{824:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var i=t(5893),n=t(1151);const s={label:"Vorbis",sidebar_position:5},r="Vorbis",a={id:"audio/Vorbis",title:"Vorbis",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/Vorbis.mdx",sourceDirName:"audio",slug:"/audio/Vorbis",permalink:"/docs/audio/Vorbis",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Vorbis.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"Vorbis",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"MP3",permalink:"/docs/audio/MP3"},next:{title:"Speex",permalink:"/docs/audio/Speex"}},c={},d=[];function u(e){const o={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h1,{id:"vorbis",children:"Vorbis"}),"\n",(0,i.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsxs)(o.p,{children:["Vorbis is an open-source audio codec that has seen great success in its usage by Spotify, among others. It is the default audio codec for Minecraft's sounds & music. It has largely been replaced by ",(0,i.jsx)(o.a,{href:"/docs/audio/Opus",children:"Opus"}),"."]})]})}function l(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var i=t(7294);const n={},s=i.createContext(n);function r(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b8af02bf.8b5dd9d8.js b/assets/js/b8af02bf.8b5dd9d8.js new file mode 100644 index 000000000..d05612cd5 --- /dev/null +++ b/assets/js/b8af02bf.8b5dd9d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3679],{3914:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=t(5893),n=t(1151);const s={label:"JPEG 2000",sidebar_position:5},a="JPEG 2000",r={id:"images/JPEG2000",title:"JPEG 2000",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/JPEG2000.mdx",sourceDirName:"images",slug:"/images/JPEG2000",permalink:"/docs/images/JPEG2000",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG2000.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"JPEG 2000",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"WebP",permalink:"/docs/images/WebP"},next:{title:"AVIF",permalink:"/docs/images/AVIF"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h1,{id:"jpeg-2000",children:"JPEG 2000"}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(i.p,{children:'JPEG-2000 is an older image compression format that uses wavelet technology to achieve high compression ratios while maintaining image quality. It supports both lossy and lossless compression, and is commonly used in applications such as digital photography, medical imaging, and video surveillance. JPEG-2000 files can be transparently compressed and decompressed using a variety of software tools and libraries, making it a flexible and widely-supported format for image storage & transmission. JPEG-2000 never effectively took off on the Web, but digital cinema distribution is often done with JPEG-2000. A "DCP" is a "Digital Cinema Package," which is a format used to distribute and play back digital movies in theaters. These DCPs are often compressed losslessly with JPEG-2000.'})]})}function u(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>r,a:()=>a});var o=t(7294);const n={},s=o.createContext(n);function a(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b994ae50.4aa06432.js b/assets/js/b994ae50.4aa06432.js deleted file mode 100644 index cebcce527..000000000 --- a/assets/js/b994ae50.4aa06432.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4416],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,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({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=u(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,s=c(e,["components","mdxType","originalType","parentName"]),l=u(r),f=o,b=l["".concat(p,".").concat(f)]||l[f]||d[f]||i;return r?n.createElement(b,a(a({ref:t},s),{},{components:r})):n.createElement(b,a({ref:t},s))}));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 u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={label:"Speex",sidebar_position:6},a="Speex",c={unversionedId:"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!",source:"@site/docs/audio/Speex.md",sourceDirName:"audio",slug:"/audio/Speex",permalink:"/docs/audio/Speex",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Speex.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"Speex",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Vorbis",permalink:"/docs/audio/Vorbis"},next:{title:"FLAC",permalink:"/docs/audio/FLAC"}},p={},u=[],s={toc:u},l="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(l,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"speex"},"Speex"),(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,"Speex is an open-source audio codec designed for speech. It has largely been replaced by ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/Opus"},"Opus"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b9f079c2.4b4eff1e.js b/assets/js/b9f079c2.4b4eff1e.js deleted file mode 100644 index 17cff628c..000000000 --- a/assets/js/b9f079c2.4b4eff1e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5226],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var d=r.createContext({}),p=function(e){var t=r.useContext(d),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},l=function(e){var t=p(e.components);return r.createElement(d.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,d=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),s=p(n),f=o,m=s["".concat(d,".").concat(f)]||s[f]||u[f]||i;return n?r.createElement(m,a(a({ref:t},l),{},{components:n})):r.createElement(m,a({ref:t},l))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=f;var c={};for(var d in t)hasOwnProperty.call(t,d)&&(c[d]=t[d]);c.originalType=e,c[s]="string"==typeof e?e:o,a[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var r=n(7462),o=(n(7294),n(3905));const i={label:"VC-1",sidebar_position:8},a="VC-1",c={unversionedId:"video/VC-1",id:"video/VC-1",title:"VC-1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VC-1.md",sourceDirName:"video",slug:"/video/VC-1",permalink:"/docs/video/VC-1",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VC-1.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{label:"VC-1",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"AVS3",permalink:"/docs/video/AVS3"},next:{title:"Theora",permalink:"/docs/video/Theora"}},d={},p=[{value:"Encoding",id:"encoding",level:2},{value:"Decoding",id:"decoding",level:2}],l={toc:p},s="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(s,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"vc-1"},"VC-1"),(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,"VC-1 is video codec created by Microsoft and released in 2006. It largely aimed to compete with ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AVC"},"AVC"),"."),(0,o.kt)("h2",{id:"encoding"},"Encoding"),(0,o.kt)("p",null,"VC-1 can be contained in ",(0,o.kt)("inlineCode",{parentName:"p"},".mp4"),", ",(0,o.kt)("inlineCode",{parentName:"p"},".mkv"),", and ",(0,o.kt)("inlineCode",{parentName:"p"},".avi")," containers.\nTo be filled"),(0,o.kt)("h2",{id:"decoding"},"Decoding"),(0,o.kt)("p",null,"VC-1 can be decoded by ",(0,o.kt)("a",{parentName:"p",href:"/docs/utilities/ffmpeg"},"FFmpeg"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/video-players"},"VLC"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/video-players"},"MPV"),", and any device that supports blu-ray."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bc8b8418.997835b3.js b/assets/js/bc8b8418.997835b3.js deleted file mode 100644 index d5b558fef..000000000 --- a/assets/js/bc8b8418.997835b3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4704],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var o=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 o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function n(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var l=o.createContext({}),c=function(e){var t=o.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):n(n({},t),e)),a},d=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),m=c(a),p=i,h=m["".concat(l,".").concat(p)]||m[p]||u[p]||r;return a?o.createElement(h,n(n({ref:t},d),{},{components:a})):o.createElement(h,n({ref:t},d))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,n=new Array(r);n[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:i,n[1]=s;for(var c=2;c{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>n,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var o=a(7462),i=(a(7294),a(3905));const r={title:"Terminology",sidebar_position:2},n="Terminology",s={unversionedId:"introduction/terminology",id:"introduction/terminology",title:"Terminology",description:"When learning about encoding technology, it is important to understand the vast terminology that is often used to describe concepts that are often not very complex to understand.",source:"@site/docs/introduction/terminology.md",sourceDirName:"introduction",slug:"/introduction/terminology",permalink:"/docs/introduction/terminology",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/terminology.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Terminology",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Prologue",permalink:"/docs/introduction/prologue"},next:{title:"Spotting Video Artifacts",permalink:"/docs/introduction/video-artifacts"}},l={},c=[{value:"Bitstream",id:"bitstream",level:2},{value:"Lossy / Lossless",id:"lossy--lossless",level:2},{value:"Elementary stream",id:"elementary-stream",level:2},{value:"Muxing",id:"muxing",level:2},{value:"Codec",id:"codec",level:2},{value:"Filter",id:"filter",level:2},{value:"Muxer/Demuxer",id:"muxerdemuxer",level:2},{value:"Bitstream filter",id:"bitstream-filter",level:2},{value:"Container",id:"container",level:2},{value:"MP4 / M4V",id:"mp4--m4v",level:4},{value:"MOV",id:"mov",level:4},{value:"MKV / MKA / MKS / MK3D",id:"mkv--mka--mks--mk3d",level:4},{value:"WebM",id:"webm",level:4},{value:"Transcoding",id:"transcoding",level:2},{value:"RDO",id:"rdo",level:2},{value:"Perceputal / Psychovisual / Psychoacoustic",id:"perceputal--psychovisual--psychoacoustic",level:2},{value:"Discrete Cosine Transform (DCT)",id:"discrete-cosine-transform-dct",level:2}],d={toc:c},m="wrapper";function u(e){let{components:t,...a}=e;return(0,i.kt)(m,(0,o.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"terminology"},"Terminology"),(0,i.kt)("p",null,"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."),(0,i.kt)("h2",{id:"bitstream"},"Bitstream"),(0,i.kt)("p",null,"A ",(0,i.kt)("em",{parentName:"p"},"bitstream")," or ",(0,i.kt)("em",{parentName:"p"},"bit stream")," is a media file, the kind that is played in a media player. It consists of a ",(0,i.kt)("a",{parentName:"p",href:"#container"},"container")," wrapping multiple ",(0,i.kt)("a",{parentName:"p",href:"#elementary-stream"},"elementary streams")),(0,i.kt)("h2",{id:"lossy--lossless"},"Lossy / Lossless"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Lossy")," encoding throws out some of the detail to achieve a smaller size. Often, this is an acceptable trade-off, but if you need a perfect recreation of the data, you need ",(0,i.kt)("em",{parentName:"p"},"lossless")," encoding."),(0,i.kt)("h2",{id:"elementary-stream"},"Elementary stream"),(0,i.kt)("p",null,"An elementary stream is an audio, video, or subtitle track. Basically, it's the compressed data you want to ",(0,i.kt)("a",{parentName:"p",href:"#muxing"},"mux")," into the container."),(0,i.kt)("h2",{id:"muxing"},"Muxing"),(0,i.kt)("p",null,"Putting elementary streams into a container, which preserves them without making any changes to the data."),(0,i.kt)("h2",{id:"codec"},"Codec"),(0,i.kt)("p",null,"A codec (",(0,i.kt)("strong",{parentName:"p"},"co"),"der/",(0,i.kt)("strong",{parentName:"p"},"dec"),"oder) is the piece of code that actually encodes the data you put in. It takes as input and produces as output an elementary stream. More information is provided ",(0,i.kt)("a",{parentName:"p",href:"/docs/introduction/prologue/#what-is-a-codec"},"in the prologue"),"."),(0,i.kt)("h2",{id:"filter"},"Filter"),(0,i.kt)("p",null,"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."),(0,i.kt)("h2",{id:"muxerdemuxer"},"Muxer/Demuxer"),(0,i.kt)("p",null,"The pieces of code that ",(0,i.kt)("a",{parentName:"p",href:"#muxing"},"mux")," or do the reverse, getting elementary streams from the container."),(0,i.kt)("h2",{id:"bitstream-filter"},"Bitstream filter"),(0,i.kt)("p",null,"A bitstream filter is a filter that is directly applied to the ",(0,i.kt)("a",{parentName:"p",href:"#bitstream"},"bitstream")," in order to change something about the container, for instance, convert frame types, or corrupt some packets."),(0,i.kt)("h2",{id:"container"},"Container"),(0,i.kt)("p",null,"A container is a format for putting one or more elementary streams into one file, which is then called a ",(0,i.kt)("a",{parentName:"p",href:"#bitstream"},"bitstream"),"."),(0,i.kt)("p",null,'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.'),(0,i.kt)("p",null,"Some kinds of containers:"),(0,i.kt)("h4",{id:"mp4--m4v"},"MP4 / M4V"),(0,i.kt)("p",null,"This is likely the most common container you've encountered, & has near universal compatibility. Has a limited maximum amount of streams. The supported video codecs are ",(0,i.kt)("a",{parentName:"p",href:"/docs/video/AVC"},"H.264"),", ",(0,i.kt)("a",{parentName:"p",href:"/docs/video/HEVC"},"H.265"),", ",(0,i.kt)("a",{parentName:"p",href:"/docs/video/VVC"},"H.266"),", DivX, Xvid, ",(0,i.kt)("a",{parentName:"p",href:"/docs/video/VP9"},"VP9")," (Unofficial, hacky), and ",(0,i.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"AV1")," (Unofficial, hacky). For audio codecs it's many of the various flavors of ",(0,i.kt)("a",{parentName:"p",href:"/docs/audio/AAC"},"AAC"),", ",(0,i.kt)("a",{parentName:"p",href:"/docs/audio/MP3"},"MP3"),", ",(0,i.kt)("a",{parentName:"p",href:"/docs/audio/FLAC"},"FLAC")," (Unofficial), ",(0,i.kt)("a",{parentName:"p",href:"/docs/audio/Opus"},"Opus")," (Unofficial, hacky). For subtitles only MPEG-4 Timed Text (TTXT) is supported."),(0,i.kt)("p",null,"The best tool to work with this container is MP4Box, but FFmpeg also works."),(0,i.kt)("h4",{id:"mov"},"MOV"),(0,i.kt)("p",null,"Similar to MP4, but less supported. Made with Apple Quicktime in mind, supports ProRes."),(0,i.kt)("h4",{id:"mkv--mka--mks--mk3d"},"MKV / MKA / MKS / MK3D"),(0,i.kt)("p",null,"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."),(0,i.kt)("h4",{id:"webm"},"WebM"),(0,i.kt)("p",null,"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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/subtitles/webvtt"},"WebVTT")," for subtitles."),(0,i.kt)("h2",{id:"transcoding"},"Transcoding"),(0,i.kt)("p",null,"Taking an elementary stream & converting it to another format, lossless or lossy, using an encoder of some kind. For example, if I convert a lossless ",(0,i.kt)("a",{parentName:"p",href:"/docs/video/FFV1"},"FFV1")," video to lossy AV1 using an encoder, let's say ",(0,i.kt)("a",{parentName:"p",href:"/docs/encoders/rav1e"},"rav1e"),", I have ",(0,i.kt)("em",{parentName:"p"},"transcoded")," this lossless video to AV1. Transcoding doesn't have anything to do with the container."),(0,i.kt)("h2",{id:"rdo"},"RDO"),(0,i.kt)("p",null,"RDO, or Rate-Distortion Optimization, is a technique used to find the best trade-off between the bit rate & the quality of lossily encoded content. RDO can be metric-based, optimizing to score well on metrics like ",(0,i.kt)("a",{parentName:"p",href:"/docs/metrics/PSNR"},"PSNR")," or ",(0,i.kt)("a",{parentName:"p",href:"/docs/metrics/SSIM"},"SSIM"),"."),(0,i.kt)("h2",{id:"perceputal--psychovisual--psychoacoustic"},"Perceputal / Psychovisual / Psychoacoustic"),(0,i.kt)("p",null,'"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 ',(0,i.kt)("a",{parentName:"p",href:"/docs/metrics/SSIMULACRA2"},"SSIMULACRA2")," & ",(0,i.kt)("a",{parentName:"p",href:"/docs/metrics/butteraugli"},"Butteraugli"),"."),(0,i.kt)("h2",{id:"discrete-cosine-transform-dct"},"Discrete Cosine Transform (DCT)"),(0,i.kt)("p",null,"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."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bd173b27.db007963.js b/assets/js/bd173b27.db007963.js new file mode 100644 index 000000000..dcc1f6e7c --- /dev/null +++ b/assets/js/bd173b27.db007963.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9134],{1230:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var o=i(5893),n=i(1151);const s={label:"xz",sidebar_position:5},r="XZ",a={id:"data/xz",title:"XZ",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/xz.mdx",sourceDirName:"data",slug:"/data/xz",permalink:"/docs/data/xz",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/xz.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{label:"xz",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"7-zip (7z)",permalink:"/docs/data/7z"},next:{title:"Brotli",permalink:"/docs/data/brotli"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"xz",children:"XZ"}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(t.p,{children:["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.jsx)(t.a,{href:"/docs/data/7z",children:"7-zip"})," to increase the resulting archive's compression ratio."]}),"\n",(0,o.jsx)(t.p,{children:"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."}),"\n",(0,o.jsx)(t.p,{children:"XZ is more widely supported when compared to other data compression formats, seeing support across iOS, macOS, and many Linux distributions by default. To decompress & compress XZ on Windows, you will likely need the 7-Zip archive utility."})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var o=i(7294);const n={},s=o.createContext(n);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bda40bca.711d5bb3.js b/assets/js/bda40bca.711d5bb3.js deleted file mode 100644 index 8c5e20b07..000000000 --- a/assets/js/bda40bca.711d5bb3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[918],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=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 o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),f=i,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||o;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[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:i,a[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(7462),i=(n(7294),n(3905));const o={label:"Vapoursynth",sidebar_position:2},a="Vapoursynth",l={unversionedId:"filtering/vapoursynth",id:"filtering/vapoursynth",title:"Vapoursynth",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/filtering/vapoursynth.md",sourceDirName:"filtering",slug:"/filtering/vapoursynth",permalink:"/docs/filtering/vapoursynth",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/vapoursynth.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"Vapoursynth",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Deband",permalink:"/docs/filtering/deband"},next:{title:"Deinterlace",permalink:"/docs/filtering/deinterlace"}},s={},c=[{value:"Installation",id:"installation",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"vapoursynth"},"Vapoursynth"),(0,i.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,i.kt)("picture",null,(0,i.kt)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/vs_edit_script.avif?token=GHSAT0AAAAAACEZPDXJ6SHSUQIMUOGQXQTEZHY7K4A",type:"image/avif"}),(0,i.kt)("img",{src:"https://autumn.revolt.chat/attachments/g7DucEq3aRGWVH0MHQe-A21GkyDVln9IHzRlfjEYEh/vs_edit_script.png",alt:"Vapoursynth script",width:"520",height:"632"})),(0,i.kt)("p",null,'"VapourSynth is an application for video manipulation. Or a plugin. Or a library. It\u2019s hard to tell because it has a core library written in C++ and a Python module to allow video scripts to be created."'),(0,i.kt)("p",null,"-- Fredrik Mellbin, creator of VapourSynth"),(0,i.kt)("h2",{id:"installation"},"Installation"),(0,i.kt)("h3",{id:"microsoft-windows"},"Microsoft Windows"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"At the current time of writing, Python 3.11 is required. This will change in the future so consult from ",(0,i.kt)("a",{parentName:"li",href:"http://www.vapoursynth.com/doc/installation.html"},"their website")),(0,i.kt)("li",{parentName:"ul"},"Download the installer (",(0,i.kt)("inlineCode",{parentName:"li"},".exe"),") unless you have a reason for using portable"),(0,i.kt)("li",{parentName:"ul"},"Install it")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/be236901.ccbbc935.js b/assets/js/be236901.ccbbc935.js new file mode 100644 index 000000000..3abbdb4c6 --- /dev/null +++ b/assets/js/be236901.ccbbc935.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8261],{2016:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>a});var t=i(5893),o=i(1151);const s={title:"Contribution Guide",sidebar_label:"\u2712\ufe0f Contribution Guide",sidebar_position:13},r="Contribution Guide",l={id:"contribution-guide",title:"Contribution Guide",description:"Codec Wiki - community-maintained wiki for all things encoding.",source:"@site/docs/contribution-guide.mdx",sourceDirName:".",slug:"/contribution-guide",permalink:"/docs/contribution-guide",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/contribution-guide.mdx",tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"Contribution Guide",sidebar_label:"\u2712\ufe0f Contribution Guide",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"\ud83d\uddc3\ufe0f Resources",permalink:"/docs/resources"},next:{title:"\u2753 FAQ",permalink:"/docs/FAQ"}},c={},a=[{value:"Before You Contribute",id:"before-you-contribute",level:2},{value:"Connect With Us",id:"connect-with-us",level:3},{value:"Clone & Push Instructions",id:"clone--push-instructions",level:2},{value:"Website",id:"website",level:2},{value:"Installation",id:"installation",level:3},{value:"Local Development",id:"local-development",level:3},{value:"Build",id:"build",level:3},{value:"Deployment",id:"deployment",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"contribution-guide",children:"Contribution Guide"}),"\n",(0,t.jsx)(n.p,{children:"Codec Wiki - community-maintained wiki for all things encoding."}),"\n",(0,t.jsx)(n.h2,{id:"before-you-contribute",children:"Before You Contribute"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"By contributing to the Codec Wiki, you are communicating that you have read & agreed to our Terms & Conditions, Privacy Policy, & Code of Conduct."}),"\n",(0,t.jsx)(n.li,{children:"Ensure your understanding of the material you're contributing is sufficient to a point where it is useful to the project. It is perfectly acceptable not to get everything right the first time, but always double-check your contributions for factual correctness."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Our current priority is filling out the existing pages with content. Please assist in doing this, if possible, before considering adding new pages."})}),"\n",(0,t.jsx)(n.p,{children:"If you're unsure the content in your entry is completely correct or you believe your entry needs review, please attach the following message at the top of your entry:"}),"\n",(0,t.jsx)(n.admonition,{title:"Pending Review",type:"caution",children:(0,t.jsx)(n.p,{children:"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information."})}),"\n",(0,t.jsx)(n.p,{children:"If you're aware your entry is too short or incomplete, please add the following message to the top of your entry:"}),"\n",(0,t.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsx)(n.p,{children:"If you've added a new page & you aren't sure what should go there (this isn't recommended while there are still so many empty pages to be filled), add the following message as your page entry:"}),"\n",(0,t.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsx)(n.h3,{id:"connect-with-us",children:"Connect With Us"}),"\n",(0,t.jsx)(n.p,{children:'If you\'d like to join the "AV1 for Dummies" Discord server to communicate with other passionate contributors helping this project, please join using the widget below:'}),"\n",(0,t.jsx)("iframe",{src:"https://discord.com/widget?id=1163724583472472138&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, we have a (soon to be) bridged Revolt server linked ",(0,t.jsx)(n.a,{href:"https://rvlt.gg/eSERRhSG",children:"right here"}),". Revolt is an open-source Discord alternative, which you can read more about on ",(0,t.jsx)(n.a,{href:"https://github.com/revoltchat/legal/blob/master/About.mdx#communication-is-critical",children:"this page"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"clone--push-instructions",children:"Clone & Push Instructions"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Make sure to clone from & edit the"})," ",(0,t.jsx)(n.code,{children:"main"})," ",(0,t.jsx)(n.strong,{children:"branch only, & push your final changes to the"})," ",(0,t.jsx)(n.code,{children:"deployment"})," ",(0,t.jsx)(n.strong,{children:"branch according to the instructions below. Also be sure to use node 18 LTS, as later versions tend to be troublesome."})]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"don't forget to add unimportant files to the .gitignore before making any commits"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Clone from the ",(0,t.jsx)(n.code,{children:"main"})," branch to start to make a contribution:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"% git clone git@github.com:av1-community-contributors/av1-wiki.github.io.git -b main\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"Test your changes locally before making a commit:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"% yarn\n% npx docusaurus start\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsxs)(n.li,{children:["Push changes to ",(0,t.jsx)(n.code,{children:"main"})," branch:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'% git add .\n% git commit -m "Commit Message"\n% git push -u origin main\n'})}),"\n",(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsxs)(n.li,{children:["Deploy to ",(0,t.jsx)(n.code,{children:"deployment"})," branch to make live on site:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"% GIT_USER= DEPLOYMENT_BRANCH=deployment yarn deploy\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Docusaurus Info"})}),"\n",(0,t.jsx)(n.h2,{id:"website",children:"Website"}),"\n",(0,t.jsxs)(n.p,{children:["This website is built using ",(0,t.jsx)(n.a,{href:"https://docusaurus.io/",children:"Docusaurus 2"}),", a modern static website generator."]}),"\n",(0,t.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ yarn\n"})}),"\n",(0,t.jsx)(n.h3,{id:"local-development",children:"Local Development"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ yarn start\n"})}),"\n",(0,t.jsx)(n.p,{children:"This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server."}),"\n",(0,t.jsx)(n.h3,{id:"build",children:"Build"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ yarn build\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This command generates static content into the ",(0,t.jsx)(n.code,{children:"build"})," directory and can be served using any static contents hosting service."]}),"\n",(0,t.jsx)(n.h3,{id:"deployment",children:"Deployment"}),"\n",(0,t.jsx)(n.p,{children:"See the initial instructions at the top."})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>r});var t=i(7294);const o={},s=t.createContext(o);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bf9d09b6.ddfb0719.js b/assets/js/bf9d09b6.ddfb0719.js new file mode 100644 index 000000000..72599a531 --- /dev/null +++ b/assets/js/bf9d09b6.ddfb0719.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4953],{5471:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=n(5893),i=n(1151);const r={title:"SVT-HEVC",sidebar_position:7},s="SVT-HEVC",c={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!",source:"@site/docs/encoders/SVT-HEVC.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-HEVC.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"SVT-HEVC",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Kvazaar",permalink:"/docs/encoders/Kvazaar"},next:{title:"SVT-VP9",permalink:"/docs/encoders/SVT-VP9"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"svt-hevc",children:"SVT-HEVC"}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>s});var o=n(7294);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c177ddec.92d78069.js b/assets/js/c177ddec.92d78069.js deleted file mode 100644 index ad5e5f569..000000000 --- a/assets/js/c177ddec.92d78069.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9060],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});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 o(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 l(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},m=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={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,o=e.originalType,s=e.parentName,m=r(e,["components","mdxType","originalType","parentName"]),d=p(n),c=i,h=d["".concat(s,".").concat(c)]||d[c]||u[c]||o;return n?a.createElement(h,l(l({ref:t},m),{},{components:n})):a.createElement(h,l({ref:t},m))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,l=new Array(o);l[0]=c;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r[d]="string"==typeof e?e:i,l[1]=r;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>p});var a=n(7462),i=(n(7294),n(3905));const o={title:"aomenc",sidebar_position:3},l="aomenc",r={unversionedId:"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.",source:"@site/docs/encoders/aomenc.md",sourceDirName:"encoders",slug:"/encoders/aomenc",permalink:"/docs/encoders/aomenc",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aomenc.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"aomenc",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"x265",permalink:"/docs/encoders/x265"},next:{title:"vpxenc",permalink:"/docs/encoders/vpxenc"}},s={},p=[{value:"Choosing forks",id:"choosing-forks",level:2},{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:3},{value:"MacOS",id:"macos",level:3},{value:"Linux",id:"linux",level:3},{value:"Usage",id:"usage",level:2},{value:"AV1 Encoding",id:"av1-encoding",level:3},{value:"AVIF Encoding",id:"avif-encoding",level:3},{value:"Recommendations",id:"recommendations",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}],m={toc:p},d="wrapper";function u(e){let{components:t,...n}=e;return(0,i.kt)(d,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"aomenc"},"aomenc"),(0,i.kt)("p",null,"aomenc or ",(0,i.kt)("strong",{parentName:"p"},"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."),(0,i.kt)("h2",{id:"choosing-forks"},"Choosing forks"),(0,i.kt)("p",null,"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 ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/BlueSwordM/aom-av1-psy"},"aom-av1-psy")," which was created by BlueSwordM. ",(0,i.kt)("strong",{parentName:"p"},"But it is no longer maintained as of 13th January 2023"),", another fork called ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/Clybius/aom-av1-lavish"},"aom-av1-lavish")," was then created off of it by Clybius to continue on the legacy."),(0,i.kt)("p",null,"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. "),(0,i.kt)("p",null,"TL;DR use ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/Clybius/aom-av1-lavish"},"aom-av1-lavish"),"."),(0,i.kt)("h2",{id:"ffmpeg"},"FFmpeg"),(0,i.kt)("p",null,"aomenc is available in FFmpeg via ",(0,i.kt)("inlineCode",{parentName:"p"},"libaom-av1"),", check if you have it by running ",(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -h encoder=libaom-av1"),". You can input non-FFmpeg standard aomenc parameters via ",(0,i.kt)("inlineCode",{parentName:"p"},"-aom-params"),"."),(0,i.kt)("admonition",{title:"Mainline aomenc",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"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.")),(0,i.kt)("h2",{id:"installation"},"Installation"),(0,i.kt)("h3",{id:"microsoft-windows"},"Microsoft Windows"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"The Easy Way:")," Download the pre-built versions, which can be found below (Current as of Sept 6, 2023):"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28"},"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28")),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Join the ",(0,i.kt)("a",{parentName:"p",href:"https://discord.gg/vpREHAvYvh"},"AV1 Discord server")," and head to #community-builds for updated versions, you can opt to compile it yourself with the instructions below.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"The Compiling Route:")),(0,i.kt)("admonition",{title:"Credits",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Full credits to u/Turbulent-Bend-7416 on Reddit for ",(0,i.kt)("a",{parentName:"p",href:"https://www.reddit.com/r/AV1/comments/s6eh5f/how_to_compile_av1_in_windows_without_crying"},"this post")," on how to compile aomenc.")),(0,i.kt)("p",null,"This guide requires ",(0,i.kt)("strong",{parentName:"p"},"MSYS2"),", specifically ",(0,i.kt)("strong",{parentName:"p"},"MinGW-W64"),". Install it if you haven't yet."),(0,i.kt)("p",null,"First, install the required dependencies:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"pacman -S cmake git perl yasm nasm python3 doxygen mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel\n")),(0,i.kt)("p",null,"Now, clone the aom-av1-lavish repo in the Endless_Merging branch and create the folders:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n")),(0,i.kt)("p",null,"Then we can start compiling with some build optimizations for your CPU:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n')),(0,i.kt)("p",null,"The resulting binary will be available within your home folder of the location where you installed MSYS2 (usually ",(0,i.kt)("inlineCode",{parentName:"p"},"C:"),"), navigate there and the to the aom-av1-lavish folder and it should be there."),(0,i.kt)("p",null,'Built files should be in the "Debug" folder'),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"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.")),(0,i.kt)("h3",{id:"macos"},"MacOS"),(0,i.kt)("p",null,"macOS is very similar to Linux. Note that some commands may have to be run with ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo"),", which I won't explicitly include for security reasons."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Homebrew")),(0,i.kt)("p",null,"Installing the Homebrew package manager is a well documented process at this point:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n')),(0,i.kt)("p",null,"Installing mainline libaom is as simple as running the following:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"brew update && brew upgrade\nbrew install aom\n")),(0,i.kt)("p",null,"FFmpeg can also be installed via brew."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Building From Source")),(0,i.kt)("p",null,"If you want aom-av1-lavish instead of mainline, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"macOS sometimes doesn't have a ",(0,i.kt)("inlineCode",{parentName:"li"},"/usr/local/bin")," by default. You can fix this by doing ",(0,i.kt)("inlineCode",{parentName:"li"},"mkdir /usr/local/bin"),"."),(0,i.kt)("li",{parentName:"ul"},"Homebrew installs ",(0,i.kt)("em",{parentName:"li"},"everything")," in its own directory structure. If you're building things from source that rely on libraries from libvmaf, libjxl, etc, make sure to copy them from ",(0,i.kt)("inlineCode",{parentName:"li"},"/opt/homebrew/lib")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"/usr/local/lib"),". Finding them is a matter of ",(0,i.kt)("inlineCode",{parentName:"li"},'ls | grep "keyword"')," & copying what looks reasonable to be associated with the tool you're using."),(0,i.kt)("li",{parentName:"ul"},"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.")),(0,i.kt)("p",null,"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch, which contains all of the latest lavish improvements:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n")),(0,i.kt)("p",null,"Now, you need to make some manual changes to the source code until ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files"},"this commit")," is merged to fix build errors."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Add the line ",(0,i.kt)("inlineCode",{parentName:"li"},'#include "aq_variance.h"')," at line 19 in ",(0,i.kt)("inlineCode",{parentName:"li"},"av1/encoder/encodeframe_utils.c")),(0,i.kt)("li",{parentName:"ul"},"Comment out line 2546 in ",(0,i.kt)("inlineCode",{parentName:"li"},"av1/encoder/speed_features.c"),". This line is ",(0,i.kt)("inlineCode",{parentName:"li"},"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };")," & becomes ",(0,i.kt)("inlineCode",{parentName:"li"},"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"),".")),(0,i.kt)("p",null,"Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools. While still in the ",(0,i.kt)("inlineCode",{parentName:"p"},"aom-av1-lavish")," directory:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root. If it doesn\'t work properly, you can always copy the binary into /usr/local/bin manually:\nmake install\n')),(0,i.kt)("p",null,"Now you can run ",(0,i.kt)("inlineCode",{parentName:"p"},'aomenc --help | grep "AOMedia" -C 3')," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,i.kt)("inlineCode",{parentName:"p"},"aomenc")," executable to ",(0,i.kt)("inlineCode",{parentName:"p"},"/opt/local/bin"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"/usr/local/bin"),", & ",(0,i.kt)("inlineCode",{parentName:"p"},"/opt/homebrew/bin")," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n")),(0,i.kt)("p",null,"Notice how it says ",(0,i.kt)("inlineCode",{parentName:"p"},"AOMedia Project AV1 Encoder Psy")," instead of ",(0,i.kt)("inlineCode",{parentName:"p"},"AOMedia Project AV1 Encoder"),". You should be all set after this to start using aom-av1-lavish."),(0,i.kt)("h3",{id:"linux"},"Linux"),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Compiling aom-av1-lavish, all-in-one-command:")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\nsudo make install\n')),(0,i.kt)("h2",{id:"usage"},"Usage"),(0,i.kt)("h3",{id:"av1-encoding"},"AV1 Encoding"),(0,i.kt)("p",null,"Simple Y4M input with CQ 22, 1 pass, and raw ",(0,i.kt)("inlineCode",{parentName:"p"},".ivf")," bitstream output:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"aomenc --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf input.y4m\n")),(0,i.kt)("p",null,"Pipe from FFmpeg:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf\n")),(0,i.kt)("p",null,"Pipe from FFmpeg, 2-pass:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=1 --fpf-log=aom-pass.log --ivf -o output.ivf\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=2 --fpf-log=aom-pass.log --ivf -o output.ivf\n")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"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.")),(0,i.kt)("h3",{id:"avif-encoding"},"AVIF Encoding"),(0,i.kt)("p",null,"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:"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif")),(0,i.kt)("p",null,"Where:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-c aom")," is the encoder"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-s 4")," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-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."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-d 10")," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8-bit source image."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-y 444")," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"cq-level=16")," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,i.kt)("inlineCode",{parentName:"li"},"-a")," because it is an aomenc option, not an avifenc one."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"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.")),(0,i.kt)("h2",{id:"recommendations"},"Recommendations"),(0,i.kt)("p",null,"aomenc unfortunately lacks the ability to take advantage of multiple threads, so therefore a tool like ",(0,i.kt)("a",{parentName:"p",href:"/docs/utilities/Av1an"},"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."),(0,i.kt)("p",null,"Here are some recommended parameters:"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"--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")),(0,i.kt)("p",null,"Now let's break it down shall we."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--bit-depth=10")," We're using 10bit because it makes the video smaller and reduces banding.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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).")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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):"),(0,i.kt)("picture",null,(0,i.kt)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,i.kt)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",width:"1280",height:"768",loading:"lazy"})))),(0,i.kt)("admonition",{title:"Tile usage",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"Do NOT use tiles for 1080p and below, use 1 ",(0,i.kt)("inlineCode",{parentName:"p"},"tile-columns")," at 1440p (2K), 2 ",(0,i.kt)("inlineCode",{parentName:"p"},"tile-columns")," and 1 ",(0,i.kt)("inlineCode",{parentName:"p"},"tile-rows")," for 2160p (4K)")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--lag-in-frames=64")," Knockoff of x264/x265 ",(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Group_of_pictures"},"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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--tune-content=psy --tune=ssim")," As the name suggests they are tunes that affect the video output, for the better, and for the worst."),(0,i.kt)("admonition",{parentName:"li",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Do not use ",(0,i.kt)("inlineCode",{parentName:"p"},"tune-content=psy")," if you encode live action above ",(0,i.kt)("inlineCode",{parentName:"p"},"cq-level=30"),".")),(0,i.kt)("admonition",{parentName:"li",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you use any of the VMAF tunes, you need to specify ",(0,i.kt)("inlineCode",{parentName:"p"},"--vmaf-model-path=")," to where you put VMAF models in."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--sb-size=dynamic")," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--deltaq-mode=0")," set to 0 b its better")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1")," Parameters that give you free efficiency boost, ignore it.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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).")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"--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."),(0,i.kt)("admonition",{parentName:"li",title:"Alternative",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"You can use photon noise tables as an alternative, which is also conveniently available in Av1an as ",(0,i.kt)("inlineCode",{parentName:"p"},"--photon-noise=X"))))),(0,i.kt)("h2",{id:"tips--tricks"},"Tips & Tricks"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Use ",(0,i.kt)("inlineCode",{parentName:"li"},"--butteraugli-resize-factor=2")," if you use any of the butteraugli-based tunes to speed it up without much losses (lavish, butteraugli) and ",(0,i.kt)("inlineCode",{parentName:"li"},"--butteraugli-intensity-target=250")," to match the content light level."),(0,i.kt)("li",{parentName:"ol"},"Use ",(0,i.kt)("inlineCode",{parentName:"li"},"--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.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c224274c.28466f19.js b/assets/js/c224274c.28466f19.js new file mode 100644 index 000000000..8dfcbcc73 --- /dev/null +++ b/assets/js/c224274c.28466f19.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7764],{8402:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=o(5893),i=o(1151);const s={label:"AVS3",sidebar_position:7},r="AVS3",c={id:"video/AVS3",title:"AVS3",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/AVS3.mdx",sourceDirName:"video",slug:"/video/AVS3",permalink:"/docs/video/AVS3",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/AVS3.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"AVS3",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AV1",permalink:"/docs/video/AV1"},next:{title:"VC-1",permalink:"/docs/video/VC-1"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"avs3",children:"AVS3"}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>c,a:()=>r});var n=o(7294);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.532a21ca.js b/assets/js/c4f5d8e4.532a21ca.js new file mode 100644 index 000000000..3ae075078 --- /dev/null +++ b/assets/js/c4f5d8e4.532a21ca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4195],{9294:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(7294);var s=n(6010),r=n(9960),i=n(2263),o=n(179);const c={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};var a=n(5893);function l(){const{siteConfig:e}=(0,i.Z)();return(0,a.jsx)("header",{className:(0,s.Z)("hero hero--primary",c.heroBanner),children:(0,a.jsxs)("div",{className:"container",children:[(0,a.jsx)("h1",{className:"hero__title",children:e.title}),(0,a.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,a.jsx)("div",{className:c.buttons,children:(0,a.jsx)(r.Z,{className:"button button--secondary button--lg",to:"/docs/introduction/prologue",children:"Start learning!"})})]})})}function d(){const{siteConfig:e}=(0,i.Z)();return(0,a.jsx)(o.Z,{title:`${e.title}`,description:`${e.tagline}`,children:(0,a.jsx)(l,{})})}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.ae5bf3de.js b/assets/js/c4f5d8e4.ae5bf3de.js deleted file mode 100644 index 3db303487..000000000 --- a/assets/js/c4f5d8e4.ae5bf3de.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4195],{9294:(e,t,n)=>{n.r(t),n.d(t,{default:()=>u});var a=n(7294),r=n(6010),o=n(9960),c=n(2263),l=n(7961);const s={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function i(){const{siteConfig:e}=(0,c.Z)();return a.createElement("header",{className:(0,r.Z)("hero hero--primary",s.heroBanner)},a.createElement("div",{className:"container"},a.createElement("h1",{className:"hero__title"},e.title),a.createElement("p",{className:"hero__subtitle"},e.tagline),a.createElement("div",{className:s.buttons},a.createElement(o.Z,{className:"button button--secondary button--lg",to:"/docs/introduction/prologue"},"Start learning!"))))}function u(){const{siteConfig:e}=(0,c.Z)();return a.createElement(l.Z,{title:`${e.title}`,description:`${e.tagline}`},a.createElement(i,null))}}}]); \ No newline at end of file diff --git a/assets/js/c7deb2e0.de25a251.js b/assets/js/c7deb2e0.de25a251.js new file mode 100644 index 000000000..05a13d856 --- /dev/null +++ b/assets/js/c7deb2e0.de25a251.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6855],{1705:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var i=t(5893),n=t(1151);const s={label:"WavPack",sidebar_position:8},a="WavPack",r={id:"audio/WavPack",title:"WavPack",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/WavPack.mdx",sourceDirName:"audio",slug:"/audio/WavPack",permalink:"/docs/audio/WavPack",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/WavPack.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{label:"WavPack",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"FLAC",permalink:"/docs/audio/FLAC"},next:{title:"H.264",permalink:"/docs/video/AVC"}},c={},d=[];function u(e){const o={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h1,{id:"wavpack",children:"WavPack"}),"\n",(0,i.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsx)(o.p,{children:"WavPack is an open-source lossless audio codec with support for lossless & lossy compression with a unique hybrid compression mode for compressing a lossy audio stream alongside a lossless reference."})]})}function l(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>r,a:()=>a});var i=t(7294);const n={},s=i.createContext(n);function a(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c8fc782b.82f54a91.js b/assets/js/c8fc782b.82f54a91.js deleted file mode 100644 index bf5da0686..000000000 --- a/assets/js/c8fc782b.82f54a91.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5335],{3905:(e,t,o)=>{o.d(t,{Zo:()=>d,kt:()=>m});var r=o(7294);function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function n(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function a(e){for(var t=1;t=0||(i[o]=e[o]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o])}return i}var s=r.createContext({}),u=function(e){var t=r.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):a(a({},t),e)),o},d=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},l="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var o=e.components,i=e.mdxType,n=e.originalType,s=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),l=u(o),f=i,m=l["".concat(s,".").concat(f)]||l[f]||p[f]||n;return o?r.createElement(m,a(a({ref:t},d),{},{components:o})):r.createElement(m,a({ref:t},d))}));function m(e,t){var o=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=o.length,a=new Array(n);a[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[l]="string"==typeof e?e:i,a[1]=c;for(var u=2;u{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>p,frontMatter:()=>n,metadata:()=>c,toc:()=>u});var r=o(7462),i=(o(7294),o(3905));const n={label:"UT Video",sidebar_position:13},a="UT Video Codec Suite",c={unversionedId:"video/utvideo",id:"video/utvideo",title:"UT Video Codec Suite",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/utvideo.md",sourceDirName:"video",slug:"/video/utvideo",permalink:"/docs/video/utvideo",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/utvideo.md",tags:[],version:"current",sidebarPosition:13,frontMatter:{label:"UT Video",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"FFV1",permalink:"/docs/video/FFV1"},next:{title:"ProRes",permalink:"/docs/video/prores"}},s={},u=[],d={toc:u},l="wrapper";function p(e){let{components:t,...o}=e;return(0,i.kt)(l,(0,r.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"ut-video-codec-suite"},"UT Video Codec Suite"),(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,"UT Video Codec Suite is a fast, lossless video codec, developed by Takeshi Umezawa (\u6885\u6fa4 \u5a01\u5fd7, Umezawa Takeshi) and released under the free GNU General Public License. The algorithm of UT video is based on the Huffman code."),(0,i.kt)("p",null,"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)."),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"There are various predction modes, which can be used via ",(0,i.kt)("a",{parentName:"p",href:"/docs/utilities/ffmpeg"},"FFmpeg"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"no prediction employed"),(0,i.kt)("li",{parentName:"ul"},"left neighbour prediction (continuous for the whole slice)"),(0,i.kt)("li",{parentName:"ul"},"gradient prediction"),(0,i.kt)("li",{parentName:"ul"},"median prediction")),(0,i.kt)("p",null,"You can use FFmpeg to encode utvideo as follows:\n",(0,i.kt)("inlineCode",{parentName:"p"},"ffmpeg -i [input] -c:v utvideo -pred [0,1,2,3] [output]")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"References: ",(0,i.kt)("a",{parentName:"em",href:"https://en.wikipedia.org/wiki/Ut_Video_Codec_Suite"},"Wikipedia"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c92fe796.ab630276.js b/assets/js/c92fe796.ab630276.js new file mode 100644 index 000000000..2b661f28e --- /dev/null +++ b/assets/js/c92fe796.ab630276.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[268],{825:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>l});var n=t(5893),s=t(1151);const r={label:"ffmpeg",sidebar_position:11},o="FFmpeg",d={id:"utilities/ffmpeg",title:"FFmpeg",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/utilities/ffmpeg.mdx",sourceDirName:"utilities",slug:"/utilities/ffmpeg",permalink:"/docs/utilities/ffmpeg",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/ffmpeg.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{label:"ffmpeg",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"eac3to",permalink:"/docs/utilities/eac3to"},next:{title:"PSNR",permalink:"/docs/metrics/PSNR"}},c={},l=[{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}];function a(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",h4:"h4",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"//ffmpeg.org",children:"FFmpeg"})," is a multimedia framework that has utilities for transcoding, transmuxing, and filtering audio and video. It provides the ",(0,n.jsx)(i.code,{children:"ffmpeg"}),", ",(0,n.jsx)(i.code,{children:"ffprobe"}),", and ",(0,n.jsx)(i.code,{children:"ffplay"})," command-line utilities. It also features the libav* libraries, which allow you to use the functionality of FFmpeg without the programs."]}),"\n",(0,n.jsx)(i.h1,{id:"installation",children:"Installation"}),"\n",(0,n.jsx)(i.p,{children:"There are a number of ways to install FFmpeg depending on the operating system you're using."}),"\n",(0,n.jsx)(i.h3,{id:"linux--macos",children:"Linux & macOS"}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Package Manager"})}),"\n",(0,n.jsxs)(i.p,{children:["The easiest way to obtain FFmpeg is through your package manager. On most package managers, the package is simply named ",(0,n.jsx)(i.code,{children:"ffmpeg"}),", however ",(0,n.jsx)(i.code,{children:"ffprobe"})," and ",(0,n.jsx)(i.code,{children:"ffplay"})," may have their own packages. Note that the packages may be outdated."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Compiling from source"})}),"\n",(0,n.jsxs)(i.p,{children:["A more complete guide is available at the ",(0,n.jsx)(i.a,{href:"https://trac.ffmpeg.org/wiki/CompilationGuide",children:"FFmpeg Compilation Guide"}),". Simplifying things a bit, what you need to do is:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["grab ",(0,n.jsx)(i.a,{href:"https://ffmpeg.org/download.html",children:"the sources"})," or clone from FFmpeg's git: ",(0,n.jsx)(i.code,{children:"git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg"})]}),"\n",(0,n.jsxs)(i.li,{children:["Enter the directory & run ",(0,n.jsx)(i.code,{children:"./configure --help"})," to see a list of features and libraries you can choose to build with."]}),"\n",(0,n.jsx)(i.li,{children:"Install all libraries you want to build FFmpeg with."}),"\n",(0,n.jsxs)(i.li,{children:["Run ",(0,n.jsx)(i.code,{children:"./configure"})," with all ",(0,n.jsx)(i.code,{children:"--enable-"})," flags you want."]}),"\n",(0,n.jsxs)(i.li,{children:["Run ",(0,n.jsx)(i.code,{children:"make"}),", or ",(0,n.jsx)(i.code,{children:"make -j $(nproc)"})," on Linux to properly make use of multiple cores. on macOS, this would be ",(0,n.jsx)(i.code,{children:"make -j $(sysctl -n hw.ncpu)"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:["Run ",(0,n.jsx)(i.code,{children:"make install"}),". May require root."]}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,n.jsx)(i.p,{children:"To be filled."}),"\n",(0,n.jsx)(i.h1,{id:"using-ffmpeg",children:"Using FFmpeg"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"ffmpeg"})," is the primary command-line tool of FFmpeg. It takes 0 or more bitstreams as inputs & outputs."]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"ffmpeg"}),"'s command-line arguments are positional, meaning it matters where you put each option. Each input and output has its own arguments. For example, ",(0,n.jsx)(i.code,{children:"ffmpeg -r 24 -i file1 file2"})," applies the ",(0,n.jsx)(i.code,{children:"-r 24"})," option to the input ",(0,n.jsx)(i.code,{children:"file1"}),", interpreting the video as having that frame rate, while ",(0,n.jsx)(i.code,{children:"ffmpeg -i file1 -r 24 file2"})," applies the ",(0,n.jsx)(i.code,{children:"-r 24"})," option to ",(0,n.jsx)(i.code,{children:"file2"}),". To get a list of options, refer to the ",(0,n.jsx)(i.a,{href:"//ffmpeg.org/ffmpeg-all.html",children:"FFmpeg documentation"}),"."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Video Transcoding"})}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.code,{children:"ffmpeg -i input -c:v video_codec -b:v video_bitrate -c:a audio_codec -b:a audio_bitrate output"})}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Option"}),(0,n.jsx)(i.th,{children:"Meaning"})]})}),(0,n.jsxs)(i.tbody,{children:[(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"-c:v video_encoder"})}),(0,n.jsxs)(i.td,{children:[(0,n.jsx)(i.strong,{children:"c"}),"odec for the automatically selected ",(0,n.jsx)(i.strong,{children:"v"}),"ideo stream"]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"-b:v video_bitrate"})}),(0,n.jsxs)(i.td,{children:[(0,n.jsx)(i.strong,{children:"b"}),"itrate for the automatically selected ",(0,n.jsx)(i.strong,{children:"v"}),"ideo stream"]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"-c:a audio_codec"})}),(0,n.jsxs)(i.td,{children:[(0,n.jsx)(i.strong,{children:"c"}),"odec for the automatically selected ",(0,n.jsx)(i.strong,{children:"a"}),"udio stream"]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"-b:a audio_bitrate"})}),(0,n.jsxs)(i.td,{children:[(0,n.jsx)(i.strong,{children:"b"}),"itrate for the automatically selected ",(0,n.jsx)(i.strong,{children:"a"}),"udio stream"]})]})]})]}),"\n",(0,n.jsx)(i.h4,{id:"transmux-a-video",children:"Transmux a video"}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.code,{children:"ffmpeg -i input -c copy output"})}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Option"}),(0,n.jsx)(i.th,{children:"Meaning"})]})}),(0,n.jsx)(i.tbody,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"-c copy"})}),(0,n.jsxs)(i.td,{children:["set the ",(0,n.jsx)(i.strong,{children:"c"}),"odec to ",(0,n.jsx)(i.strong,{children:"copy"})]})]})})]}),"\n",(0,n.jsx)(i.h4,{id:"filter-a-video",children:"Filter a video"}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.code,{children:"ffmpeg -i input -c:v video_encoder -c:a audio_codec (...) -vf filter_name output"})}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Option"}),(0,n.jsx)(i.th,{children:"Meaning"})]})}),(0,n.jsx)(i.tbody,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"-vf filter_name"})}),(0,n.jsxs)(i.td,{children:["set the ",(0,n.jsx)(i.strong,{children:"v"}),"ideo ",(0,n.jsx)(i.strong,{children:"f"}),"ilter to ",(0,n.jsx)(i.strong,{children:"filter_name"})]})]})})]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.em,{children:"References:"}),"\n",(0,n.jsxs)(i.em,{children:["[^multimediawiki-howtos]: ",(0,n.jsx)(i.a,{href:"//wiki.multimedia.cx/index.php?search=HOWTO&title=Special%3ASearch&go=Go",children:"HOWTO Search Results - MultimediaWiki"})]})]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.em,{children:["Special thanks to ",(0,n.jsx)(i.a,{href:"https://encoding.bluefalcon.cc/",children:"bluefalcon's encoding guide"})," for this material, licensed under CC BY-SA 4.0. Our adaptation features formatting changes & content changes, specifically regarding the titles of some headings."]})})]})}function h(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>d,a:()=>o});var n=t(7294);const s={},r=n.createContext(s);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c943a24a.52252610.js b/assets/js/c943a24a.52252610.js new file mode 100644 index 000000000..847147b5e --- /dev/null +++ b/assets/js/c943a24a.52252610.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[665],{7142:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var t=n(5893),a=n(1151);const o={sidebar_position:6},s="High Dynamic Range",r={id:"introduction/high-dynamic-range",title:"High Dynamic Range",description:"HDR (High Dynamic Range) is a technology used in modern TVs and displays to produce more vibrant and lifelike images. In simple terms, it allows your TV to display a wider range of colors and brightness levels than standard displays. This means that you can see more details in both bright and dark areas of an image, which can make movies, TV shows, and video games look much more realistic.",source:"@site/docs/introduction/high-dynamic-range.mdx",sourceDirName:"introduction",slug:"/introduction/high-dynamic-range",permalink:"/docs/introduction/high-dynamic-range",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/high-dynamic-range.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Psycho-visual",permalink:"/docs/introduction/psychovisual"},next:{title:"AAC",permalink:"/docs/audio/AAC"}},d={},l=[{value:"HLG",id:"hlg",level:2},{value:"HDR10",id:"hdr10",level:2},{value:"HDR10+",id:"hdr10-1",level:2},{value:"Dolby Vision",id:"dolby-vision",level:2}];function c(e){const i={code:"code",h1:"h1",h2:"h2",p:"p",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"high-dynamic-range",children:"High Dynamic Range"}),"\n",(0,t.jsx)(i.p,{children:"HDR (High Dynamic Range) is a technology used in modern TVs and displays to produce more vibrant and lifelike images. In simple terms, it allows your TV to display a wider range of colors and brightness levels than standard displays. This means that you can see more details in both bright and dark areas of an image, which can make movies, TV shows, and video games look much more realistic."}),"\n",(0,t.jsx)(i.p,{children:"HDR10 works by using metadata that tells your TV how to display the content in the best way possible. This metadata includes information about the maximum brightness level and color gamut of the content, which allows your TV to adjust its settings to match the content being displayed. In other words, HDR10 helps your TV display images that are closer to what the content creators intended you to see, resulting in a more immersive viewing experience."}),"\n",(0,t.jsx)(i.p,{children:"\xa0\xa0"}),"\n",(0,t.jsx)(i.h2,{id:"hlg",children:"HLG"}),"\n",(0,t.jsx)(i.p,{children:"HLG (Hybrid log-gamma) is a type of HDR video format that was developed to optimize video for both standard dynamic range (SDR) and HDR displays, jointly developed by the BBC and NHK."}),"\n",(0,t.jsx)(i.p,{children:"To understand how HLG works, it's helpful to know that the way we perceive brightness and color in a video is different from how it's captured and displayed on a screen. Brightness and color information is usually captured in a logarithmic curve, while SDR displays typically reproduce the image with a gamma curve. HDR displays, on the other hand, reproduce the image with a different type of curve, known as the Perceptual Quantizer (PQ) curve."}),"\n",(0,t.jsx)(i.p,{children:"The HLG curve is a hybrid of these two curves, which means that it's optimized for both SDR and HDR displays. It's designed to work with a wider range of brightness levels than SDR displays, but also be backward compatible with SDR displays."}),"\n",(0,t.jsx)(i.p,{children:"In simpler terms, the HLG curve is a way of capturing and displaying video that works well on both SDR and HDR displays. It's like a bridge between the way video is captured and the way it's displayed, and it's designed to optimize the video for a wider range of brightness levels than traditional SDR video. The result is video content that looks more realistic and vivid on both SDR and HDR displays."}),"\n",(0,t.jsx)(i.p,{children:"\xa0\xa0"}),"\n",(0,t.jsx)(i.h2,{id:"hdr10",children:"HDR10"}),"\n",(0,t.jsx)(i.p,{children:"HDR10 is an open high-dynamic-range video (HDR) standard announced on 27 August 2015 by the Consumer Technology Association. It is the most widespread of the HDR formats. It only allows static metadata."}),"\n",(0,t.jsx)(i.p,{children:"\xa0\xa0"}),"\n",(0,t.jsx)(i.h2,{id:"hdr10-1",children:"HDR10+"}),"\n",(0,t.jsxs)(i.p,{children:["HDR10+ is basically an upgrade to the previous HDR10 by adding dynamic metadata support (in ",(0,t.jsx)(i.code,{children:".json"}),") to optimize each scene's content light level as the director intended."]}),"\n",(0,t.jsx)(i.p,{children:"\xa0\xa0"}),"\n",(0,t.jsx)(i.h2,{id:"dolby-vision",children:"Dolby Vision"}),"\n",(0,t.jsx)(i.p,{children:"Dolby Vision is proprietary HDR format developed by Dolby Laboratories and a direct competitor to HDR10+."})]})}function h(e={}){const{wrapper:i}={...(0,a.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>s});var t=n(7294);const a={},o=t.createContext(a);function s(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c9a80c62.f57d434c.js b/assets/js/c9a80c62.f57d434c.js deleted file mode 100644 index 047e297ef..000000000 --- a/assets/js/c9a80c62.f57d434c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6492],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=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 i(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 r(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=n.createContext({}),p=function(e){var t=n.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 n.createElement(l.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 a=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(a),m=o,h=u["".concat(l,".").concat(m)]||u[m]||d[m]||i;return a?n.createElement(h,r(r({ref:t},c),{},{components:a})):n.createElement(h,r({ref:t},c))}));function h(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=a.length,r=new Array(i);r[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var n=a(7462),o=(a(7294),a(3905));const i={label:"Opus",sidebar_position:2},r="Opus",s={unversionedId:"audio/Opus",id:"audio/Opus",title:"Opus",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/audio/Opus.md",sourceDirName:"audio",slug:"/audio/Opus",permalink:"/docs/audio/Opus",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Opus.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"Opus",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"AAC",permalink:"/docs/audio/AAC"},next:{title:"Dolby Digital",permalink:"/docs/audio/Dolby"}},l={},p=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"SILK",id:"silk",level:3},{value:"CELT",id:"celt",level:3},{value:"Encoders",id:"encoders",level:2},{value:"Opusenc",id:"opusenc",level:3},{value:"FFopus",id:"ffopus",level:3},{value:"vac-enc",id:"vac-enc",level:3}],c={toc:p},u="wrapper";function d(e){let{components:t,...a}=e;return(0,o.kt)(u,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"opus"},"Opus"),(0,o.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,o.kt)("p",null,"Opus is an open-source audio codec that has largely replaced ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/Vorbis"},"Vorbis")," as the standard open audio codec. It is the recommended codec for usage in WebM video containers in tandem with the ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/VP9"},"VP9")," or ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"AV1")," video codecs."),(0,o.kt)("p",null,"Opus is known for its incredible coding efficiency and unique multi-channel optimizations. Stereo Opus audio reaches ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Transparency_(data_compression)"},"transparency")," (psychoacoustically lossless audio quality) at 128kb/s, compared to ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/AAC"},"AAC"),"'s generally agreed upon 256kb/s and ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/MP3"},"MP3"),"'s 320kb/s. Transparency varies based on the type of content & the encoding implementation used, especially for codecs other than Opus, and the values provided above may be debated to a degree."),(0,o.kt)("p",null,"Opus is described on ",(0,o.kt)("a",{parentName:"p",href:"https://opus-codec.org/"},"opus-codec.org"),' as a "totally open, royalty-free, highly versatile audio codec. Opus is unmatched for interactive speech and music transmission over the Internet, but is also intended for storage and streaming applications. It is standardized by the Internet Engineering Task Force (IETF) as ',(0,o.kt)("a",{parentName:"p",href:"https://datatracker.ietf.org/doc/html/rfc6716"},"RFC 6716"),' which incorporated technology from Skype\u2019s SILK codec and Xiph.Org\u2019s CELT codec."'),(0,o.kt)("p",null,"Opus supports the following features:"),(0,o.kt)("blockquote",null,(0,o.kt)("ul",{parentName:"blockquote"},(0,o.kt)("li",{parentName:"ul"},"Bitrates from 6 kb/s to 510 kb/s"),(0,o.kt)("li",{parentName:"ul"},"Sampling rates from 8 kHz (narrowband) to 48 kHz (fullband)"),(0,o.kt)("li",{parentName:"ul"},"Frame sizes from 2.5 ms to 60 ms"),(0,o.kt)("li",{parentName:"ul"},"Support for both constant bitrate (CBR) and variable bitrate (VBR)"),(0,o.kt)("li",{parentName:"ul"},"Audio bandwidth from narrowband to fullband"),(0,o.kt)("li",{parentName:"ul"},"Support for speech and music"),(0,o.kt)("li",{parentName:"ul"},"Support for mono and stereo"),(0,o.kt)("li",{parentName:"ul"},"Support for up to 255 channels (multistream frames)"),(0,o.kt)("li",{parentName:"ul"},"Dynamically adjustable bitrate, audio bandwidth, and frame size"),(0,o.kt)("li",{parentName:"ul"},"Good loss robustness and packet loss concealment (PLC)"),(0,o.kt)("li",{parentName:"ul"},"Floating point and fixed-point implementation"))),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"via opus-codec.org"),"."),(0,o.kt)("h2",{id:"format-breakdown"},"Format Breakdown"),(0,o.kt)("p",null,"Opus is a hybrid audio codec, composed of two codecs as mentioned above. These are Skype's SILK codec for voice & Xiph.Org's CELT codec. Opus's initial name, Harmony, may have been because of the \"harmony\" of these two codecs and the musical connotation of harmony."),(0,o.kt)("h3",{id:"silk"},"SILK"),(0,o.kt)("p",null,"SILK, initially from Skype, was designed to be used for voice calls on Microsoft products like Skype. The first stable release of the codec was in 2009, and since then it has been freely licensed under the BSD 2-Clause license which has allowed for its adoption into Opus. The version of SILK used in Opus is substantially modified from - and not compatible with - the standalone SILK codec previously described here."),(0,o.kt)("p",null,"SILK is optimized for speech, and so has limited sample rates as follows:"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Narrowband: 3-4000hz\nMediumband: 3-6000hz\nWideband: 3-8000hz")),(0,o.kt)("p",null,"SILK's latency is 10 to 60ms based on the desired framesize + 5ms lookahead to estimate noise shaping + (potentially) 1.5ms sampling rate conversion overhead if the input audio needs to be resampled."),(0,o.kt)("h3",{id:"celt"},"CELT"),(0,o.kt)("p",null,'Much like SILK, CELT is under the BSD 2-Clause license. The preview release came out in 2011. CELT stands for "Code-Excited Lapped Transform" and was designed to be the true successor to Vorbis, even being dubbed as "Vorbis II" during its initial development as part og Xiph.Org\'s "Ghost" project in 2005.'),(0,o.kt)("p",null,"CELT was designed to be a full-band general purpose codec without a particular specialization for a certain kind of audio, making it distinctly different from Xiph's ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/Speex"},"Speex")," codec & more similar to Vorbis. It is computationally simple relative to competing codec technologies like ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/AAC"},"AAC")," & even Vorbis, enabling extremely low latency that is competitive with ",(0,o.kt)("a",{parentName:"p",href:"/docs/audio/AAC#aac-ld--aac-eld"},"AAC-LD"),"."),(0,o.kt)("p",null,"CELT can work with the following sample rates:"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Narrowband: 3-4000hz\nMediumband: 3-6000hz\nWideband: 3-8000hz\nSuperWideband: 3-12000hz\nFullband: 3-20000hz")),(0,o.kt)("h2",{id:"encoders"},"Encoders"),(0,o.kt)("h3",{id:"opusenc"},"Opusenc"),(0,o.kt)("p",null,"Opus's reference encoder is ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/xiph/opus"},"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."),(0,o.kt)("p",null,"Usage: ",(0,o.kt)("inlineCode",{parentName:"p"},"opusenc [options] input_file output_file.opus")),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--bitrate #.###")," Sets the overall target bitrate in kbit/s. Most encoders use ",(0,o.kt)("em",{parentName:"p"},"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.')),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--vbr")," Tells the encoder to encode using a variable bit rate, allocating more or less bits when necessary to preserve overall fidelity per bit. This is the best option for local storage & playback, and is ",(0,o.kt)("em",{parentName:"p"},"enabled by default."))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--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.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--hard-cbr")," Tells the encoder to use a constant bitrate the whole time.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--music")," & ",(0,o.kt)("inlineCode",{parentName:"p"},"--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.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--comp #")," Sets the encoder complexity to a value from 0 to 10, 0 being the least complex & 10 being the most. ",(0,o.kt)("em",{parentName:"p"},"The default is 10."))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--framesize #")," Sets the maximum encoder frame size in milliseconds. Lowering this is useful for improving latency at the expense of audio quality per bit. It is worth noting that 40 & 60ms framesizes are just multiple 20ms frames stitched together via opusenc's default behavior, and are not considered useful as they just lower the encoder's adaptability which can worsen both latency & coding efficiency. ",(0,o.kt)("em",{parentName:"p"},"The default value is 20."))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--expect-loss #")," Percentage value for expected packet loss. Not useful for local encoding & playback, but useful for real-time applications. ",(0,o.kt)("em",{parentName:"p"},"Default value is 0."))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--downmix-mono")," Downmixes multiple channels into a single channel.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--downmix-stereo")," Downmixes multiple channels into two channels, left & right, given more than two channels are provided to the encoder.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--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.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"--max-delay #")," Sets maximum container delay in milliseconds, from 0-1000. ",(0,o.kt)("em",{parentName:"p"},"Default is 1000.")))),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"An example opusenc command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'opusenc "input.wav" "output.opus" --bitrate 96\n')),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"/docs/utilities/ffmpeg"},"FFmpeg")," using libopus:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'ffmpeg -i "input.flac" -c:a libopus -b:a 128K "output.ogg"\n')),(0,o.kt)("p",null,"If you'd like to learn more about opusenc & its recommended default behavior, read this article on ",(0,o.kt)("a",{parentName:"p",href:"https://wiki.xiph.org/Opus_Recommended_Settings#Bandwidth_Transition_Thresholds"},"Opus Recommended Settings"),"."),(0,o.kt)("h3",{id:"ffopus"},"FFopus"),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"FFopus usage:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'ffmpeg -i "input.wma" -c:a opus -b:a 128K -strict -2 "output.opus"\n')),(0,o.kt)("h3",{id:"vac-enc"},"vac-enc"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/gianni-rosato/vac-enc"},"VAC"),", or Value Added Codec, is a libopus encoder that uses SoX to resample inputs & supports output to ",(0,o.kt)("inlineCode",{parentName:"p"},".ogg")," rather than exclusively ",(0,o.kt)("inlineCode",{parentName:"p"},".opus"),". Better resampling theoretically leads to better coding efficiency, but vac-enc hasn't been thoroughly tested."),(0,o.kt)("p",null,"Encoding a 16-bit signed little endian ",(0,o.kt)("inlineCode",{parentName:"p"},"pcm_s16le")," WAV to 128kbit/s Opus in an OGG container:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"vac-enc input.wav output.ogg 128\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.b58832c0.js b/assets/js/ccc49370.b58832c0.js deleted file mode 100644 index 582505571..000000000 --- a/assets/js/ccc49370.b58832c0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6103],{5203:(e,t,n)=>{n.r(t),n.d(t,{default:()=>h});var a=n(7294),l=n(6010),o=n(1944),r=n(5281),i=n(9460),c=n(9058),s=n(390),m=n(7462),d=n(5999),u=n(2244);function g(e){const{nextItem:t,prevItem:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,d.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"})},n&&a.createElement(u.Z,(0,m.Z)({},n,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post"},"Newer Post")})),t&&a.createElement(u.Z,(0,m.Z)({},t,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post"},"Older Post"),isNext:!0})))}function f(){const{assets:e,metadata:t}=(0,i.C)(),{title:n,description:l,date:r,tags:c,authors:s,frontMatter:m}=t,{keywords:d}=m,u=e.image??m.image;return a.createElement(o.d,{title:n,description:l,keywords:d,image:u},a.createElement("meta",{property:"og:type",content:"article"}),a.createElement("meta",{property:"article:published_time",content:r}),s.some((e=>e.url))&&a.createElement("meta",{property:"article:author",content:s.map((e=>e.url)).filter(Boolean).join(",")}),c.length>0&&a.createElement("meta",{property:"article:tag",content:c.map((e=>e.label)).join(",")}))}var v=n(9407);function p(e){let{sidebar:t,children:n}=e;const{metadata:l,toc:o}=(0,i.C)(),{nextItem:r,prevItem:m,frontMatter:d}=l,{hide_table_of_contents:u,toc_min_heading_level:f,toc_max_heading_level:p}=d;return a.createElement(c.Z,{sidebar:t,toc:!u&&o.length>0?a.createElement(v.Z,{toc:o,minHeadingLevel:f,maxHeadingLevel:p}):void 0},a.createElement(s.Z,null,n),(r||m)&&a.createElement(g,{nextItem:r,prevItem:m}))}function h(e){const t=e.content;return a.createElement(i.n,{content:e.content,isBlogPostPage:!0},a.createElement(o.FG,{className:(0,l.Z)(r.k.wrapper.blogPages,r.k.page.blogPostPage)},a.createElement(f,null),a.createElement(p,{sidebar:e.sidebar},a.createElement(t,null))))}},9407:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(7462),l=n(7294),o=n(6010),r=n(3743);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function m(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,o.Z)(i.tableOfContents,"thin-scrollbar",t)},l.createElement(r.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:s})))}},3743:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(7462),l=n(7294),o=n(6668);function r(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,l.useRef)(void 0),n=m();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:o,maxHeadingLevel:r}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:o,maxHeadingLevel:r}),c=s(i,{anchorTopOffset:n.current}),m=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:o}=e;return t.length?l.createElement("ul",{className:o?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const g=l.memo(u);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:m,maxHeadingLevel:u,...f}=e;const v=(0,o.L)(),p=m??v.tableOfContents.minHeadingLevel,h=u??v.tableOfContents.maxHeadingLevel,b=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>i({toc:r(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:h});return d((0,l.useMemo)((()=>{if(c&&s)return{linkClassName:c,linkActiveClassName:s,minHeadingLevel:p,maxHeadingLevel:h}}),[c,s,p,h])),l.createElement(g,(0,a.Z)({toc:b,className:n,linkClassName:c},f))}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.e949f01a.js b/assets/js/ccc49370.e949f01a.js new file mode 100644 index 000000000..5ed225712 --- /dev/null +++ b/assets/js/ccc49370.e949f01a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6103],{5203:(e,n,t)=>{t.r(n),t.d(n,{default:()=>p});t(7294);var i=t(6010),a=t(1944),s=t(5281),o=t(9460),l=t(1460),r=t(390),c=t(5999),d=t(2244),u=t(5893);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.Z,{...t,subLabel:(0,u.jsx)(c.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer Post"})}),n&&(0,u.jsx)(d.Z,{...n,subLabel:(0,u.jsx)(c.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older Post"}),isNext:!0})]})}function g(){const{assets:e,metadata:n}=(0,o.C)(),{title:t,description:i,date:s,tags:l,authors:r,frontMatter:c}=n,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.d,{title:t,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:s}),r.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:r.map((e=>e.url)).filter(Boolean).join(",")}),l.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:l.map((e=>e.label)).join(",")})]})}var h=t(9407),f=t(2212);function v(e){let{sidebar:n,children:t}=e;const{metadata:i,toc:a}=(0,o.C)(),{nextItem:s,prevItem:c,frontMatter:d,unlisted:g}=i,{hide_table_of_contents:v,toc_min_heading_level:p,toc_max_heading_level:x}=d;return(0,u.jsxs)(l.Z,{sidebar:n,toc:!v&&a.length>0?(0,u.jsx)(h.Z,{toc:a,minHeadingLevel:p,maxHeadingLevel:x}):void 0,children:[g&&(0,u.jsx)(f.Z,{}),(0,u.jsx)(r.Z,{children:t}),(s||c)&&(0,u.jsx)(m,{nextItem:s,prevItem:c})]})}function p(e){const n=e.content;return(0,u.jsx)(o.n,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.FG,{className:(0,i.Z)(s.k.wrapper.blogPages,s.k.page.blogPostPage),children:[(0,u.jsx)(g,{}),(0,u.jsx)(v,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},9407:(e,n,t)=>{t.d(n,{Z:()=>c});t(7294);var i=t(6010),a=t(3743);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var o=t(5893);const l="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,o.jsx)("div",{className:(0,i.Z)(s.tableOfContents,"thin-scrollbar",n),children:(0,o.jsx)(a.Z,{...t,linkClassName:l,linkActiveClassName:r})})}},3743:(e,n,t)=>{t.d(n,{Z:()=>f});var i=t(7294),a=t(6668);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function o(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=o({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function l(e){const n=e.getBoundingClientRect();return n.top===n.bottom?l(e.parentNode):n}function r(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>l(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:o}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),l=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:o}),c=r(l,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,t])}var u=t(9960),m=t(5893);function g(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.Z,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(g,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const h=i.memo(g);function f(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...g}=e;const f=(0,a.L)(),v=c??f.tableOfContents.minHeadingLevel,p=u??f.tableOfContents.maxHeadingLevel,x=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>o({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:v,maxHeadingLevel:p});return d((0,i.useMemo)((()=>{if(l&&r)return{linkClassName:l,linkActiveClassName:r,minHeadingLevel:v,maxHeadingLevel:p}}),[l,r,v,p])),(0,m.jsx)(h,{toc:x,className:t,linkClassName:l,...g})}},2212:(e,n,t)=>{t.d(n,{Z:()=>g});t(7294);var i=t(6010),a=t(5999),s=t(5742),o=t(5893);function l(){return(0,o.jsx)(a.Z,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,o.jsx)(a.Z,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,o.jsx)(s.Z,{children:(0,o.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(5281),u=t(9047);function m(e){let{className:n}=e;return(0,o.jsx)(u.Z,{type:"caution",title:(0,o.jsx)(l,{}),className:(0,i.Z)(n,d.k.common.unlistedBanner),children:(0,o.jsx)(r,{})})}function g(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(c,{}),(0,o.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/cce01883.1f11dc27.js b/assets/js/cce01883.1f11dc27.js deleted file mode 100644 index d4479749b..000000000 --- a/assets/js/cce01883.1f11dc27.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1606],{3905:(e,t,o)=>{o.d(t,{Zo:()=>d,kt:()=>A});var i=o(7294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,i)}return o}function r(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var s=i.createContext({}),c=function(e){var t=i.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):r(r({},t),e)),o},d=function(e){var t=c(e.components);return i.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},p=i.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=c(o),p=n,A=u["".concat(s,".").concat(p)]||u[p]||h[p]||a;return o?i.createElement(A,r(r({ref:t},d),{},{components:o})):i.createElement(A,r({ref:t},d))}));function A(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,r=new Array(a);r[0]=p;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,r[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var i=o(7462),n=(o(7294),o(3905));const a={label:"AAC",sidebar_position:1},r="AAC",l={unversionedId:"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:",source:"@site/docs/audio/AAC.md",sourceDirName:"audio",slug:"/audio/AAC",permalink:"/docs/audio/AAC",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/AAC.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"AAC",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"High Dynamic Range",permalink:"/docs/introduction/high-dynamic-range"},next:{title:"Opus",permalink:"/docs/audio/Opus"}},s={},c=[{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"AAC-LC",id:"aac-lc",level:3},{value:"AAC-LD & AAC-ELD",id:"aac-ld--aac-eld",level:3},{value:"HE-AAC",id:"he-aac",level:3},{value:"HE-AACv2",id:"he-aacv2",level:3},{value:"xHE-AAC",id:"xhe-aac",level:3},{value:"Encoders",id:"encoders",level:2},{value:"Fraunhofer FDK AAC",id:"fraunhofer-fdk-aac",level:3},{value:"Core Audio",id:"core-audio",level:3},{value:"FFmpeg AAC",id:"ffmpeg-aac",level:3},{value:"FAAC",id:"faac",level:3},{value:"Nero AAC",id:"nero-aac",level:3},{value:"Exhale",id:"exhale",level:3},{value:"Conclusion",id:"conclusion",level:2}],d={toc:c},u="wrapper";function h(e){let{components:t,...o}=e;return(0,n.kt)(u,(0,i.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"aac"},"AAC"),(0,n.kt)("p",null,"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:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"AAC-LC (low-complexity AAC)"),(0,n.kt)("li",{parentName:"ul"},"AAC-LD (low delay AAC)"),(0,n.kt)("li",{parentName:"ul"},"AAC-ELD (enhanced low delay AAC)"),(0,n.kt)("li",{parentName:"ul"},"HE-AAC (high efficiency AAC, uses Spectral Band Replication)"),(0,n.kt)("li",{parentName:"ul"},"HE-AACv2 (high efficiency AAC v2, uses Spectral Band Replication + Parametric Stereo)"),(0,n.kt)("li",{parentName:"ul"},"xHE-AAC (extended high efficiency AAC (kinda), uses USAC (Unified Speech & Audio Coding))")),(0,n.kt)("p",null,"AAC is even used as a Bluetooth audio codec for encoding audio streams & sending them to a Bluetooth audio device. Encoding & even decoding some of the above formats can prove to be difficult, so it is worth exploring each codec individually."),(0,n.kt)("h2",{id:"format-breakdown"},"Format Breakdown"),(0,n.kt)("p",null,"Let's explore each codec individually."),(0,n.kt)("h3",{id:"aac-lc"},"AAC-LC"),(0,n.kt)("p",null,'While AAC-LC was introduced alongside two higher complexity profiles (AAC Main & AAC-SSR), AAC-LC has seen much more widespread adoption through various distribution mediums for video (often paired with AVC video) & audio alike. AAC-LC is ubiquitous within the Apple ecosystem & was (& still is) used on YouTube before their switch to primarily using Opus. Encoding AAC-LC can be done with relative ease, accessible through nearly every encoder in the "Encoders" section.'),(0,n.kt)("h3",{id:"aac-ld--aac-eld"},"AAC-LD & AAC-ELD"),(0,n.kt)("p",null,"AAC-LD & AAC-ELD are both designed to transmit audio in instances where latency is very important. Both are far more efficient than previous low-latency audio coding offerings. Over AAC-LD, AAC-ELD offers better audio quality through Spectral Band Replication, lower latency, & a greater quality range with a lower bitrate minimum & higher maximum."),(0,n.kt)("h3",{id:"he-aac"},"HE-AAC"),(0,n.kt)("p",null,"High Efficiency AAC introduces Spectral Band Replication (SBR) to the AAC specification for the purpose of higher quality audio at lower bitrates. SBR is an encoding technique that allows the decoder to reconstruct higher frequencies from an audio signal given lower frequencies & data that informs the decoder about information in the higher frequencies, allowing them to be effectively restored from this helper data. In short, lower frequencies are encoded with extra detail incorporated to allow the reconstruction of higher frequency information in an audio signal. This feature alone allows HE-AAC to be much more efficient than AAC-LC at lower bitrates; the gap closes substantially at higher bitrates, however."),(0,n.kt)("h3",{id:"he-aacv2"},"HE-AACv2"),(0,n.kt)("p",null,"High Efficiency AAC v2 introduces Parametric Stereo (PS), which further increases audio quality with an emphasis on lower bitrates. PS uses a mono signal downmixed from a multichannel stereo input alongside information about the spatial properties of the stereo input to allow the decoder to reconstruct a left & right channel using salient spatial data from the mono signal. HE-AACv2 combine PS with SBR for greater efficiency gains over HE-AAC & AAC-LC, although again the gap closes at higher bitrates."),(0,n.kt)("h3",{id:"xhe-aac"},"xHE-AAC"),(0,n.kt)("p",null,"Extended High Efficiency AAC is actually slightly different from xHE-AAC. While Extended High Efficiency AAC specifically includes all of HE-AACv2's coding techniques as well as compression techniques from the USAC specification, the Extended High Efficiency AAC profile was designed in such a manner that building an encoder for the format would allow it to be perfectly backwards compatible with past variations of AAC. xHE-AAC is a codec that combines the Extended High Efficiency AAC profile with further USAC coding techniques, specifically within the ",(0,n.kt)("em",{parentName:"p"},"MPEG-D DRC Loudness Control Profile"),". For all intents and purposes, when someone refers to \"USAC audio,\" they probably mean xHE-AAC. xHE-AAC further extends performance at lower bitrates compared to past variants of AAC. USAC's specialty & purpose was to create an audio codec that didn't compromise music performance for speech & vice versa, but rather automatically tuned its coding technique selection to perform the best on any given source."),(0,n.kt)("p",null,"xHE-AAC is not widely supported. On a Mac, playback is only possible through QuickTime Player & other utilities which use CoreAudio for decoding. Windows 11 & Android support xHE-AAC natively, but Windows 10 & Linux will not allow you to play it back without some grief. The most effective way currently is to use an AAC plugin with foobar2000, although this plugin is 32-bit only, so you'll need 32-bit foobar2000. This works on Linux under WINE."),(0,n.kt)("h2",{id:"encoders"},"Encoders"),(0,n.kt)("p",null,"There are a number of ways to encode each format, which I'll outline below."),(0,n.kt)("h3",{id:"fraunhofer-fdk-aac"},"Fraunhofer FDK AAC"),(0,n.kt)("p",null,"Fraunhofer FDK AAC is a high quality, open-source AAC encoder by ",(0,n.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Fraunhofer_Society"},"Fraunhofer IIS"),". It was introduced with the release of Android 4.1 and has since been forked to a ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/mstorsjo/fdk-aac"},"seperate repository"),". Issues regarding the legality of its distribution have arisen since the Free Software Foundation declared the license incompatible with the GPL. The license does not grant the user rights to the patented technologies used in the source code, and therefore restricts its use. However, this topic is still debated as Debian does not consider FDK AAC free software while Red Hat does."),(0,n.kt)("p",null,"Another similar tool, FhG-AAC, performs similarly to FDK-AAC but with greater precision as it performs floating point operations. It can be used through the proprietary Windows media player Winamp."),(0,n.kt)("p",null,"FDK-AAC can encode the following formats:\n",(0,n.kt)("inlineCode",{parentName:"p"},"AAC-LC AAC-LD AAC-ELD HE-AAC HE-AACv2")),(0,n.kt)("h3",{id:"core-audio"},"Core Audio"),(0,n.kt)("p",null,"Apple's proprietary Core Audio Toolbox encoder is a popular, high-quality choice for encoding AAC. This encoder can be used in macOS via Apple's own ",(0,n.kt)("inlineCode",{parentName:"p"},"afconvert")," utility, or in FFmpeg by specifying ",(0,n.kt)("inlineCode",{parentName:"p"},"aac_at")," as the audio encoder. Windows users can also take advantage of Core Audio by using the free ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/nu774/qaac"},"qaac")," command-line utility, but users will need to either have ",(0,n.kt)("a",{parentName:"p",href:"https://support.apple.com/en-ca/HT210384"},"iTunes")," installed, or extract the libraries from said installer, using the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/nu774/makeportable"},"makeportable")," script."),(0,n.kt)("p",null,"Core Audio can encode the following formats: ",(0,n.kt)("inlineCode",{parentName:"p"},"AAC-LC, HE-AAC, HE-AACv2"),"*"),(0,n.kt)("p",null,"*",(0,n.kt)("inlineCode",{parentName:"p"},"HE-AACv2")," encoding is only supported on macOS."),(0,n.kt)("h3",{id:"ffmpeg-aac"},"FFmpeg AAC"),(0,n.kt)("p",null,"FFmpeg's native AAC encoder is known for being completely free & open source, licensed under the GNU General Public License (or LGPL, depending on how FFmpeg is configured). If you want a completely FOSS solution for encoding AAC, FFmpeg AAC is one of the only places you'll find this. It is not known for being particularly feature rich or high quality & doesn't support the entire profile of the AAC variants it can encode, but it gets the job done in most scenarios."),(0,n.kt)("p",null,"FFmpeg's AAC encoder can be called with a simple ",(0,n.kt)("inlineCode",{parentName:"p"},"-c:a aac")," parameter, but there are more granular options available. By default, the profile is ",(0,n.kt)("inlineCode",{parentName:"p"},"aac_low")," which encodes MPEG-4 AAC-LC. The ",(0,n.kt)("inlineCode",{parentName:"p"},"mpeg2_aac_low")," profile encodes simpler, lower-quality MPEG-2 AAC from 1997, while ",(0,n.kt)("inlineCode",{parentName:"p"},"aac_main")," encodes the more obscure main AAC profile from the 1997 MPEG-2 specification. Finally, ",(0,n.kt)("inlineCode",{parentName:"p"},"aac-ltp")," encodes AAC long-term prediction introduced in MPEG-4."),(0,n.kt)("p",null,"Using FFmpeg AAC, we can encode the following formats:\n",(0,n.kt)("inlineCode",{parentName:"p"},"AAC-LC")),(0,n.kt)("h3",{id:"faac"},"FAAC"),(0,n.kt)("p",null,"FAAC is an old AAC encoder, name meaning Freeware Advanced Audio Coder. It is one of the lower quality options, & isn't recommended for general use. It only supports ",(0,n.kt)("inlineCode",{parentName:"p"},"AAC-LC"),"."),(0,n.kt)("h3",{id:"nero-aac"},"Nero AAC"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Nero AAC can encode the following formats:\n",(0,n.kt)("inlineCode",{parentName:"p"},"AAC-LC, HE-AAC, HE-AACv2")),(0,n.kt)("h3",{id:"exhale"},"Exhale"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"exhale")," can encode the following formats:\n",(0,n.kt)("inlineCode",{parentName:"p"},"xHE-AAC")),(0,n.kt)("h2",{id:"conclusion"},"Conclusion"),(0,n.kt)("p",null,"Alternatives to AAC include Opus, Vorbis, MP3, & FLAC, among others."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Vorbis & MP3 are considered to be worse, although Vorbis has its moments & is entirely royalty-free unlike AAC."),(0,n.kt)("li",{parentName:"ul"},"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."),(0,n.kt)("li",{parentName:"ul"},"Opus is competitive with HE-AACv2 & xHE-AAC moreso than the older, worse variants, & is widely supported as well as royalty free. The open source reference encoder ",(0,n.kt)("inlineCode",{parentName:"li"},"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.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cce09ffa.724da7e3.js b/assets/js/cce09ffa.724da7e3.js new file mode 100644 index 000000000..ce9f4f45c --- /dev/null +++ b/assets/js/cce09ffa.724da7e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8475],{1932:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>u,contentTitle:()=>s,default:()=>l,frontMatter:()=>a,metadata:()=>r,toc:()=>m});var n=i(5893),o=i(1151);const a={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},s=void 0,r={permalink:"/blog/av1-encoding-for-dummies",source:"@site/blog/2023-09-03-av1-for-dummies.mdx",title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",date:"2023-09-03T00:00:00.000Z",formattedDate:"September 3, 2023",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:15.145,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",permalink:"/blog/embedding-the-un-embeddable"},nextItem:{title:"Site Optimization by Reducing Image Load on the Web",permalink:"/blog/site-optimization"}},u={authorsImageUrls:[void 0,void 0]},m=[];function c(t){const e={code:"code",em:"em",p:"p",strong:"strong",...(0,o.a)(),...t.components};return(0,n.jsxs)(e.p,{children:["This guide will show you how to encode in AV1 the ",(0,n.jsx)(e.em,{children:"right"})," and ",(0,n.jsx)(e.em,{children:"optimal"})," way. Yes, you using standalone ",(0,n.jsx)(e.code,{children:"libaom"}),", ",(0,n.jsx)(e.code,{children:"libsvtav1"}),", and ",(0,n.jsx)(e.code,{children:"librav1e"})," from FFmpeg or even piping ",(0,n.jsx)(e.code,{children:"yuv4mpeg"})," into ",(0,n.jsx)(e.strong,{children:"mainline"})," aomenc are all unoptimal."]})}function l(t={}){const{wrapper:e}={...(0,o.a)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(c,{...t})}):c(t)}},1151:(t,e,i)=>{i.d(e,{Z:()=>r,a:()=>s});var n=i(7294);const o={},a=n.createContext(o);function s(t){const e=n.useContext(a);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:s(t.components),n.createElement(a.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/cd1d8cd3.8be28c9c.js b/assets/js/cd1d8cd3.8be28c9c.js deleted file mode 100644 index 4cbbabae5..000000000 --- a/assets/js/cd1d8cd3.8be28c9c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4002],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var r=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 o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=s(n),f=i,b=p["".concat(l,".").concat(f)]||p[f]||d[f]||o;return n?r.createElement(b,a(a({ref:t},u),{},{components:n})):r.createElement(b,a({ref:t},u))}));function b(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[p]="string"==typeof e?e:i,a[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(7462),i=(n(7294),n(3905));const o={title:"Deband",sidebar_position:2},a="Deband",c={unversionedId:"filtering/deband",id:"filtering/deband",title:"Deband",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/deband.md",sourceDirName:"filtering",slug:"/filtering/deband",permalink:"/docs/filtering/deband",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/deband.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Deband",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Intro",permalink:"/docs/filtering/intro"},next:{title:"Vapoursynth",permalink:"/docs/filtering/vapoursynth"}},l={},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"deband"},"Deband"),(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!")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cd6cf5b7.a5668009.js b/assets/js/cd6cf5b7.a5668009.js new file mode 100644 index 000000000..4f96a6859 --- /dev/null +++ b/assets/js/cd6cf5b7.a5668009.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4685],{7518:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=n(5893),i=n(1151);const s={title:"SVT-VP9",sidebar_position:8},r="SVT-VP9",c={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!",source:"@site/docs/encoders/SVT-VP9.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-VP9",permalink:"/docs/encoders/SVT-VP9",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-VP9.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"SVT-VP9",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC"},next:{title:"VVenC",permalink:"/docs/encoders/VVenC"}},d={},a=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"svt-vp9",children:"SVT-VP9"}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var o=n(7294);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce98a713.82317910.js b/assets/js/ce98a713.82317910.js new file mode 100644 index 000000000..dc6894c87 --- /dev/null +++ b/assets/js/ce98a713.82317910.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8220],{6541:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var i=n(5893),o=n(1151);const s={title:"Denoise",sidebar_position:4},r="Denoise",c={id:"filtering/denoise",title:"Denoise",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/denoise.mdx",sourceDirName:"filtering",slug:"/filtering/denoise",permalink:"/docs/filtering/denoise",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/denoise.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Denoise",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Deinterlace",permalink:"/docs/filtering/deinterlace"},next:{title:"Detelecine / Inverse Telecine",permalink:"/docs/filtering/detelecine"}},a={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"denoise",children:"Denoise"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var i=n(7294);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cf7588c6.20dcbccf.js b/assets/js/cf7588c6.20dcbccf.js new file mode 100644 index 000000000..0ae173f20 --- /dev/null +++ b/assets/js/cf7588c6.20dcbccf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9079],{230:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=i(5893),t=i(1151);const r={title:"x264",sidebar_position:1},o="x264",a={id:"encoders/x264",title:"x264",description:"x264 is a software library and command line application for encoding H.264 / AVC developed by VideoLAN, the people behind the ever-popular VLC Media Player and released under GNU GPL. It is written in C and Assembly with almost two decades worth of development and threading optimizations which makes it the fastest software video encoder available, which also happens to be extremely popular.",source:"@site/docs/encoders/x264.mdx",sourceDirName:"encoders",slug:"/encoders/x264",permalink:"/docs/encoders/x264",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/x264.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"x264",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"JPEG-XL",permalink:"/docs/images/JXL"},next:{title:"x265",permalink:"/docs/encoders/x265"}},l={},d=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Recommendations",id:"recommendations",level:2},{value:"Lowering presets",id:"lowering-presets",level:3},{value:"Increase threads",id:"increase-threads",level:3},{value:"Open GOP",id:"open-gop",level:3},{value:"AQ Mode 3",id:"aq-mode-3",level:3},{value:"Increasing reference frames",id:"increasing-reference-frames",level:3},{value:"Tips and tricks",id:"tips-and-tricks",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"x264",children:"x264"}),"\n",(0,s.jsx)(n.p,{children:"x264 is a software library and command line application for encoding H.264 / AVC developed by VideoLAN, the people behind the ever-popular VLC Media Player and released under GNU GPL. It is written in C and Assembly with almost two decades worth of development and threading optimizations which makes it the fastest software video encoder available, which also happens to be extremely popular."}),"\n",(0,s.jsx)(n.p,{children:"x264 has great fine detail retention which makes it perfect for high fidelity content."}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(n.p,{children:["x264 is available in FFmpeg via ",(0,s.jsx)(n.code,{children:"libx264"}),", to check if you have it, run ",(0,s.jsx)(n.code,{children:"ffmpeg -h encoder=libx264"}),". You can input non-FFmpeg standard x264 parameters via ",(0,s.jsx)(n.code,{children:"-x264-params"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Pre-built binary [Recommended]:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://code.videolan.org/videolan/x264",children:"https://code.videolan.org/videolan/x264"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Choose your operating system there, or you can try using your package manager."}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.p,{children:"x264 has been praised for its simple, easy-to-use, and no fuss settings. Here are some examples:"}),"\n",(0,s.jsxs)(n.p,{children:["Simple Y4M input with CRF 20 and raw ",(0,s.jsx)(n.code,{children:"264"})," bitstream output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"x264 --crf 20 -o output.264 input.y4m\n"})}),"\n",(0,s.jsx)(n.p,{children:"Preset slow, CRF 20, Y4M input:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"x264 --preset slow --crf 20 -o output.264 input.y4m\n"})}),"\n",(0,s.jsx)(n.p,{children:"FFmpeg piping:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.264\n"})}),"\n",(0,s.jsx)(n.p,{children:"FFmpeg piping with MKV output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | x264 --preset slow --crf 20 --demux y4m - -o output.mkv\n"})}),"\n",(0,s.jsx)(n.admonition,{title:"Output Containers",type:"note",children:(0,s.jsxs)(n.p,{children:["x264 can output ",(0,s.jsx)(n.code,{children:"264"}),", MKV, FLV (Flash Video), and MP4 (If compiled with GPAC or L-SMASH support)."]})}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsx)(n.p,{children:"x264 will use Haali Matroska Muxer for MKV outputs, which has seeking issues. It is recommended to remux back using FFmpeg or mkvmerge/MKVToolNix."})}),"\n",(0,s.jsx)(n.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,s.jsx)(n.p,{children:'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.'}),"\n",(0,s.jsx)(n.h3,{id:"lowering-presets",children:"Lowering presets"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--preset veryslow"})}),"\n",(0,s.jsxs)(n.p,{children:["The most obvious option, set the preset to the slowest bearable option. You can use ",(0,s.jsx)(n.code,{children:"placebo"})," if you have a beefy CPU."]}),"\n",(0,s.jsx)(n.h3,{id:"increase-threads",children:"Increase threads"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--threads X"})}),"\n",(0,s.jsx)(n.p,{children:"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."}),"\n",(0,s.jsx)(n.h3,{id:"open-gop",children:"Open GOP"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--open-gop"})}),"\n",(0,s.jsxs)(n.p,{children:["Enables Open GOP (Group of Pictures), where each GOP can ",(0,s.jsx)(n.a,{href:"https://ottverse.com/closed-gop-open-gop-idr/",children:"reference one another"}),", thus improving compression with little speed loss. For unknown reasons it is disabled by default in x264."]}),"\n",(0,s.jsx)(n.h3,{id:"aq-mode-3",children:"AQ Mode 3"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--aq-mode 3"})}),"\n",(0,s.jsx)(n.p,{children:"In short, will make x264 bias to dark areas and spend more bitrate there, thus dark scenes will look less bad. Basically no speed loss."}),"\n",(0,s.jsx)(n.h3,{id:"increasing-reference-frames",children:"Increasing reference frames"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--bframes 8 --ref 12"})}),"\n",(0,s.jsx)(n.p,{children:"These parameters are responsible for the amount of reference frames x264 will use for compression, the more the better. Maximum of 16, will definitely increase compute time the higher you go."}),"\n",(0,s.jsx)(n.p,{children:"\xa0\xa0"}),"\n",(0,s.jsx)(n.h2,{id:"tips-and-tricks",children:"Tips and tricks"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["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 ",(0,s.jsx)(n.code,{children:"--qp 0"}),", using slower presets will decrease the size even further."]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Why not CRF 0?",type:"info",children:(0,s.jsxs)(n.p,{children:["Because CRF automatically adjusts the ",(0,s.jsx)(n.strong,{children:"quantization parameters"})," to achieve the desired quality. QP in the other hand, which stands for ",(0,s.jsx)(n.strong,{children:"Quantization Parameter"}),", you get full control over the quality you'll get. In this case, all-intra or lossless."]})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>o});var s=i(7294);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d083b8d3.f355ca6c.js b/assets/js/d083b8d3.f355ca6c.js deleted file mode 100644 index 6d96f82ef..000000000 --- a/assets/js/d083b8d3.f355ca6c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3155],{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 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 u=n.createContext({}),s=function(e){var t=n.useContext(u),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(u.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,u=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),p=s(r),f=o,b=p["".concat(u,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(b,a(a({ref:t},l),{},{components:r})):n.createElement(b,a({ref:t},l))}));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 u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);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:()=>u,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const i={label:"MP3",sidebar_position:4},a="MP3",c={unversionedId:"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!",source:"@site/docs/audio/MP3.md",sourceDirName:"audio",slug:"/audio/MP3",permalink:"/docs/audio/MP3",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/MP3.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"MP3",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Dolby Digital",permalink:"/docs/audio/Dolby"},next:{title:"Vorbis",permalink:"/docs/audio/Vorbis"}},u={},s=[],l={toc:s},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"mp3"},"MP3"),(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/d1becb09.01e3c92b.js b/assets/js/d1becb09.01e3c92b.js new file mode 100644 index 000000000..77e90500a --- /dev/null +++ b/assets/js/d1becb09.01e3c92b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2518],{4100:(i,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(5893),n=t(1151);const s={title:"Privacy Policy",sidebar_label:"\ud83d\udd0f Privacy Policy",position:15},r="Privacy Policy",a={id:"privacy-policy",title:"Privacy Policy",description:"This site is hosted on GitHub Pages, & usage of this site is subject to GitHub's Privacy Policy. GitHub may store information about your visit in the form of log files.",source:"@site/docs/privacy-policy.mdx",sourceDirName:".",slug:"/privacy-policy",permalink:"/docs/privacy-policy",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/privacy-policy.mdx",tags:[],version:"current",frontMatter:{title:"Privacy Policy",sidebar_label:"\ud83d\udd0f Privacy Policy",position:15},sidebar:"tutorialSidebar",previous:{title:"\u2753 FAQ",permalink:"/docs/FAQ"},next:{title:"\ud83e\udd1d Terms of Use",permalink:"/docs/terms-of-use"}},c={},l=[];function d(i){const e={a:"a",em:"em",h1:"h1",li:"li",p:"p",ul:"ul",...(0,n.a)(),...i.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.h1,{id:"privacy-policy",children:"Privacy Policy"}),"\n",(0,o.jsxs)(e.p,{children:["This site is hosted on GitHub Pages, & usage of this site is subject to ",(0,o.jsx)(e.a,{href:"https://docs.github.com/en/site-policy/privacy-policies/github-privacy-statement",children:"GitHub's Privacy Policy"}),". GitHub may store information about your visit in the form of log files."]}),"\n",(0,o.jsxs)(e.p,{children:["Furthermore, this site uses a self-hosted instance of ",(0,o.jsx)(e.a,{href:"https://plausible.io",children:"Plausible Analytics"})," located in Singapore. Plausible Analytics is a lightweight and open source web analytics platform for website traffic analysis. We do not track, collect nor store any personally identifiable information; Plausible Analytics collects only aggregated information, which does not allow us to identify any visitor to our website."]}),"\n",(0,o.jsx)(e.p,{children:"This information is collected to understand how users interact with the Codec Wiki and improve our efforts to better suit the needs of these users."}),"\n",(0,o.jsx)(e.p,{children:"We do not employ the use of cookies. The following information is collected:"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"Page URL"}),"\n",(0,o.jsx)(e.li,{children:"HTTP Referer"}),"\n",(0,o.jsx)(e.li,{children:"Browser & Browser Version"}),"\n",(0,o.jsx)(e.li,{children:"Operating System type & version"}),"\n",(0,o.jsx)(e.li,{children:"Device type"}),"\n",(0,o.jsx)(e.li,{children:"Country, region, & city"}),"\n"]}),"\n",(0,o.jsx)(e.p,{children:"Given this information, we ensure:"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsxs)(e.li,{children:["Analytics data is not shared explicitly with advertising companies or any other companies in general. It is made available to everyone, for free, on our ",(0,o.jsx)(e.a,{href:"https://analytics.x266.mov/wiki.x266.mov/",children:"analytics page"})]}),"\n",(0,o.jsx)(e.li,{children:"Analytics data isn't explicitly sent to any third parties"}),"\n",(0,o.jsx)(e.li,{children:"Analytics data is not monetized"}),"\n"]}),"\n",(0,o.jsxs)(e.p,{children:["As a wiki dedicated to making multimedia codec knowledge more accessible, analytics information is made public via our ",(0,o.jsx)(e.a,{href:"https://analytics.x266.mov/wiki.x266.mov/",children:"analytics page"}),"."]}),"\n",(0,o.jsxs)(e.p,{children:["You may opt out with various means of ad & tracker blocking. An example would be ",(0,o.jsx)(e.a,{href:"https://ublockorigin.com/",children:"UBlock Origin"}),", which blocks our analytics script."]}),"\n",(0,o.jsxs)(e.p,{children:["If you have any questions, comments or concerns, you may reach out to site maintainer Gianni Rosato via ",(0,o.jsx)(e.a,{href:"mailto:grosatowork@proton.me",children:"grosatowork@proton.me"}),"."]}),"\n",(0,o.jsx)(e.p,{children:(0,o.jsx)(e.em,{children:"Last updated 12 September 2023"})})]})}function h(i={}){const{wrapper:e}={...(0,n.a)(),...i.components};return e?(0,o.jsx)(e,{...i,children:(0,o.jsx)(d,{...i})}):d(i)}},1151:(i,e,t)=>{t.d(e,{Z:()=>a,a:()=>r});var o=t(7294);const n={},s=o.createContext(n);function r(i){const e=o.useContext(s);return o.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function a(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(n):i.components||n:r(i.components),o.createElement(s.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/assets/js/d2946d3d.12977300.js b/assets/js/d2946d3d.12977300.js deleted file mode 100644 index ab3f11dc7..000000000 --- a/assets/js/d2946d3d.12977300.js +++ /dev/null @@ -1 +0,0 @@ -"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/d3fe2180.ad20cfd1.js b/assets/js/d3fe2180.ad20cfd1.js deleted file mode 100644 index 2c267caa8..000000000 --- a/assets/js/d3fe2180.ad20cfd1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1820],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,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({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=u(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,a=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),p=u(r),f=o,m=p["".concat(s,".").concat(f)]||p[f]||d[f]||a;return r?n.createElement(m,i(i({ref:t},l),{},{components:r})):n.createElement(m,i({ref:t},l))}));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 u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const a={label:"WavPack",sidebar_position:8},i="WavPack",c={unversionedId:"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!",source:"@site/docs/audio/WavPack.md",sourceDirName:"audio",slug:"/audio/WavPack",permalink:"/docs/audio/WavPack",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/WavPack.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{label:"WavPack",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"FLAC",permalink:"/docs/audio/FLAC"},next:{title:"H.264",permalink:"/docs/video/AVC"}},s={},u=[],l={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"wavpack"},"WavPack"),(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,"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."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d4833a76.dbd0d6ab.js b/assets/js/d4833a76.dbd0d6ab.js deleted file mode 100644 index 24b098bdb..000000000 --- a/assets/js/d4833a76.dbd0d6ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5601],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,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 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)},d="mdxType",u={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,l=c(e,["components","mdxType","originalType","parentName"]),d=p(r),f=o,m=d["".concat(s,".").concat(f)]||d[f]||u[f]||i;return r?n.createElement(m,a(a({ref:t},l),{},{components:r})):n.createElement(m,a({ref:t},l))}));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 c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[d]="string"==typeof e?e:o,a[1]=c;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={label:"VP8",sidebar_position:4},a="VP8",c={unversionedId:"video/VP8",id:"video/VP8",title:"VP8",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/VP8.md",sourceDirName:"video",slug:"/video/VP8",permalink:"/docs/video/VP8",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/VP8.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"VP8",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"H.266",permalink:"/docs/video/VVC"},next:{title:"VP9",permalink:"/docs/video/VP9"}},s={},p=[],l={toc:p},d="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"vp8"},"VP8"),(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,"VP8 is a video compression format developed by On2 Technologies released in 2008. It was later released as a royalty free codec in 2010 by Google. Its efficiency is competitive with ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AVC"},"AVC"),". VP8 was a significant player in the royalty-free codec space and was used in various applications like web video delivery. It is the precursor to ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/VP9"},"VP9")," & ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AV1"},"AV1"),", which both further improve video compression efficiency. VP8 has faced criticism for having a messy specification that many considered to be incomplete."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d5ab79da.75b57cd1.js b/assets/js/d5ab79da.75b57cd1.js new file mode 100644 index 000000000..3883eb3f6 --- /dev/null +++ b/assets/js/d5ab79da.75b57cd1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8473],{324:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var i=o(5893),n=o(1151);const s={label:"MP3",sidebar_position:4},r="MP3",a={id:"audio/MP3",title:"MP3",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/MP3.mdx",sourceDirName:"audio",slug:"/audio/MP3",permalink:"/docs/audio/MP3",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/MP3.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"MP3",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Dolby Digital",permalink:"/docs/audio/Dolby"},next:{title:"Vorbis",permalink:"/docs/audio/Vorbis"}},c={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"mp3",children:"MP3"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>r});var i=o(7294);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5f89569.2b3849bf.js b/assets/js/d5f89569.2b3849bf.js new file mode 100644 index 000000000..b2a6b0ee6 --- /dev/null +++ b/assets/js/d5f89569.2b3849bf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2570],{9956:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var o=t(5893),r=t(1151);const a={label:"Kvazaar",sidebar_position:6},i="Kvazaar",s={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!",source:"@site/docs/encoders/Kvazaar.mdx",sourceDirName:"encoders",slug:"/encoders/Kvazaar",permalink:"/docs/encoders/Kvazaar",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/Kvazaar.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"Kvazaar",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"},next:{title:"SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC"}},c={},d=[];function u(e){const n={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"kvazaar",children:"Kvazaar"}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(n.p,{children:"Kvazaar is an open-source HEVC encoder licensed under 3-clause BSD developed by the Ultra Video Group (UVG). Written in C and Assembly."})]})}function l(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const r={},a=o.createContext(r);function i(e){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d6535278.54691f71.js b/assets/js/d6535278.54691f71.js new file mode 100644 index 000000000..308dde82f --- /dev/null +++ b/assets/js/d6535278.54691f71.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8080],{1019:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>u});var n=i(5893),o=i(1151);const r={label:"VMAF",sidebar_position:1},s="VMAF",c={id:"metrics/VMAF",title:"VMAF",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/VMAF.mdx",sourceDirName:"metrics",slug:"/metrics/VMAF",permalink:"/docs/metrics/VMAF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/VMAF.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{label:"VMAF",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2"},next:{title:"Butteraugli",permalink:"/docs/metrics/butteraugli"}},a={},u=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"vmaf",children:"VMAF"}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>c,a:()=>s});var n=i(7294);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d6f42046.08bc8401.js b/assets/js/d6f42046.08bc8401.js deleted file mode 100644 index e89c4ee0a..000000000 --- a/assets/js/d6f42046.08bc8401.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1280],{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 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 i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=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):i(i({},t),e)),r},l=function(e){var t=c(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,a=e.mdxType,o=e.originalType,p=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=c(r),d=a,f=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;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,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={label:"PNG",sidebar_position:2},i="PNG",s={unversionedId:"images/PNG",id:"images/PNG",title:"PNG",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/PNG.md",sourceDirName:"images",slug:"/images/PNG",permalink:"/docs/images/PNG",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/PNG.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{label:"PNG",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"JPEG",permalink:"/docs/images/JPEG"},next:{title:"GIF",permalink:"/docs/images/GIF"}},p={},c=[{value:"Performance Checklist",id:"performance-checklist",level:2}],l={toc:c},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"png"},"PNG"),(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,"Portable Network Graphics (PNG) is a free lossless image file format released in 1996. It was ceated as an alternative to ",(0,a.kt)("a",{parentName:"p",href:"/docs/images/GIF"},"GIF"),", which was at the time a proprietary format. It gained animation support similar to GIF with the release of APNG in 2008, which is now supported by all popular web browsers."),(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 Depths:\n",(0,a.kt)("em",{parentName:"p"},"8 BPC, 16 BPC")),(0,a.kt)("p",null,"HDR/Wide Gamut? ",(0,a.kt)("em",{parentName:"p"},"Yes")),(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"},"Kinda")),(0,a.kt)("p",null,"Royalty Free? ",(0,a.kt)("em",{parentName:"p"},"Yes")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d92a3c43.668e9001.js b/assets/js/d92a3c43.668e9001.js deleted file mode 100644 index 539781005..000000000 --- a/assets/js/d92a3c43.668e9001.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2798],{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({}),u=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=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="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,l=s(e,["components","mdxType","originalType","parentName"]),p=u(r),m=o,f=p["".concat(c,".").concat(m)]||p[m]||d[m]||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]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:o,a[1]=s;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={title:"Resources",sidebar_label:"\ud83d\uddc3\ufe0f Resources",sidebar_position:12},a="Resources",s={unversionedId:"resources",id:"resources",title:"Resources",description:"Encoding resources that you might find useful.",source:"@site/docs/resources.md",sourceDirName:".",slug:"/resources",permalink:"/docs/resources",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/resources.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"Resources",sidebar_label:"\ud83d\uddc3\ufe0f Resources",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"\u25b6\ufe0f Video Players",permalink:"/docs/video-players"},next:{title:"\u2712\ufe0f Contribution Guide",permalink:"/docs/contribution-guide"}},c={},u=[],l={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"resources"},"Resources"),(0,o.kt)("p",null,"Encoding resources that you might find useful."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://guide.encode.moe"},"https://guide.encode.moe")," - Filtering and fansubbing."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://lvsfunc.encode.moe/en/latest"},"https://lvsfunc.encode.moe/en/latest")," - lvsfunc documentation."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://silentaperture.gitlab.io/mdbook-guide/introduction.html"},"https://silentaperture.gitlab.io/mdbook-guide/introduction.html")," - SilentAperture's Advanced Encoding guide, mostly about filtering."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://encoding.bluefalcon.cc/"},"https://encoding.bluefalcon.cc/"),' - Soichiro\'s "Encoding in Depth".'),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://x265.readthedocs.io/en/master"},"https://x265.readthedocs.io/en/master")," - x265 technical documentation, made by MulticoreWare themselves."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"http://www.chaneru.com/Roku/HLS/X264_Settings.htm"},"http://www.chaneru.com/Roku/HLS/X264_Settings.htm")," - x264 settings."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac"},"https://kokomins.wordpress.com/2019/10/10/anime-encoding-guide-for-x265-and-why-to-never-use-flac")," - Anime encoding guide by Kokomins. Has some pretty good advices regarding psychovisual stuff and x265."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://wiki.xiph.org/Main_Page"},"https://wiki.xiph.org/Main_Page")," - Xiph Wiki.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dc798dbd.88c70e45.js b/assets/js/dc798dbd.88c70e45.js new file mode 100644 index 000000000..a766cccc1 --- /dev/null +++ b/assets/js/dc798dbd.88c70e45.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4750],{8951:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var s=t(5893),n=t(1151);const o={title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},r=void 0,a={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable.mdx",title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",formattedDate:"October 29, 2023",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.92,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],frontMatter:{title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},d={authorsImageUrls:[void 0]},h=[{value:"A Scenario",id:"a-scenario",level:2},{value:"But First, a Quick Disclosure",id:"but-first-a-quick-disclosure",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"The Website's End",id:"the-websites-end",level:3},{value:"Discord's End",id:"discords-end",level:3},{value:"Strengths & Limitations",id:"strengths--limitations",level:2},{value:"Strengths",id:"strengths",level:4},{value:"Limitations",id:"limitations",level:4},{value:"Differences between Sites",id:"differences-between-sites",level:2},{value:"The Lore",id:"the-lore",level:2},{value:"Dwayne",id:"dwayne",level:3},{value:"Discovery",id:"discovery",level:3},{value:"The Experiments & Interactive Site",id:"the-experiments--interactive-site",level:3},{value:"Virality",id:"virality",level:3},{value:"Closing",id:"closing",level:2}];function l(e){const i={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.img,{alt:"Feature image",src:t(5477).Z+"",width:"1920",height:"1080"}),"\n",(0,s.jsx)(i.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,s.jsx)(i.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,s.jsx)(i.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."}),"\n",(0,s.jsx)(i.p,{children:"It loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"stolen.shoes",src:t(2588).Z+"",width:"1088",height:"318"})}),"\n",(0,s.jsxs)(i.p,{children:["The truth is, there are ",(0,s.jsx)(i.em,{children:"multiple"})," site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["The big question is, ",(0,s.jsx)(i.strong,{children:"how do they work?"})," Let's get to dissecting."]}),"\n",(0,s.jsx)(i.h2,{id:"but-first-a-quick-disclosure",children:"But First, a Quick Disclosure"}),"\n",(0,s.jsx)(i.p,{children:"The Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately."}),"\n",(0,s.jsx)(i.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,s.jsx)(i.p,{children:"The entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park)."}),"\n",(0,s.jsx)(i.p,{children:"The technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end."}),"\n",(0,s.jsx)(i.h3,{id:"the-websites-end",children:"The Website's End"}),"\n",(0,s.jsx)(i.p,{children:"If you view each website's source, you will find this specific line in each one but they may have a different order:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n\n\n\n\n'})}),"\n",(0,s.jsxs)(i.p,{children:["These are the ",(0,s.jsx)(i.code,{children:"head"})," parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the ",(0,s.jsx)(i.code,{children:""})," and ",(0,s.jsx)(i.code,{children:""})," tags. Here's an example of a static HTML site serving one specific video:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n\n\n \n \n some embed site\n \n \n \n \n \n\n\n

Hi

\n

Just your friendly neighborhood video embed site

\n \n\n'})}),"\n",(0,s.jsx)(i.p,{children:"< br />\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms)."}),"\n",(0,s.jsx)(i.h3,{id:"discords-end",children:"Discord's End"}),"\n",(0,s.jsx)(i.p,{children:'Traditionally, Discord\'s media embedder will impose it\'s own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link "tricks" Discord by showing a "false face" first.'}),"\n",(0,s.jsx)(i.h2,{id:"strengths--limitations",children:"Strengths & Limitations"}),"\n",(0,s.jsx)(i.p,{children:"After a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below."}),"\n",(0,s.jsx)(i.h4,{id:"strengths",children:"Strengths"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["You can embed non-web compatible codecs such as ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/HEVC",children:"HEVC"})," in ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v",children:"MP4/MOV"}),", but the user must be using a compatible browser. ",(0,s.jsx)(i.a,{href:"https://thorium.rocks",children:"Thorium"})," or Safari version 13 or greater will work for HEVC playback."]}),"\n",(0,s.jsx)(i.li,{children:"There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"limitations",children:"Limitations"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["You can only use ",(0,s.jsx)(i.a,{href:"https://simple.wikipedia.org/wiki/Hotlinking",children:"hotlinks"}),", which means direct linking to the video itself ending in the appropriate file extension such as ",(0,s.jsx)(i.code,{children:".mp4"}),". Cloud services like Google Drive or OneDrive will not work for storage."]}),"\n",(0,s.jsxs)(i.li,{children:["You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but ",(0,s.jsx)(i.strong,{children:"only discord.nfp.is can do this"}),", as it ",(0,s.jsx)(i.strong,{children:"proxies cdn.discordapp.com"})," itself."]}),"\n",(0,s.jsx)(i.li,{children:"You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"differences-between-sites",children:"Differences between Sites"}),"\n",(0,s.jsx)(i.p,{children:"As mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality."}),"\n",(0,s.jsx)(i.p,{children:"Here are the sites, each with one noteworthy special benefit:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})," - Recognition, as it is the OG."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})," - You can use Discord CDN as video source."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})," - Immediately input video source into the URL (",(0,s.jsx)(i.code,{children:"https://embeds.video/https://example.com/v/video.mp4"}),")"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})," - Attractive domain, simple layout."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})," - Lots of info dump, pretty advanced features."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"That concludes the technical overview! Next, let's cover the history of this exploit."}),"\n",(0,s.jsx)(i.h2,{id:"the-lore",children:"The Lore"}),"\n",(0,s.jsx)(i.h3,{id:"dwayne",children:"Dwayne"}),"\n",(0,s.jsxs)(i.p,{children:["In around April of 2022, a Reddit user going by the name of u/CreativeGamer03 ",(0,s.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh",children:"posted a video on r/discordapp"}),' of a link where a GIF of Dwayne "The Rock" Johnson plays caption with "Is this a GIF or is it a video?" When played, a low-quality music video of Rick Astley\'s "Never Gonna Give You Up" plays.']}),"\n",(0,s.jsxs)(i.p,{children:["The link used is now unfortunately ",(0,s.jsx)(i.a,{href:"https://archuser.de/the-rock",children:"removed"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"discovery",children:"Discovery"}),"\n",(0,s.jsxs)(i.p,{children:["On 23rd June 2022, a Discord user ",(0,s.jsx)(i.em,{children:"Clybius"})," on the AV1 Community server asked people for ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/VP9",children:"VP9"})," or ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AVC",children:"H.264"})," videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked."]}),"\n",(0,s.jsxs)(i.p,{children:["He tried shortly afterward with ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AV1",children:"AV1"}),". Eureka, it also worked:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"AV1",src:t(3952).Z+"",width:"497",height:"421"})}),"\n",(0,s.jsx)(i.p,{children:"Clybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Dwayne",src:t(1354).Z+"",width:"1108",height:"98"})}),"\n",(0,s.jsx)(i.h3,{id:"the-experiments--interactive-site",children:"The Experiments & Interactive Site"}),"\n",(0,s.jsxs)(i.p,{children:["After the discovery of AV1 embedding, experimentation brought about the discovery that ",(0,s.jsx)(i.em,{children:"any"})," video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#container",children:"Containers"})," section on the ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology",children:"Terminology"})," page."]}),"\n",(0,s.jsxs)(i.p,{children:["This applies to HEVC, ProRes, ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/audio/AAC#xhe-aac",children:"xHE-AAC"}),", and other bizarre codecs that are rarely seen on the Web."]}),"\n",(0,s.jsxs)(i.p,{children:["While experimentating, Clybius converted one their idle domains ",(0,s.jsx)(i.code,{children:"stolen.shoes"})," into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding."]}),"\n",(0,s.jsx)(i.h3,{id:"virality",children:"Virality"}),"\n",(0,s.jsxs)(i.p,{children:["It's not long before people outside of the AV1 Community discovered ",(0,s.jsx)(i.code,{children:"stolen.shoes"}),", and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The first instance featured the DreamWorks sequel of "Puss in Boots (2011)", "Puss in Boots: The Last Wish (2022)". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used ',(0,s.jsx)(i.code,{children:"stolen.shoes"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"puss",src:t(2588).Z+"",width:"1088",height:"318"})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The second instance was when highly-anticipated animated film "The Super Mario Bros. Movie (2023)" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used ',(0,s.jsx)(i.code,{children:"stolen.shoes"})," as the embed site."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"mario",src:t(7324).Z+"",width:"1307",height:"335"})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The third instance is very recent as of the day this was posted. A streaming-service sourced "Five Nights at Freddy\'s (2023)" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining ',(0,s.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/",children:"hundreds of upvotes within the r/discordapp subreddit"}),". The copy seems to be a compressed 720p encode. This example used ",(0,s.jsx)(i.code,{children:"discord.nfp.is"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"fnaf",src:t(5430).Z+"",width:"1044",height:"409"})}),"\n",(0,s.jsx)(i.p,{children:"Note the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Top Gun Maverick (2022)"}),"\n",(0,s.jsx)(i.li,{children:"The SpongeBob trilogy (2005/2015/2020)"}),"\n",(0,s.jsx)(i.li,{children:"Spider-Man: Across the Spider-Verse (2023)"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"closing",children:"Closing"}),"\n",(0,s.jsx)(i.p,{children:"The ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies."}),"\n",(0,s.jsx)(i.p,{children:"While this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms."}),"\n",(0,s.jsx)(i.p,{children:"It is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform."}),"\n",(0,s.jsx)(i.p,{children:"Thank you for reading this blog post, I hope you learned something!"})]})}function c(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},3952:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/clybius-av1-28dcfefe8d58784301332b8119d2e926.webp"},1354:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/clybius-dwayne-15341f187cb8e7dbfd5c4ee00451eabd.webp"},5477:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},5430:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/discordnfpis-fnaf-dab5b24a63605605e7c7882d20a992a3.webp"},7324:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/stolenshoes-mario-6de3b4071d4c09064d7323fec40530f4.webp"},2588:(e,i,t)=>{t.d(i,{Z:()=>s});const s=t.p+"assets/images/stolenshoes-puss-842a1f9165b7571d293a74be89da25c2.webp"},1151:(e,i,t)=>{t.d(i,{Z:()=>a,a:()=>r});var s=t(7294);const n={},o=s.createContext(n);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ddce1156.469cf0fd.js b/assets/js/ddce1156.469cf0fd.js new file mode 100644 index 000000000..2f5998d7f --- /dev/null +++ b/assets/js/ddce1156.469cf0fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5966],{915:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>u,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=i(5893),n=i(1151);const s={label:"mp4box",sidebar_position:6},r=void 0,c={id:"utilities/mp4box",title:"mp4box",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/utilities/mp4box.mdx",sourceDirName:"utilities",slug:"/utilities/mp4box",permalink:"/docs/utilities/mp4box",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/mp4box.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"mp4box",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"dovi_tool",permalink:"/docs/utilities/dovi_tool"},next:{title:"hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool"}},u={},a=[];function d(t){const e={a:"a",admonition:"admonition",p:"p",...(0,n.a)(),...t.components};return(0,o.jsx)(e.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(e.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(e.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})}function l(t={}){const{wrapper:e}={...(0,n.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d(t)}},1151:(t,e,i)=>{i.d(e,{Z:()=>c,a:()=>r});var o=i(7294);const n={},s=o.createContext(n);function r(t){const e=o.useContext(s);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:r(t.components),o.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/ddf1125a.236bb914.js b/assets/js/ddf1125a.236bb914.js deleted file mode 100644 index 14ae8a7e7..000000000 --- a/assets/js/ddf1125a.236bb914.js +++ /dev/null @@ -1 +0,0 @@ -"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/e157395a.a251e735.js b/assets/js/e157395a.a251e735.js new file mode 100644 index 000000000..28c73e621 --- /dev/null +++ b/assets/js/e157395a.a251e735.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9672],{631:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var n=i(5893),t=i(1151);const o={label:"HEIC",sidebar_position:4},r="HEIC",c={id:"images/HEIC",title:"HEIC",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/HEIC.mdx",sourceDirName:"images",slug:"/images/HEIC",permalink:"/docs/images/HEIC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/HEIC.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"HEIC",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"GIF",permalink:"/docs/images/GIF"},next:{title:"WebP",permalink:"/docs/images/WebP"}},a={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2}];function l(e){const s={a:"a",admonition:"admonition",blockquote:"blockquote",em:"em",h1:"h1",h2:"h2",p:"p",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h1,{id:"heic",children:"HEIC"}),"\n",(0,n.jsx)(s.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(s.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(s.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(s.p,{children:["The HEIC image format, also known as the High Efficiency Image Format, is a newer image codec that was developed to provide improved compression and better performance compared to traditional image formats like ",(0,n.jsx)(s.a,{href:"/docs/images/JPEG",children:"JPEG"}),". HEIC files use ",(0,n.jsx)(s.a,{href:"/docs/video/HEVC",children:"HEVC"})," internally, meaning the format is not royalty free. While this has limited its adoption across the Web, this format is supported by many modern devices including the entire Apple ecosystem. iPhones shoot HDR HEIC photos by default by utilizing the iPhone's HEVC hardware video encoder to capture these images. Some Android phones are capable of shooting HEIC as well, but these are often transcoded from JPEG. HEIC has largely been surpassed by ",(0,n.jsx)(s.a,{href:"/docs/images/AVIF",children:"AVIF"}),", which uses the same container to store ",(0,n.jsx)(s.a,{href:"/docs/video/AV1",children:"AV1"}),"-compressed images."]}),"\n",(0,n.jsx)(s.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(s.p,{children:["Lossless? ",(0,n.jsx)(s.em,{children:"No"})]}),"\n",(0,n.jsxs)(s.p,{children:["Lossy? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(s.em,{children:"8 BPC, 10 BPC"})]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.em,{children:"Higher bit depths not widely supported"})}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Animation? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Transparency? ",(0,n.jsx)(s.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(s.p,{children:["Progressive Decode? ",(0,n.jsx)(s.em,{children:"No"})]}),"\n",(0,n.jsxs)(s.p,{children:["Royalty Free? ",(0,n.jsx)(s.em,{children:"No"})]})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,s,i)=>{i.d(s,{Z:()=>c,a:()=>r});var n=i(7294);const t={},o=n.createContext(t);function r(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e1a437f7.8d26d1f2.js b/assets/js/e1a437f7.8d26d1f2.js new file mode 100644 index 000000000..62bd8568b --- /dev/null +++ b/assets/js/e1a437f7.8d26d1f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8674],{5684:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>a,metadata:()=>r,toc:()=>d});var n=i(5893),o=i(1151);const a={label:"bzip2",sidebar_position:3},s="bzip2",r={id:"data/bzip2",title:"bzip2",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/bzip2.mdx",sourceDirName:"data",slug:"/data/bzip2",permalink:"/docs/data/bzip2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/bzip2.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{label:"bzip2",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"gzip",permalink:"/docs/data/gzip"},next:{title:"7-zip (7z)",permalink:"/docs/data/7z"}},c={},d=[];function u(t){const e={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.a)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"bzip2",children:"bzip2"}),"\n",(0,n.jsx)(e.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(e.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(e.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function p(t={}){const{wrapper:e}={...(0,o.a)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(u,{...t})}):u(t)}},1151:(t,e,i)=>{i.d(e,{Z:()=>r,a:()=>s});var n=i(7294);const o={},a=n.createContext(o);function s(t){const e=n.useContext(a);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:s(t.components),n.createElement(a.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/e641ee58.950a17e9.js b/assets/js/e641ee58.950a17e9.js new file mode 100644 index 000000000..ab6a4fd8d --- /dev/null +++ b/assets/js/e641ee58.950a17e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9788],{661:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var n=o(5893),i=o(1151);const s={label:"Speex",sidebar_position:6},r="Speex",a={id:"audio/Speex",title:"Speex",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/Speex.mdx",sourceDirName:"audio",slug:"/audio/Speex",permalink:"/docs/audio/Speex",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/Speex.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"Speex",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Vorbis",permalink:"/docs/audio/Vorbis"},next:{title:"FLAC",permalink:"/docs/audio/FLAC"}},c={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"speex",children:"Speex"}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(t.p,{children:["Speex is an open-source audio codec designed for speech. It has largely been replaced by ",(0,n.jsx)(t.a,{href:"/docs/audio/Opus",children:"Opus"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>r});var n=o(7294);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e6fe0126.963217ca.js b/assets/js/e6fe0126.773ede8d.js similarity index 83% rename from assets/js/e6fe0126.963217ca.js rename to assets/js/e6fe0126.773ede8d.js index 8b71c332b..20a5975d1 100644 --- a/assets/js/e6fe0126.963217ca.js +++ b/assets/js/e6fe0126.773ede8d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7777],{7033:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/blog/tags/image","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7777],{7033:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/blog/tags/image","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ec2b09d3.e06a1867.js b/assets/js/ec2b09d3.e06a1867.js deleted file mode 100644 index 418e2f99f..000000000 --- a/assets/js/ec2b09d3.e06a1867.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3416],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var i=n(7294);function o(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 i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=i.createContext({}),c=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),m=o,h=d["".concat(l,".").concat(m)]||d[m]||u[m]||r;return n?i.createElement(h,a(a({ref:t},p),{},{components:n})):i.createElement(h,a({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,a=new Array(r);a[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:o,a[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var i=n(7462),o=(n(7294),n(3905));const r={label:"SVT-AV1",sidebar_position:4},a="SVT-AV1",s={unversionedId:"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.",source:"@site/docs/encoders/SVT-AV1.md",sourceDirName:"encoders",slug:"/encoders/SVT-AV1",permalink:"/docs/encoders/SVT-AV1",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{label:"SVT-AV1",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"vpxenc",permalink:"/docs/encoders/vpxenc"},next:{title:"rav1e",permalink:"/docs/encoders/rav1e"}},l={},c=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Building",id:"building",level:2},{value:"(Linux/macOS)",id:"linuxmacos",level:3},{value:"Windows",id:"windows",level:3},{value:"Encoding",id:"encoding",level:2},{value:"Strengths",id:"strengths",level:3},{value:"Weaknesses",id:"weaknesses",level:3},{value:"Encoder Optimization",id:"encoder-optimization",level:3}],p={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,i.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"svt-av1"},"SVT-AV1"),(0,o.kt)("admonition",{title:"Under Maintenance",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The content in this entry is incomplete & is in the process of being completed.")),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,'This entry discusses the SVT-AV1 encoder, also known as the "Production" AV1 encoder (while ',(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/aomenc"},"aomenc"),' is the "reference" AV1 encoder), & refers to SVT-AV1 as such. SVT-AV1 is known for its parallelization, high coding efficiency, & active development. SVT-AV1 scales across multiple CPU cores much more effectively than aomenc or ',(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/rav1e"},"rav1e"),", so the use of tools like ",(0,o.kt)("a",{parentName:"p",href:"/docs/utilities/av1an"},"Av1an")," is less helpful."),(0,o.kt)("h2",{id:"ffmpeg"},"FFmpeg"),(0,o.kt)("p",null,"SVT-AV1 is available in FFmpeg via ",(0,o.kt)("inlineCode",{parentName:"p"},"libsvtav1"),", to check if you have it, run ",(0,o.kt)("inlineCode",{parentName:"p"},"ffmpeg -h encoder=libsvtav1"),". You can input non-FFmpeg standard SVT-AV1 parameters via ",(0,o.kt)("inlineCode",{parentName:"p"},"-svtav1-params"),"."),(0,o.kt)("h2",{id:"building"},"Building"),(0,o.kt)("h3",{id:"linuxmacos"},"(Linux/macOS)"),(0,o.kt)("p",null,"To build SVT-AV1 from source, clone the official SVT-AV1 repository from Gitlab & build from source."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh release\n")),(0,o.kt)("p",null,"If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,o.kt)("strong",{parentName:"p"},"Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,o.kt)("inlineCode",{parentName:"strong"},"/dev/shm")," for transcoding"),". You can compile statically linked SVT-AV1 with PGO by following this script:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n")),(0,o.kt)("p",null,"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n")),(0,o.kt)("h3",{id:"windows"},"Windows"),(0,o.kt)("p",null,"To be filled."),(0,o.kt)("h2",{id:"encoding"},"Encoding"),(0,o.kt)("h3",{id:"strengths"},"Strengths"),(0,o.kt)("p",null,"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."),(0,o.kt)("h3",{id:"weaknesses"},"Weaknesses"),(0,o.kt)("p",null,"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)."),(0,o.kt)("h3",{id:"encoder-optimization"},"Encoder Optimization"),(0,o.kt)("p",null,"Aside from build optimizations for speed, there is further tweaking to be done to the ",(0,o.kt)("inlineCode",{parentName:"p"},"SvtAv1EncApp")," binary parameters when encoding."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"--film-grain")," & ",(0,o.kt)("inlineCode",{parentName:"li"},"--film-grain-denoise"))),(0,o.kt)("p",null,"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 ",(0,o.kt)("inlineCode",{parentName:"p"},"--film-grain")," parameter to specify an amount of film grain to add to the encode (& ",(0,o.kt)("inlineCode",{parentName:"p"},"--film-grain-denoise")," to specify how to denoise the input video before encoding for potentially better appeal). Denoising a video always removes fine details, so sticking with just ",(0,o.kt)("inlineCode",{parentName:"p"},"--film-grain")," is recommended in most cases. According to ",(0,o.kt)("a",{parentName:"p",href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.md#practical-advice-on-grain-synthesis"},"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."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"--input-depth 10"))),(0,o.kt)("p",null,"10-bit output from AV1 encoding is always desirable for coding efficiency, even if your source is 8-bit."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"--tune 2"))),(0,o.kt)("p",null,"There are three tunes in SVT-AV1: Tune 1 is for ",(0,o.kt)("a",{parentName:"p",href:"/docs/metrics/PSNR"},"PSNR")," ",(0,o.kt)("a",{parentName:"p",href:"/docs/introduction/psychovisual"},"RDO"),", Tune 2 is for ",(0,o.kt)("a",{parentName:"p",href:"/docs/metrics/SSIM"},"SSIM")," RDO, & Tune 0 is a ",(0,o.kt)("a",{parentName:"p",href:"/docs/introduction/psychovisual"},"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"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"--enable-overlays 1"))),(0,o.kt)("p",null,"Enables overlay pictures to be used as additional reference frames for the referenced picture, disabled by default. Improves coding efficiency."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"--keyint [FPS*10]")," ")),(0,o.kt)("p",null,"Similar to ",(0,o.kt)("inlineCode",{parentName:"p"},"--kf-max-dist")," in ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/vpxenc"},"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."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"--irefresh-type 2"))),(0,o.kt)("p",null,"Intra refresh is specified through this option, & lets the user decide between Closed GOP & Open GOP. GOP stands for Group of Pictures. Open GOP allows GOPs to ",(0,o.kt)("a",{parentName:"p",href:"https://ottverse.com/closed-gop-open-gop-idr/"},"reference one another"),", but support for this feature is currently incomplete. Therefore, it is recommended to use Closed GOP for the time being via ",(0,o.kt)("inlineCode",{parentName:"p"},"--irefresh-type 2")," until this is rectified."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"--preset X"))),(0,o.kt)("p",null,"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."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"--crf X"))),(0,o.kt)("p",null,"CRF is the best way to target quality for optimal visual fidelity. VBR & CBR lose efficiency due to their inherently limited rate control."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ee513c31.12a3bd19.js b/assets/js/ee513c31.12a3bd19.js new file mode 100644 index 000000000..dcc5cd465 --- /dev/null +++ b/assets/js/ee513c31.12a3bd19.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2750],{6037:(i,e,o)=>{o.r(e),o.d(e,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>r,toc:()=>c});var t=o(5893),n=o(1151);const l={label:"dovi_tool",sidebar_position:6},s="dovi_tool",r={id:"utilities/dovi_tool",title:"dovi_tool",description:"dovi_tool is a command line tool written in Rust combining multiple utilities for working with Dolby Vision.",source:"@site/docs/utilities/dovi_tool.mdx",sourceDirName:"utilities",slug:"/utilities/dovi_tool",permalink:"/docs/utilities/dovi_tool",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/dovi_tool.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{label:"dovi_tool",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"NMKODER",permalink:"/docs/utilities/nmkoder"},next:{title:"mp4box",permalink:"/docs/utilities/mp4box"}},d={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function a(i){const e={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.a)(),...i.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(e.h1,{id:"dovi_tool",children:"dovi_tool"}),"\n",(0,t.jsxs)(e.p,{children:[(0,t.jsx)(e.strong,{children:"dovi_tool"})," is a command line tool written in Rust combining multiple utilities for working with Dolby Vision."]}),"\n",(0,t.jsx)(e.p,{children:"\xa0\xa0"}),"\n",(0,t.jsx)(e.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsxs)(e.li,{children:["Download pre-built binaries from ",(0,t.jsx)(e.a,{href:"https://github.com/quietvoid/dovi_tool/releases",children:"here"})]}),"\n"]}),"\n",(0,t.jsx)(e.p,{children:"or"}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsx)(e.li,{children:"Compile yourself (Rust must be installed, minimum v1.64.0 at the time of writing)"}),"\n"]}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,t.jsx)(e.p,{children:"on Windows:"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-bash",children:"git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})}),"\n",(0,t.jsx)(e.p,{children:"\xa0\xa0"}),"\n",(0,t.jsx)(e.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-bash",children:"dovi_tool [OPTIONS] \n"})}),"\n",(0,t.jsx)(e.p,{children:"To get more detailed options for a subcommand"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-bash",children:"dovi_tool --help\n"})})]})}function u(i={}){const{wrapper:e}={...(0,n.a)(),...i.components};return e?(0,t.jsx)(e,{...i,children:(0,t.jsx)(a,{...i})}):a(i)}},1151:(i,e,o)=>{o.d(e,{Z:()=>r,a:()=>s});var t=o(7294);const n={},l=t.createContext(n);function s(i){const e=t.useContext(l);return t.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function r(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(n):i.components||n:s(i.components),t.createElement(l.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee8c27e3.852c5536.js b/assets/js/ee8c27e3.852c5536.js new file mode 100644 index 000000000..045ed390b --- /dev/null +++ b/assets/js/ee8c27e3.852c5536.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7551],{3834:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=n(5893),i=n(1151);const s={label:"uvg266",sidebar_position:10},r="uvg266",c={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!",source:"@site/docs/encoders/uvg266.mdx",sourceDirName:"encoders",slug:"/encoders/uvg266",permalink:"/docs/encoders/uvg266",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/uvg266.mdx",tags:[],version:"current",sidebarPosition:10,frontMatter:{label:"uvg266",sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"VVenC",permalink:"/docs/encoders/VVenC"},next:{title:"VTM",permalink:"/docs/encoders/VTM"}},u={},a=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"uvg266",children:"uvg266"}),"\n",(0,o.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var o=n(7294);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee8ed51f.5168c63f.js b/assets/js/ee8ed51f.5168c63f.js new file mode 100644 index 000000000..6cd2f43ad --- /dev/null +++ b/assets/js/ee8ed51f.5168c63f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8358],{9197:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>m,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var n=i(5893),o=i(1151);const s={title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable.mdx",title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",formattedDate:"October 29, 2023",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.92,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],frontMatter:{title:"Embedding the Un-Embeddable: Dissecting discord.nfp.is, stolen.shoes & Others",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},d={authorsImageUrls:[void 0]},c=[{value:"A Scenario",id:"a-scenario",level:2}];function l(e){const t={h2:"h2",img:"img",p:"p",strong:"strong",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.img,{alt:"Feature image",src:i(5477).Z+"",width:"1920",height:"1080"}),"\n",(0,n.jsx)(t.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,n.jsx)(t.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,n.jsx)(t.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."})]})}function m(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},5477:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},1151:(e,t,i)=>{i.d(t,{Z:()=>r,a:()=>a});var n=i(7294);const o={},s=n.createContext(o);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f0f157d6.e3561a77.js b/assets/js/f0f157d6.67ef7454.js similarity index 54% rename from assets/js/f0f157d6.e3561a77.js rename to assets/js/f0f157d6.67ef7454.js index 11c6f045b..767634e27 100644 --- a/assets/js/f0f157d6.e3561a77.js +++ b/assets/js/f0f157d6.67ef7454.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3950],{1473:s=>{s.exports=JSON.parse('{"label":"discord","permalink":"/blog/tags/discord","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3950],{8680:s=>{s.exports=JSON.parse('{"label":"discord","permalink":"/blog/tags/discord","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/f4173e2a.249f1a0f.js b/assets/js/f4173e2a.249f1a0f.js deleted file mode 100644 index 92cff9a83..000000000 --- a/assets/js/f4173e2a.249f1a0f.js +++ /dev/null @@ -1 +0,0 @@ -"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/f4fea690.b480518b.js b/assets/js/f4fea690.b480518b.js new file mode 100644 index 000000000..2a4d12ddc --- /dev/null +++ b/assets/js/f4fea690.b480518b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8537],{2570:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=t(5893),i=t(1151);const r={label:"JM",sidebar_position:14},s="JM",c={id:"encoders/JM",title:"JM",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/encoders/JM.mdx",sourceDirName:"encoders",slug:"/encoders/JM",permalink:"/docs/encoders/JM",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/JM.mdx",tags:[],version:"current",sidebarPosition:14,frontMatter:{label:"JM",sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"HM",permalink:"/docs/encoders/HM"},next:{title:"SRT",permalink:"/docs/subtitles/SRT"}},d={},a=[];function u(e){const n={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"jm",children:"JM"}),"\n",(0,o.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(n.p,{children:["JM is the original ",(0,o.jsx)(n.a,{href:"/docs/video/AVC",children:"H.264"})," reference encoder, predating alternatives like ",(0,o.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"}),". In the modern day, it joins other MPEG reference encoders such as ",(0,o.jsx)(n.a,{href:"/docs/encoders/HM",children:"HM"})," & ",(0,o.jsx)(n.a,{href:"/docs/encoders/VTM",children:"VTM"})," in their reputations for being highly niche offerings that are used rarely due to their usage complexity & speed disadvantages. x264 is more efficient than JM."]})]})}function l(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(7294);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f594c766.1a311c3d.js b/assets/js/f594c766.1a311c3d.js deleted file mode 100644 index 54998d1b8..000000000 --- a/assets/js/f594c766.1a311c3d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8606],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,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 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",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,l=c(e,["components","mdxType","originalType","parentName"]),u=p(r),f=o,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||i;return r?n.createElement(m,a(a({ref:t},l),{},{components:r})):n.createElement(m,a({ref:t},l))}));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 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:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={label:"JM",sidebar_position:14},a="JM",c={unversionedId:"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!",source:"@site/docs/encoders/JM.md",sourceDirName:"encoders",slug:"/encoders/JM",permalink:"/docs/encoders/JM",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/JM.md",tags:[],version:"current",sidebarPosition:14,frontMatter:{label:"JM",sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"HM",permalink:"/docs/encoders/HM"},next:{title:"SRT",permalink:"/docs/subtitles/SRT"}},s={},p=[],l={toc:p},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:"jm"},"JM"),(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,"JM is the original ",(0,o.kt)("a",{parentName:"p",href:"/docs/video/AVC"},"H.264")," reference encoder, predating alternatives like ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/x264"},"x264"),". In the modern day, it joins other MPEG reference encoders such as ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/HM"},"HM")," & ",(0,o.kt)("a",{parentName:"p",href:"/docs/encoders/VTM"},"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."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f9208490.615a7833.js b/assets/js/f9208490.615a7833.js new file mode 100644 index 000000000..b60a89b68 --- /dev/null +++ b/assets/js/f9208490.615a7833.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[615],{6943:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var i=n(5893),s=n(1151);const o={label:"hdr10plus_tool",sidebar_position:7},l="hdr10plus_tool",r={id:"utilities/hdr10plus_tool",title:"hdr10plus_tool",description:"hdr10plus_tool is a command line tool written in Rust for working with HDR10+ in HEVC files. Previously named `hdr10plus_parser`, now it's more than just a parser.",source:"@site/docs/utilities/hdr10plus_tool.mdx",sourceDirName:"utilities",slug:"/utilities/hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/hdr10plus_tool.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{label:"hdr10plus_tool",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"mp4box",permalink:"/docs/utilities/mp4box"},next:{title:"eac3to",permalink:"/docs/utilities/eac3to"}},a={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Extracting",id:"extracting",level:3},{value:"Injecting",id:"injecting",level:3},{value:"Remove HDR10+ Metadata",id:"remove-hdr10-metadata",level:3}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"hdr10plus_tool",children:"hdr10plus_tool"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"hdr10plus_tool"})," is a command line tool written in Rust for working with HDR10+ in HEVC files. Previously named ",(0,i.jsx)(t.code,{children:"hdr10plus_parser"}),", now it's more than just a parser."]}),"\n",(0,i.jsx)(t.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Download pre-built binaries from ",(0,i.jsx)(t.a,{href:"https://github.com/quietvoid/hdr10plus_tool/releases",children:"here"})]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"or"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Compile yourself (Rust must be installed, minimum v1.57.0 at the time of writing)"}),"\n"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,i.jsx)(t.p,{children:"on Windows:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})}),"\n",(0,i.jsx)(t.p,{children:"\xa0\xa0"}),"\n",(0,i.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"hdr10plus_tool [OPTIONS] \n"})}),"\n",(0,i.jsx)(t.p,{children:"To get more detailed options for a subcommand"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"hdr10plus_tool --help\n"})}),"\n",(0,i.jsx)(t.h3,{id:"extracting",children:"Extracting"}),"\n",(0,i.jsx)(t.p,{children:"Extract from raw bitstream"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"hdr10plus_tool extract video.hevc -o metadata.json\n"})}),"\n",(0,i.jsx)(t.p,{children:"Extract using FFmpeg pipe (Recommended)"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool extract -o metadata.json -\n"})}),"\n",(0,i.jsx)(t.h3,{id:"injecting",children:"Injecting"}),"\n",(0,i.jsx)(t.p,{children:"Inject to raw bitstream"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"hdr10plus_tool inject -i video.hevc -j metadata.json -o injected_output.hevc\n"})}),"\n",(0,i.jsx)(t.h3,{id:"remove-hdr10-metadata",children:"Remove HDR10+ Metadata"}),"\n",(0,i.jsx)(t.p,{children:"Remove from raw bitstream"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"hdr10plus_tool remove video.hevc -o hdr10plus_removed_output.hevc\n"})}),"\n",(0,i.jsx)(t.p,{children:"Remove using FFmpeg pipe (Recommended)"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool remove -\n"})})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>l});var i=n(7294);const s={},o=i.createContext(s);function l(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f98cc194.2df28fed.js b/assets/js/f98cc194.2df28fed.js deleted file mode 100644 index 8a5c0e576..000000000 --- a/assets/js/f98cc194.2df28fed.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2902],{3905:(t,e,i)=>{i.d(e,{Zo:()=>m,kt:()=>g});var o=i(7294);function a(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,o)}return i}function n(t){for(var e=1;e=0||(a[i]=t[i]);return a}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(t,i)&&(a[i]=t[i])}return a}var c=o.createContext({}),l=function(t){var e=o.useContext(c),i=e;return t&&(i="function"==typeof t?t(e):n(n({},e),t)),i},m=function(t){var e=l(t.components);return o.createElement(c.Provider,{value:e},t.children)},u="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return o.createElement(o.Fragment,{},e)}},h=o.forwardRef((function(t,e){var i=t.components,a=t.mdxType,r=t.originalType,c=t.parentName,m=s(t,["components","mdxType","originalType","parentName"]),u=l(i),h=a,g=u["".concat(c,".").concat(h)]||u[h]||d[h]||r;return i?o.createElement(g,n(n({ref:e},m),{},{components:i})):o.createElement(g,n({ref:e},m))}));function g(t,e){var i=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var r=i.length,n=new Array(r);n[0]=h;var s={};for(var c in e)hasOwnProperty.call(e,c)&&(s[c]=e[c]);s.originalType=t,s[u]="string"==typeof t?t:a,n[1]=s;for(var l=2;l{i.r(e),i.d(e,{assets:()=>c,contentTitle:()=>n,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var o=i(7462),a=(i(7294),i(3905));const r={sidebar_position:4},n="Spotting Video Artifacts",s={unversionedId:"introduction/video-artifacts",id:"introduction/video-artifacts",title:"Spotting Video Artifacts",description:"https://xkcd.com/2414",source:"@site/docs/introduction/video-artifacts.md",sourceDirName:"introduction",slug:"/introduction/video-artifacts",permalink:"/docs/introduction/video-artifacts",draft:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/introduction/video-artifacts.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Terminology",permalink:"/docs/introduction/terminology"},next:{title:"Psycho-visual",permalink:"/docs/introduction/psychovisual"}},c={},l=[{value:"Moir\xe9 Pattern",id:"moir\xe9-pattern",level:2},{value:"Staircase Effect",id:"staircase-effect",level:2},{value:"Color Bleed",id:"color-bleed",level:2},{value:"Ringing",id:"ringing",level:2},{value:"Blocking",id:"blocking",level:2},{value:"Banding/Contouring",id:"bandingcontouring",level:2},{value:"Mosquito Noise",id:"mosquito-noise",level:2}],m={toc:l},u="wrapper";function d(t){let{components:e,...i}=t;return(0,a.kt)(u,(0,o.Z)({},m,i,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"spotting-video-artifacts"},"Spotting Video Artifacts"),(0,a.kt)("picture",null,(0,a.kt)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/solar_system_compression_artifacts_2x.avif",type:"image/avif"}),(0,a.kt)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/solar_system_compression_artifacts_2x.png",alt:"XKCD about compression artifacts",width:"659",height:"540"})),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},(0,a.kt)("a",{parentName:"em",href:"https://xkcd.com/2414"},"https://xkcd.com/2414"))),(0,a.kt)("p",null,"Video artifacts are visual distortions or anomalies that appear in a video, which can affect the quality of the image. Artifacts are first categorized by whether they\u2019re time/sequence-based (temporal) or location-based (spatial). If you can see the artifact when the video is paused, then it\u2019s probably a spatial artifact. If it\u2019s much more visible while the video plays, then it\u2019s likely temporal."),(0,a.kt)("h2",{id:"moir\xe9-pattern"},"Moir\xe9 Pattern"),(0,a.kt)("picture",null,(0,a.kt)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/moire-pattern.jxl",type:"image/jxl"}),(0,a.kt)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/moire-pattern.jpeg",alt:"Moir\xe9 pattern on a brick building",width:"205",height:"250"})),(0,a.kt)("p",null,"Moir\xe9 patterns are large-scale spatial interference pattern produced when a pattern in the source image and the manner in which the encoder operates are slightly out of alignment spatially. The artifacts generated by the encoder then introduce strange, swirling effects in the source image's pattern upon decoding. and"),(0,a.kt)("h2",{id:"staircase-effect"},"Staircase Effect"),(0,a.kt)("picture",null,(0,a.kt)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/staircase-effect.jxl",type:"image/jxl"}),(0,a.kt)("img",{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/staircase-effect.jpeg",alt:"Staircase Effect",width:"452",height:"548",loading:"lazy"})),(0,a.kt)("p",null,'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.'),(0,a.kt)("h2",{id:"color-bleed"},"Color Bleed"),(0,a.kt)("picture",null,(0,a.kt)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/color-bleed.jxl",type:"image/jxl"}),(0,a.kt)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/color-bleed.jpeg",alt:"Color Bleed",width:"624",height:"276",loading:"lazy"})),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"ringing"},"Ringing"),(0,a.kt)("picture",null,(0,a.kt)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/ringing-artifact.jxl",type:"image/jxl"}),(0,a.kt)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/ringing-artifact.jpeg",alt:"Ringing artifact on a star symbol",width:"684",height:"599",loading:"lazy"})),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"blocking"},"Blocking"),(0,a.kt)("picture",null,(0,a.kt)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/blocking_on_cat.jxl",type:"image/jxl"}),(0,a.kt)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/blocking_on_cat.jpeg",alt:"Blocking artifacts on a cat",loading:"lazy"})),(0,a.kt)("p",null,'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.'),(0,a.kt)("p",null,'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.'),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"bandingcontouring"},"Banding/Contouring"),(0,a.kt)("picture",null,(0,a.kt)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/colorbanding_ex1.jxl",type:"image/jxl"}),(0,a.kt)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/colorbanding_ex1.jpeg",alt:"Banding",width:"418",height:"303",loading:"lazy"})),(0,a.kt)("p",null,"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."),(0,a.kt)("h2",{id:"mosquito-noise"},"Mosquito Noise"),(0,a.kt)("picture",null,(0,a.kt)("source",{srcset:"https://github.com/av1-community-contributors/images/raw/main/mosquito-noise.jxl",type:"image/jxl"}),(0,a.kt)("img",{src:"https://github.com/av1-community-contributors/images/raw/main/mosquito-noise.jpeg",alt:"Mosquito noise surrounding an iron fence",width:"505",height:"353",loading:"lazy"})),(0,a.kt)("p",null,"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."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.8d8b5d38.js b/assets/js/main.8d8b5d38.js new file mode 100644 index 000000000..605078904 --- /dev/null +++ b/assets/js/main.8d8b5d38.js @@ -0,0 +1,2 @@ +/*! For license information please see main.8d8b5d38.js.LICENSE.txt */ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(7294);var r=n(8356),o=n.n(r),a=n(6887);const i={"0092d9fd":[()=>n.e(2522).then(n.bind(n,6523)),"@site/docs/audio/FLAC.mdx",6523],"015d9d66":[()=>n.e(8172).then(n.bind(n,7521)),"@site/docs/metrics/PSNR.mdx",7521],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"03af419f":[()=>n.e(8600).then(n.bind(n,9255)),"@site/docs/encoders/VVenC.mdx",9255],"03e95fdf":[()=>n.e(4019).then(n.bind(n,2971)),"@site/docs/video/VP8.mdx",2971],"059e36ab":[()=>n.e(3110).then(n.bind(n,6277)),"@site/docs/video/utvideo.mdx",6277],"06ed4e86":[()=>n.e(1932).then(n.bind(n,6407)),"@site/docs/audio/Dolby.mdx",6407],"09bc817a":[()=>n.e(49).then(n.bind(n,4720)),"@site/docs/audio/Opus.mdx",4720],"0b185270":[()=>n.e(4885).then(n.bind(n,7394)),"@site/docs/FAQ.mdx",7394],"0e7f53a8":[()=>n.e(7635).then(n.bind(n,4667)),"@site/docs/images/PNG.mdx",4667],"112763a5":[()=>n.e(7767).then(n.bind(n,1825)),"@site/docs/terms-of-use.mdx",1825],"12b076f3":[()=>n.e(9888).then(n.bind(n,3097)),"@site/docs/data/zstd.mdx",3097],17896441:[()=>Promise.all([n.e(532),n.e(2459),n.e(7918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"180751f5":[()=>n.e(6627).then(n.t.bind(n,1438,19)),"~blog/default/blog-tags-image-bfd-list.json",1438],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,1473)),"@theme/SearchPage",1473],"1b67d0f3":[()=>n.e(9625).then(n.bind(n,3385)),"@site/docs/data/gzip.mdx",3385],"1ec3ce74":[()=>n.e(2523).then(n.bind(n,224)),"@site/docs/encoders/rav1e.mdx",224],"1f227c78":[()=>n.e(657).then(n.bind(n,4793)),"@site/docs/filtering/detelecine.mdx",4793],"1f391b9e":[()=>Promise.all([n.e(532),n.e(2459),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"202a438d":[()=>n.e(7418).then(n.t.bind(n,2776,19)),"/Users/giannim2/git-cloning/codec-wiki/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",2776],"229f7513":[()=>n.e(8168).then(n.bind(n,5235)),"@site/docs/subtitles/webvtt.mdx",5235],"239a6b34":[()=>n.e(6643).then(n.t.bind(n,3769,19)),"/Users/giannim2/git-cloning/codec-wiki/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"28bd9d7a":[()=>n.e(4202).then(n.bind(n,2796)),"@site/docs/utilities/FFMetrics.mdx",2796],"299beccc":[()=>n.e(3536).then(n.bind(n,3524)),"@site/docs/data/7z.mdx",3524],"318608aa":[()=>n.e(3248).then(n.bind(n,1440)),"@site/docs/encoders/vpxenc.mdx",1440],"319244b6":[()=>n.e(1221).then(n.t.bind(n,9742,19)),"~blog/default/blog-tags-compression-c1f.json",9742],32987299:[()=>n.e(2667).then(n.bind(n,2278)),"@site/docs/filtering/vapoursynth.mdx",2278],"345ef4f9":[()=>n.e(5383).then(n.bind(n,1942)),"@site/docs/utilities/MKVToolNix.mdx",1942],39634027:[()=>n.e(4100).then(n.t.bind(n,5745,19)),"/Users/giannim2/git-cloning/codec-wiki/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"3d6cf458":[()=>n.e(6823).then(n.bind(n,6164)),"@site/docs/video/VC-1.mdx",6164],"44e37655":[()=>n.e(5897).then(n.bind(n,4319)),"@site/docs/metrics/SSIMULACRA2.mdx",4319],"49b64d14":[()=>n.e(4931).then(n.bind(n,9530)),"@site/docs/encoders/SVT-AV1.mdx",9530],"4c678320":[()=>n.e(3134).then(n.bind(n,4518)),"@site/src/pages/markdown-page.mdx",4518],"54a9c2bb":[()=>n.e(6027).then(n.bind(n,4239)),"@site/docs/utilities/YUView.mdx",4239],56786013:[()=>n.e(6647).then(n.bind(n,3495)),"@site/docs/images/JPEG.mdx",3495],"5b209502":[()=>n.e(977).then(n.bind(n,5665)),"@site/docs/filtering/deinterlace.mdx",5665],"5d1a7e8b":[()=>n.e(4723).then(n.bind(n,225)),"@site/docs/video-players.mdx",225],"5db6705b":[()=>n.e(9716).then(n.bind(n,2815)),"@site/docs/utilities/nmkoder.mdx",2815],"5e069031":[()=>n.e(3594).then(n.bind(n,1628)),"@site/docs/introduction/prologue.mdx",1628],"5e1194df":[()=>n.e(2962).then(n.bind(n,882)),"@site/docs/data/zpaq.mdx",882],"5e95c892":[()=>n.e(9661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5f74c797":[()=>Promise.all([n.e(532),n.e(7456)]).then(n.bind(n,1531)),"@site/docs/utilities/av1an.mdx",1531],"60d0076e":[()=>n.e(4040).then(n.bind(n,3365)),"@site/docs/filtering/intro.mdx",3365],"632d0ef1":[()=>n.e(1979).then(n.bind(n,2233)),"@site/docs/encoders/VTM.mdx",2233],"6549b2b5":[()=>n.e(7198).then(n.bind(n,4461)),"@site/blog/2023-07-21-site-optimization.mdx",4461],"6875c492":[()=>Promise.all([n.e(532),n.e(2459),n.e(9677),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"6bf0f114":[()=>n.e(6838).then(n.bind(n,6985)),"@site/docs/data/zip.mdx",6985],"6c179ac5":[()=>n.e(5332).then(n.bind(n,6276)),"@site/docs/video/Theora.mdx",6276],"6d85920a":[()=>n.e(4329).then(n.bind(n,2313)),"@site/docs/introduction/terminology.mdx",2313],"7385c97b":[()=>n.e(4929).then(n.bind(n,7885)),"@site/docs/images/AVIF.mdx",7885],74450489:[()=>n.e(489).then(n.t.bind(n,9159,19)),"~blog/default/blog-tags-web-0e7.json",9159],"76096a15":[()=>n.e(2630).then(n.bind(n,4115)),"@site/docs/subtitles/SRT.mdx",4115],"7d044f50":[()=>n.e(2565).then(n.t.bind(n,6704,19)),"~blog/default/blog-tags-video-835-list.json",6704],"7d09a242":[()=>n.e(9918).then(n.bind(n,1147)),"@site/docs/encoders/aomenc.mdx",1147],"7ec778da":[()=>n.e(9112).then(n.t.bind(n,3759,19)),"~blog/default/blog-tags-video-835.json",3759],"7eff0f1a":[()=>n.e(3460).then(n.bind(n,5041)),"@site/docs/video/AVC.mdx",5041],"7f76a12e":[()=>n.e(8117).then(n.bind(n,1651)),"@site/blog/2023-09-03-av1-for-dummies.mdx",1651],"7fa695a7":[()=>n.e(5615).then(n.bind(n,4596)),"@site/docs/images/GIF.mdx",4596],80447496:[()=>n.e(6465).then(n.bind(n,4286)),"@site/docs/video/VVC.mdx",4286],"80bfa96b":[()=>n.e(7924).then(n.bind(n,7746)),"@site/docs/resources.mdx",7746],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],81739261:[()=>n.e(1514).then(n.bind(n,3276)),"@site/docs/video/prores.mdx",3276],"83732ada":[()=>n.e(7911).then(n.bind(n,3489)),"@site/docs/video/HEVC.mdx",3489],"842a7beb":[()=>n.e(8506).then(n.bind(n,9546)),"@site/docs/utilities/rAV1ator.mdx",9546],"84e198a2":[()=>n.e(5385).then(n.bind(n,1161)),"@site/docs/utilities/eac3to.mdx",1161],"86ba2311":[()=>n.e(4093).then(n.bind(n,5029)),"@site/docs/video/VP9.mdx",5029],"8a894f7b":[()=>n.e(5180).then(n.bind(n,4022)),"@site/docs/introduction/video-artifacts.mdx",4022],"8aacd032":[()=>n.e(7471).then(n.bind(n,2872)),"@site/docs/video/AV1.mdx",2872],"8bdabb45":[()=>n.e(1353).then(n.bind(n,4458)),"@site/docs/encoders/AVM.mdx",4458],"8eb2df80":[()=>Promise.all([n.e(532),n.e(1730)]).then(n.bind(n,3574)),"@site/docs/utilities/rav1ator-cli.mdx",3574],"9060e84a":[()=>n.e(6885).then(n.bind(n,985)),"@site/docs/encoders/HM.mdx",985],"90aedb84":[()=>n.e(6827).then(n.bind(n,8567)),"@site/docs/introduction/psychovisual.mdx",8567],"915a111c":[()=>n.e(1360).then(n.bind(n,797)),"@site/docs/filtering/dehalo.mdx",797],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"998d107e":[()=>n.e(373).then(n.bind(n,6488)),"@site/docs/video/FFV1.mdx",6488],"99c26446":[()=>n.e(5265).then(n.bind(n,7644)),"@site/docs/metrics/butteraugli.mdx",7644],"9b6fb453":[()=>n.e(130).then(n.t.bind(n,4469,19)),"/Users/giannim2/git-cloning/codec-wiki/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],"9c171e5c":[()=>n.e(7142).then(n.bind(n,7766)),"@site/docs/metrics/SSIM.mdx",7766],"9cae5962":[()=>n.e(1557).then(n.bind(n,5190)),"@site/docs/images/JXL.mdx",5190],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9efd8a4a":[()=>n.e(638).then(n.bind(n,9792)),"@site/docs/images/WebP.mdx",9792],"9f640ee8":[()=>n.e(5152).then(n.bind(n,9169)),"@site/docs/encoders/Aurora1.mdx",9169],"9f709603":[()=>n.e(6865).then(n.bind(n,4345)),"@site/docs/filtering/deband.mdx",4345],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(2459),n.e(9677),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a8f610c9:[()=>n.e(7599).then(n.bind(n,859)),"@site/docs/data/brotli.mdx",859],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],afe5e22f:[()=>n.e(4380).then(n.bind(n,9114)),"@site/docs/encoders/x265.mdx",9114],b0535000:[()=>n.e(1491).then(n.bind(n,5282)),"@site/blog/2023-07-21-site-optimization.mdx?truncated=true",5282],b059735e:[()=>n.e(5893).then(n.t.bind(n,7288,19)),"~blog/default/blog-tags-web-0e7-list.json",7288],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b4030b4d:[()=>n.e(6766).then(n.bind(n,7606)),"@site/docs/utilities/Aviator.mdx",7606],b4bbde8e:[()=>n.e(6037).then(n.bind(n,6823)),"@site/docs/audio/AAC.mdx",6823],b59b8cf7:[()=>n.e(3562).then(n.bind(n,824)),"@site/docs/audio/Vorbis.mdx",824],b8af02bf:[()=>n.e(3679).then(n.bind(n,3914)),"@site/docs/images/JPEG2000.mdx",3914],bd173b27:[()=>n.e(9134).then(n.bind(n,1230)),"@site/docs/data/xz.mdx",1230],be236901:[()=>n.e(8261).then(n.bind(n,2016)),"@site/docs/contribution-guide.mdx",2016],bf9d09b6:[()=>n.e(4953).then(n.bind(n,5471)),"@site/docs/encoders/SVT-HEVC.mdx",5471],c224274c:[()=>n.e(7764).then(n.bind(n,8402)),"@site/docs/video/AVS3.mdx",8402],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,9294)),"@site/src/pages/index.js",9294],c7deb2e0:[()=>n.e(6855).then(n.bind(n,1705)),"@site/docs/audio/WavPack.mdx",1705],c92fe796:[()=>n.e(268).then(n.bind(n,825)),"@site/docs/utilities/ffmpeg.mdx",825],c943a24a:[()=>n.e(665).then(n.bind(n,7142)),"@site/docs/introduction/high-dynamic-range.mdx",7142],ccc49370:[()=>Promise.all([n.e(532),n.e(2459),n.e(9677),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],cce09ffa:[()=>n.e(8475).then(n.bind(n,1932)),"@site/blog/2023-09-03-av1-for-dummies.mdx?truncated=true",1932],cd6cf5b7:[()=>n.e(4685).then(n.bind(n,7518)),"@site/docs/encoders/SVT-VP9.mdx",7518],ce98a713:[()=>n.e(8220).then(n.bind(n,6541)),"@site/docs/filtering/denoise.mdx",6541],cf7588c6:[()=>n.e(9079).then(n.bind(n,230)),"@site/docs/encoders/x264.mdx",230],d1becb09:[()=>n.e(2518).then(n.bind(n,4100)),"@site/docs/privacy-policy.mdx",4100],d5ab79da:[()=>n.e(8473).then(n.bind(n,324)),"@site/docs/audio/MP3.mdx",324],d5f89569:[()=>n.e(2570).then(n.bind(n,9956)),"@site/docs/encoders/Kvazaar.mdx",9956],d6535278:[()=>n.e(8080).then(n.bind(n,1019)),"@site/docs/metrics/VMAF.mdx",1019],dc798dbd:[()=>n.e(4750).then(n.bind(n,8951)),"@site/blog/2023-10-29-embedding-the-un-embeddable.mdx",8951],ddce1156:[()=>n.e(5966).then(n.bind(n,915)),"@site/docs/utilities/mp4box.mdx",915],e157395a:[()=>n.e(9672).then(n.bind(n,631)),"@site/docs/images/HEIC.mdx",631],e1a437f7:[()=>n.e(8674).then(n.bind(n,5684)),"@site/docs/data/bzip2.mdx",5684],e641ee58:[()=>n.e(9788).then(n.bind(n,661)),"@site/docs/audio/Speex.mdx",661],e6fe0126:[()=>n.e(7777).then(n.t.bind(n,7033,19)),"~blog/default/blog-tags-image-bfd.json",7033],e80106d6:[()=>n.e(3686).then(n.t.bind(n,5812,19)),"~blog/default/blog-tags-compression-c1f-list.json",5812],ee513c31:[()=>n.e(2750).then(n.bind(n,6037)),"@site/docs/utilities/dovi_tool.mdx",6037],ee8c27e3:[()=>n.e(7551).then(n.bind(n,3834)),"@site/docs/encoders/uvg266.mdx",3834],ee8ed51f:[()=>n.e(8358).then(n.bind(n,9197)),"@site/blog/2023-10-29-embedding-the-un-embeddable.mdx?truncated=true",9197],f0f157d6:[()=>n.e(3950).then(n.t.bind(n,8680,19)),"~blog/default/blog-tags-discord-ee6.json",8680],f4fea690:[()=>n.e(8537).then(n.bind(n,2570)),"@site/docs/encoders/JM.mdx",2570],f9208490:[()=>n.e(615).then(n.bind(n,6943)),"@site/docs/utilities/hdr10plus_tool.mdx",6943],fdae8881:[()=>n.e(1361).then(n.t.bind(n,7962,19)),"~blog/default/blog-tags-discord-ee6-list.json",7962]};var s=n(5893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(9670),u=n(226);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(1772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],h=(0,c.Z)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,s.jsx)(u.z,{value:i,children:(0,s.jsx)(a,{...o,...n})})}})}const p=[{path:"/blog",component:d("/blog","da1"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","6b5"),exact:!0},{path:"/blog/av1-encoding-for-dummies",component:d("/blog/av1-encoding-for-dummies","ab0"),exact:!0},{path:"/blog/embedding-the-un-embeddable",component:d("/blog/embedding-the-un-embeddable","251"),exact:!0},{path:"/blog/site-optimization",component:d("/blog/site-optimization","2d1"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","b03"),exact:!0},{path:"/blog/tags/compression",component:d("/blog/tags/compression","5b1"),exact:!0},{path:"/blog/tags/discord",component:d("/blog/tags/discord","1b9"),exact:!0},{path:"/blog/tags/image",component:d("/blog/tags/image","4fc"),exact:!0},{path:"/blog/tags/video",component:d("/blog/tags/video","4ae"),exact:!0},{path:"/blog/tags/web",component:d("/blog/tags/web","ef7"),exact:!0},{path:"/markdown-page",component:d("/markdown-page","7f5"),exact:!0},{path:"/search",component:d("/search","1b3"),exact:!0},{path:"/docs",component:d("/docs","6cd"),routes:[{path:"/docs",component:d("/docs","700"),routes:[{path:"/docs",component:d("/docs","0b2"),routes:[{path:"/docs/audio/AAC",component:d("/docs/audio/AAC","c8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Dolby",component:d("/docs/audio/Dolby","012"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/FLAC",component:d("/docs/audio/FLAC","778"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/MP3",component:d("/docs/audio/MP3","a00"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Opus",component:d("/docs/audio/Opus","4a4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Speex",component:d("/docs/audio/Speex","f33"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Vorbis",component:d("/docs/audio/Vorbis","551"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/WavPack",component:d("/docs/audio/WavPack","7a9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/contribution-guide",component:d("/docs/contribution-guide","f68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/7z",component:d("/docs/data/7z","a28"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/brotli",component:d("/docs/data/brotli","880"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/bzip2",component:d("/docs/data/bzip2","d8c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/gzip",component:d("/docs/data/gzip","6c7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/xz",component:d("/docs/data/xz","f6d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zip",component:d("/docs/data/zip","147"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zpaq",component:d("/docs/data/zpaq","a95"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zstd",component:d("/docs/data/zstd","68c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/aomenc",component:d("/docs/encoders/aomenc","1bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Aurora1",component:d("/docs/encoders/Aurora1","eab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/AVM",component:d("/docs/encoders/AVM","99a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/HM",component:d("/docs/encoders/HM","bc8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/JM",component:d("/docs/encoders/JM","c46"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Kvazaar",component:d("/docs/encoders/Kvazaar","b60"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/rav1e",component:d("/docs/encoders/rav1e","5b6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-AV1",component:d("/docs/encoders/SVT-AV1","745"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-HEVC",component:d("/docs/encoders/SVT-HEVC","682"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-VP9",component:d("/docs/encoders/SVT-VP9","377"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/uvg266",component:d("/docs/encoders/uvg266","e02"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/vpxenc",component:d("/docs/encoders/vpxenc","a70"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VTM",component:d("/docs/encoders/VTM","c68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VVenC",component:d("/docs/encoders/VVenC","a62"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x264",component:d("/docs/encoders/x264","757"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x265",component:d("/docs/encoders/x265","4de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/FAQ",component:d("/docs/FAQ","34e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deband",component:d("/docs/filtering/deband","c16"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/dehalo",component:d("/docs/filtering/dehalo","7a7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deinterlace",component:d("/docs/filtering/deinterlace","c37"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/denoise",component:d("/docs/filtering/denoise","0dd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/detelecine",component:d("/docs/filtering/detelecine","7b2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/intro",component:d("/docs/filtering/intro","d45"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/vapoursynth",component:d("/docs/filtering/vapoursynth","934"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/AVIF",component:d("/docs/images/AVIF","75f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/GIF",component:d("/docs/images/GIF","631"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/HEIC",component:d("/docs/images/HEIC","8a7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG",component:d("/docs/images/JPEG","835"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG2000",component:d("/docs/images/JPEG2000","f1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JXL",component:d("/docs/images/JXL","8be"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/PNG",component:d("/docs/images/PNG","1a2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/WebP",component:d("/docs/images/WebP","c1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/high-dynamic-range",component:d("/docs/introduction/high-dynamic-range","aa6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/prologue",component:d("/docs/introduction/prologue","0d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/psychovisual",component:d("/docs/introduction/psychovisual","9ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/terminology",component:d("/docs/introduction/terminology","2f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/video-artifacts",component:d("/docs/introduction/video-artifacts","ec6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/butteraugli",component:d("/docs/metrics/butteraugli","be4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/PSNR",component:d("/docs/metrics/PSNR","a9b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIM",component:d("/docs/metrics/SSIM","8d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIMULACRA2",component:d("/docs/metrics/SSIMULACRA2","f6e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/VMAF",component:d("/docs/metrics/VMAF","2f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/privacy-policy",component:d("/docs/privacy-policy","d17"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/resources",component:d("/docs/resources","0df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/SRT",component:d("/docs/subtitles/SRT","675"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/webvtt",component:d("/docs/subtitles/webvtt","32b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/terms-of-use",component:d("/docs/terms-of-use","ebf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/av1an",component:d("/docs/utilities/av1an","76e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/Aviator",component:d("/docs/utilities/Aviator","3f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/dovi_tool",component:d("/docs/utilities/dovi_tool","8b6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/eac3to",component:d("/docs/utilities/eac3to","ea0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/FFMetrics",component:d("/docs/utilities/FFMetrics","b7c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/ffmpeg",component:d("/docs/utilities/ffmpeg","1a9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/hdr10plus_tool",component:d("/docs/utilities/hdr10plus_tool","bf3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/MKVToolNix",component:d("/docs/utilities/MKVToolNix","e34"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/mp4box",component:d("/docs/utilities/mp4box","2ab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/nmkoder",component:d("/docs/utilities/nmkoder","b3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rAV1ator",component:d("/docs/utilities/rAV1ator","b37"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rav1ator-cli",component:d("/docs/utilities/rav1ator-cli","c9d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/YUView",component:d("/docs/utilities/YUView","5c3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video-players",component:d("/docs/video-players","82e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AV1",component:d("/docs/video/AV1","489"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVC",component:d("/docs/video/AVC","33b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVS3",component:d("/docs/video/AVS3","e42"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/FFV1",component:d("/docs/video/FFV1","b01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/HEVC",component:d("/docs/video/HEVC","2f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/prores",component:d("/docs/video/prores","334"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/Theora",component:d("/docs/video/Theora","943"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/utvideo",component:d("/docs/video/utvideo","817"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VC-1",component:d("/docs/video/VC-1","df7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP8",component:d("/docs/video/VP8","302"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP9",component:d("/docs/video/VP9","711"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VVC",component:d("/docs/video/VVC","a3a"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","231"),exact:!0},{path:"*",component:d("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),o=n(745),a=n(3727),i=n(405),s=n(412);const l=[n(2497),n(3310),n(8320),n(2295),n(8269)];var c=n(723),u=n(6550),d=n(8790),p=n(5893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var h=n(5742),m=n(2263),g=n(4996),b=n(6668),y=n(1944),v=n(4711),x=n(9727),w=n(3320),k=n(8780),S=n(197);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.Z)(),r=(0,v.l)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(h.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.Z)(),{pathname:r}=(0,u.TH)();return e+(0,k.applyTrailingSlash)((0,g.Z)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(h.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{metadata:t,image:n}=(0,b.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(h.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:x.h})]}),n&&(0,p.jsx)(y.d,{image:n}),(0,p.jsx)(_,{}),(0,p.jsx)(E,{}),(0,p.jsx)(S.Z,{tag:w.HX,locale:e}),(0,p.jsx)(h.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),P=n(8940),N=n(469);function O(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,N.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),O("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class j extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?O("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=O("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),I(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(R,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.AW,{location:t,render:()=>e})})}}const F=j,M="__docusaurus-base-url-issue-banner-container",z="__docusaurus-base-url-issue-banner",D="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

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

\n

We suggest trying baseUrl =

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